android、MediaScanner和FileObserver用于监控创建的媒体文件
监视正在创建的媒体文件的两条路径(设备的内部和外部内存)的最佳选项(MediaScanner/FileObserver)是什么 我需要在正在监视的文件夹中创建媒体文件时获取一个事件 -谢谢和问候,android、MediaScanner和FileObserver用于监控创建的媒体文件,android,android-contentresolver,android-mediascanner,fileobserver,Android,Android Contentresolver,Android Mediascanner,Fileobserver,监视正在创建的媒体文件的两条路径(设备的内部和外部内存)的最佳选项(MediaScanner/FileObserver)是什么 我需要在正在监视的文件夹中创建媒体文件时获取一个事件 -谢谢和问候, Manju在您的情况下,最好的解决方案是使用。请在上面的url上阅读更多信息。首先,FileOberver是一种内存杀手方法。考虑大量的文件。相反,ContentObserver似乎是一种更好的方法 getContentResolver().registerContentObserver(androi
Manju在您的情况下,最好的解决方案是使用。请在上面的url上阅读更多信息。首先,
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,以检测对以前数据库或其他内容的任何更改。对于广播接收器,您需要在清单文件中添加一个意图过滤器action。那么,在上述情况下,您会将其视为什么?在任何路径(不仅在路径dcim/摄像头上,而且在设备的内部/外部内存中的任何路径上)的设备内部/外部内存中创建/移动任何媒体文件时,如何获得通知@Ty221哪个广播接收器意图将通知内容提供商媒体更改Hi您找到解决问题的解决方案了吗?嗨,Pedram,这是MediaScanner!这是bcoz,您可以在其中获得完整的媒体信息,只需筛选您感兴趣的内容。这可以通过在查询中设置筛选器来实现。因此,如果我将上述代码用于服务类,以便随时(始终运行)通知更改,那么我是否需要注销Content Observer。您应该在始终运行的服务中的onDestroy()中注销。否则它会造成内存泄漏。但由于它一直在运行服务,它无论如何都会造成内存泄漏。那么如何解决这个问题呢?如果你取消注册,为什么会造成内存泄漏呢?你能解释一下你在想什么吗?可以。注销只针对那些并不罕见的特殊情况。