2012-02-23 121 views
11

我得到這個類:在特定路徑(文件夾)上觸發mediascanner,如何?

import android.content.Context; 
import android.media.MediaScannerConnection; 
import android.net.Uri; 
import android.util.Log; 

public class MediaScannerWrapper implements 
MediaScannerConnection.MediaScannerConnectionClient { 
    private MediaScannerConnection mConnection; 
    private String mPath; 
    private String mMimeType; 


    // filePath - where to scan; 
    // mime type of media to scan i.e. "image/jpeg". 
    // use "*/*" for any media 
    public MediaScannerWrapper(Context ctx, String filePath, String mime){ 
     mPath = "/sdcard/DCIM/Camera"; 
     mMimeType = "jpg"; 
     mConnection = new MediaScannerConnection(ctx, this); 
    } 

    // do the scanning 
    public void scan() { 
     mConnection.connect(); 
    } 

    // start the scan when scanner is ready 
    public void onMediaScannerConnected() { 
     mConnection.scanFile(mPath, mMimeType); 
     Log.w("MediaScannerWrapper", "media file scanned: " + mPath); 
    } 

    public void onScanCompleted(String path, Uri uri) { 
     // when scan is completes, update media file tags 
    } 
} 

如何使用它在其他類? 我不知道如何正確使用類,我試過但沒有任何工作。 我做錯了什麼,但我不知道,有人可以幫助我。

+1

你說的是[該職位(HTTP://計算器。 COM /問題/ 4753252 /掃描Android的SD卡換新文件)? – XMoby 2012-02-23 16:34:24

+0

呵呵,沒有發現帖子,謝謝! – Bigflow 2012-02-24 07:11:01

+0

你還能幫助我嗎,在Java中我很難用類和類似的東西。 – Bigflow 2012-02-24 07:42:12

回答

9

嘿,我發現如何用一個非常簡單的代碼來做到這一點。

只需撥打該行代碼:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

這應該引起mediascanner。

+4

它會觸發mediascanner,但它會掃描SD卡中的所有文件(除了那些與.nomedia文件的文件夾)。根據SD卡中的文件數量,掃描將需要時間。 – artsylar 2012-04-16 05:28:41

+4

Intent.ACTION_MEDIA_MOUNTED將在Android 4.4+設備上中斷,因爲意圖現在僅限於系統應用程序。 – 2015-01-17 09:44:58

5

在Android中,有一個內容數據庫,媒體掃描器使用該數據庫來跟蹤設備上存在的所有媒體內容。

當安卓開機後,在mediascanner服務啓動並貫穿整個外部存儲運行,以尋找是否有新媒體的內容,如果它發現一個,然後,

  • 它補充說,媒體內容的條目進入內容數據庫
  • 內容數據庫中的每個條目都包含媒體內容的元數據,如名稱,日期,文件大小,文件類型等。
  • 因此,當您對媒體內容進行修改時,還需要更新內容數據庫。
  • 如果內容數據庫未更新,則其他應用程序也將無法訪問該特定媒體內容。
  • 運行媒體掃描儀剛剛更新內容數據庫

,而不是運行媒體掃描儀的,你可以自己更新的內容數據庫,它應該解決這個問題。

以下是關於如何使用內容解析器插入,刪除和更新的explanation。 (搜索部分「插入,更新和刪除數據」)

編輯: 有一個在此answer一個示例代碼。檢查Janusz的答案。

+0

謝謝,當我完成其他事情時,我會繼續。 – Bigflow 2012-02-24 14:02:48

+0

他加我自己的答案,剛剛發現這個代碼,更容易使用:) – Bigflow 2012-02-27 08:57:54

5
File file = new File(absolutePath); 
    Uri uri = Uri.fromFile(file); 
    Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri); 
    sendBroadcast(intent); 
+0

我會打破在Android 7.0 – 2017-06-07 11:47:46

42

故事

的是Android 4.4之前,我們可以只發送一個廣播,以觸發任何特定文件的媒體掃描儀或文件夾,甚至在存儲的根。但是從4.4 KitKat開始,Android Developers已經修復了這個問題。

爲什麼我說固定?原因很簡單。在根目錄上使用MEDIA_MOUNTED發送廣播非常昂貴。運行Media Scanner是一項昂貴的操作,當用戶在存儲和深層文件夾結構中獲得大量文件時,情況會變得更糟。

Android之前4。4

保持直線和簡單。如果您在Android 4.4之前定位您的應用。但請記住,除非絕對必要,否則不要在根目錄中使用它。

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

從Android 4.4系統

有你有兩種方式。

i)第一個與前面的例子非常相似,但可能無法有效工作,也不推薦。

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

II)現在,讓我們繼續前進的最值得推薦的,高效地解決這個問題。

添加已更新,像這樣的文件的文件路徑,在String類型的ArrayList

ArrayList<String> toBeScanned = new ArrayList<String>(); 
toBeScanned.add(item.getFilePath()); 

現在你需要運行SCANFILE()的MediaScannerConnection類的靜態方法,並傳遞字符串數組包含所有已更新並需要介質掃描的文件列表。

您還可以讓偵聽器在完成單個文件的掃描時作出響應。

String[] toBeScannedStr = new String[toBeScanned.size()]; 
       toBeScannedStr = toBeScanned.toArray(toBeScannedStr); 

       MediaScannerConnection.scanFile(getActivity(), toBeScannedStr, null, new OnScanCompletedListener() { 

        @Override 
        public void onScanCompleted(String path, Uri uri) { 
         System.out.println("SCAN COMPLETED: " + path); 

        } 
       }); 
+1

方式二轉換目錄到文件,請參閱http://stackoverflow.com/questions/31157882/mediascannerconnectionscanfile-converts-directories-into-files-when-accessing-t – OneWorld 2015-07-01 09:48:07

+2

方式我沒有任何影響(這兩個評論都涉及Android 5) – OneWorld 2015-07-01 10:02:36

+0

當我將文件複製到Ringtones文件夾並讓Media Scanner掃描它時,它立即顯示在拾音器上!但是,當我有我的應用程序從Ringtones文件夾中刪除文件後,我還讓媒體掃描程序掃描它('onScanCompleted()'觸發器與uri = null),但媒體選擇器**仍顯示該文件。刪除文件後應如何操作以便媒體選擇器不再顯示它? – 2015-12-21 15:38:35

0

由於@Aritra羅伊的回答,我決定做這個問題的實驗。 什麼我來到這裏是:

  • Intent.ACTION_MEDIA_MOUNTED和Intent.ACTION_MEDIA_SCANNER_SCAN_FILE 可以接受單獨的文件路徑,所以sendBroadcast(新 意向(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.parse(文件路徑))); 或sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse(filePath)));將是有效的。
  • 如果您在奇巧或以上使用單獨的文件路徑與Intent.ACTION_MEDIA_MOUNTED,你的程序仍然崩潰
  • 如果使用Intent.ACTION_MEDIA_SCANNER_SCAN_FILE或MediaScannerConnection設備上低於奇巧,您的申請將不強制關閉,但該方法將只是不按你想要的工作。

從這個實驗,我認爲處理最好的方法是

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    MediaScannerConnection.scanFile(context, new String[]{imagePath}, null, new MediaScannerConnection.OnScanCompletedListener() { 
     public void onScanCompleted(String path, Uri uri) { 
      //something that you want to do 
     } 
    }); 
} else { 
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
      Uri.parse("file://" + imagePath))); 
} 

讓我知道如果我錯過了什麼

相關問題