[英]Updating ContentResolver to get updated file count
我正在使用棉花糖版本的Android中的外部存储使用Storage Access Framework
删除一些文件。 我需要显示外部存储中可用的各种文件的数量。 我正在为内部存储获得适当的计数,但是对于外部存储,我没有获得视频的更新文件计数。 每当我打开内置文件管理器然后返回到应用程序时,它都会正确更新文件计数,这意味着我需要调用某种方法来更新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);
, ContentResolver
上的notifyChange()
,也可以使用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
是DocumentFile
的String Uri,它刚刚使用Storage Access Framework
删除了。 我也尝试在notifyChange()
方法中使用它。
那么,如何更新ContentResolver以返回更新后的文件计数?
删除功能后尝试此行
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
(以上解决方案自android 4.4起似乎不起作用)
对于DATA:
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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.