我正在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 。我也尝试在方法中使用它。 DocumentFile
Storage Access Framework
notifyChange()
那么如何更新 ContentResolver 以返回更新的文件计数?