用于监视正在创建的媒体文件的几个路径(设备的内部和外部存储器)的最佳选项(MediaScanner / FileObserver)是什么。
我需要在正在监控的文件夹中创建媒体文件时获取事件。
-Thanks&问候, 馒头
答案 0 :(得分: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以检测先前数据库或其他内容的任何更改。
答案 1 :(得分:0)
您的最佳解决方案是使用BroadcastReceiver。在上面的网址上阅读更多相关内容。