Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android、MediaScanner和FileObserver用于监控创建的媒体文件_Android_Android Contentresolver_Android Mediascanner_Fileobserver - Fatal编程技术网

android、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

监视正在创建的媒体文件的两条路径(设备的内部和外部内存)的最佳选项(MediaScanner/FileObserver)是什么

我需要在正在监视的文件夹中创建媒体文件时获取一个事件

-谢谢和问候,
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()中注销。否则它会造成内存泄漏。但由于它一直在运行服务,它无论如何都会造成内存泄漏。那么如何解决这个问题呢?如果你取消注册,为什么会造成内存泄漏呢?你能解释一下你在想什么吗?可以。注销只针对那些并不罕见的特殊情况。