3

监视正在创建的媒体文件的几个路径(设备的内部和外部存储器)的最佳选择是什么(MediaScanner/FileObserver)。

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

-谢谢和问候,曼朱

4

2 回答 2

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 以检测您以前的数据库或其他东西的任何更改。

于 2016-03-12T07:51:47.530 回答
0

在您的情况下,最好的解决方案是使用BroadcastReceiver。在上面的 url 上阅读更多相关信息。

于 2013-08-16T08:16:35.180 回答