0

我正在Storage Access Framework从 Android 的棉花糖版本的外部存储中删除一些文件。我需要显示外部存储中可用的不同类型文件的数量。我得到了适当的内部存储计数,但对于外部存储,我没有得到更新的视频文件计数。每当我打开内置文件管理器然后返回应用程序时,它会正确更新文件计数,这意味着我需要调用某种方法来更新 ContentResolver。

这是我获取外部存储中视频数量的方法

private long[] findSize(StorageSource source, FileTypes type) {
        Uri uri = MediaStore.Files.getContentUri(CONTENT_URI_COMMON);
        String[] projection = { MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.SIZE };
        String selection = getSelectionQuery(type);
        String[] selectionArgs = {};
        long total = 0;
        int count = 0;
        String sortOrder = null;
        Cursor allExtMediaFiles = populateQueries(uri, projection, selection, selectionArgs, sortOrder);
        synchronized (allExtMediaFiles) {
            if (allExtMediaFiles != null) {
                if (allExtMediaFiles.moveToFirst())

                    do {
                        if (isValidFamily(allExtMediaFiles.getString(0), source)) {
                            total = total + allExtMediaFiles.getLong(1);
                            count++;
                        }
                    } while (allExtMediaFiles.moveToNext());
                allExtMediaFiles.close();
            }
        }
        return new long[] { total, count };
    }

private Cursor populateQueries(Uri uri, String[] projection, String selection, String[] selectionArgs,
            String sortOrder) {
        ContentResolver cr = context.getContentResolver();
        Cursor cursor = cr.query(uri, projection, selection, selectionArgs, sortOrder);
        cursor.setNotificationUri(cr,uri);
        return cursor;
    }

我尝试使用不同的方法来获得正确的文件计数,包括调用cursor.setNotificationUri(cr,uri);notifyChange()打开ContentResolver和使用MediaScanner。这是我删除视频文件后使用的代码 -

Uri uri = MediaStore.Files.getContentUri("external");
                    getActivity().getContentResolver().notifyChange(uri, null);
                    MediaScannerConnection.scanFile(getActivity(), new String[] {
                                    path},
                            null, new MediaScannerConnection.OnScanCompletedListener() {
                                public void onScanCompleted(String scanPath, Uri scanUri)
                                {
                                    Log.d(TAG,"Path "+scanPath+" uri"+scanUri.toString());
                                }
                            });

这是刚刚使用删除path的字符串 Uri 。我也尝试在方法中使用它。 DocumentFileStorage Access FrameworknotifyChange()

那么如何更新 ContentResolver 以返回更新的文件计数?

4

1 回答 1

0

在删除功能后尝试这一行

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

(自 android 4.4 以来,上述解决方案似乎不起作用)

对于数据:

MediaStore.MediaColumns.DATA

你也可以尝试使用这个

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(fileDeleted)));

请参阅此链接以获取(某种)详细方法:

http://sandersdenardi.com/querying-and-removing-media-from-android-mediastore/

还要记住:

所有查询和删除(以及插入和更新)都会阻塞,直到底层事务完成。您应该在单独的线程上异步对 ContentResolver 执行这些操作。虽然 MediaStore 上的删除根本不应该花费大量时间,但如果在主线程上执行它将阻​​塞 UI。

于 2016-09-09T19:29:27.590 回答