什麼是最佳選項(MediaScanner/FileObserver)用於監視正在創建的媒體文件的幾條路徑(設備的內部和外部存儲器)。android,MediaScanner vs FileObserver用於監視創建的媒體文件
我需要在正在監視的文件夾中創建媒體文件時獲取事件。
-Thanks &問候, 饅頭
什麼是最佳選項(MediaScanner/FileObserver)用於監視正在創建的媒體文件的幾條路徑(設備的內部和外部存儲器)。android,MediaScanner vs FileObserver用於監視創建的媒體文件
我需要在正在監視的文件夾中創建媒體文件時獲取事件。
-Thanks &問候, 饅頭
在你的情況下,最好的解決辦法是使用BroadcastReceiver。在上面的網址上詳細瞭解它。
首先,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以檢測您之前的數據庫中的任何更改或其他內容。
因此,如果我使用上面的代碼到服務類來通知所有的時間變化(永遠運行),那麼我是否需要取消註冊內容觀察者。 –
你應該在你的運行服務中取消註冊onDestroy()。否則會造成內存泄漏。 –
但是,它永遠是runnig服務的反正會造成內存泄漏。那麼如何解決呢? –
你有沒有發現任何解決方案來解決這個問題? – Pedram
嗨,Pedram,它是MediaScanner!這是bcoz你得到完整的媒體信息在這個,只需要過濾你是哪些intraseted。這可以通過在查詢中設置過濾器來實現。 – Manju