3

什麼是最佳選項(MediaScanner/FileObserver)用於監視正在創建的媒體文件的幾條路徑(設備的內部和外部存儲器)。android,MediaScanner vs FileObserver用於監視創建的媒體文件

我需要在正在監視的文件夾中創建媒體文件時獲取事件。

-Thanks &問候, 饅頭

+0

你有沒有發現任何解決方案來解決這個問題? – Pedram

+0

嗨,Pedram,它是MediaScanner!這是bcoz你得到完整的媒體信息在這個,只需要過濾你是哪些intraseted。這可以通過在查詢中設置過濾器來實現。 – Manju

回答

0

在你的情況下,最好的解決辦法是使用BroadcastReceiver。在上面的網址上詳細瞭解它。

+0

對於廣播接收器,您需要在清單文件中添加一個意圖過濾器。所以在上述情況下,你會怎麼樣? – Zax

+2

如何創建任何媒體文件時得到通知/在設備內部/外部存儲器中移動的任何路徑(不僅路徑DCIM /相機,但在設備的內部/外部存儲器中的任何路徑上)在 – Manju

+0

見我的雁@Manju –

1

首先,FileOberver是一種記憶殺手方法。考慮大量的文件。相反,ContentObserver似乎是一個更好的方法。

getContentResolver().registerContentObserver(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, true, 
     new ContentObserver(new Handler()) { 
      @Override 
      public void onChange(boolean selfChange) { 
       Log.d("your_tag","Internal Media has been changed"); 
       super.onChange(selfChange); 
       Long timestamp = readLastDateFromMediaStore(context, MediaStore.Images.Media.INTERNAL_CONTENT_URI); 
       // comapare with your stored last value and do what you need to do 

      } 
     } 
    ); 
getContentResolver().registerContentObserver(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, 
    new ContentObserver(new Handler()) { 
     @Override 
     public void onChange(boolean selfChange) { 
      Log.d("your_tag","External Media has been changed"); 
      super.onChange(selfChange); 

      Long timestamp = readLastDateFromMediaStore(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      // comapare with your stored last value and do what you need to do 
     } 
    } 
); 

private Long readLastDateFromMediaStore(Context context, Uri uri) { 
     Cursor cursor = context.getContentResolver().query(uri, null, null, null, "date_added DESC"); 
     PhotoHolder media = null; 
     Long dateAdded =-1; 
     if (cursor.moveToNext()) { 
      Long dateAdded = cursor.getLong(cursor.getColumnIndexOrThrow(MediaColumns.DATE_ADDED));   
     } 
     cursor.close(); 
     return dateAdded; 
} 

可能是一個好主意,在服務(永遠運行)做到這一點!您還需要取消註冊onDestroy()

警告:這隻會告訴您MediaStore何時發生更改,它不會說明有關添加/刪除的任何具體內容。爲此,您可能需要查詢MediaStore以檢測您之前的數據庫中的任何更改或其他內容。

+0

因此,如果我使用上面的代碼到服務類來通知所有的時間變化(永遠運行),那麼我是否需要取消註冊內容觀察者。 –

+0

你應該在你的運行服務中取消註冊onDestroy()。否則會造成內存泄漏。 –

+0

但是,它永遠是runnig服務的反正會造成內存泄漏。那麼如何解決呢? –