问题:如何让媒体商店刷新DELETED文件的条目?
从外部存储中删除代码中的照片后,我仍然会在图库中看到已删除照片的插槽 - 空白照片。
图库似乎反映了媒体商店,并且在手机重新启动之前,媒体商店中已找到已删除的照片,直到重新扫描媒体为止。
尝试扫描已删除的文件不帮助扫描已删除的文件(仅适用于新文件或现有文件):MediaScannerConnection.scanFile(Application.get(), new String[]{file.getPath()}, null, null)
(我也尝试扫描父文件夹)。
也试过ACTION_MEDIA_SCANNER_SCAN_FILE
无济于事。示例:Application.get().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)))
发送广播接收器以重新扫描整个外部存储(从而刷新媒体商店)就可以了:Application.get().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(Environment.getExternalStorageDirectory())))
但是,从 4.4 开始,Android似乎在尝试手动发送ACTION_MEDIA_MOUNTED系统广播时引发安全性异常。请参阅@ CommonsWare的帖子:http://commonsware.com/blog/2013/11/06/android-4p4-permission-regressions.html
所以,我没有办法在文件(/ photo / video / etc。)删除时刷新媒体商店。
答案 0 :(得分:2)
我发现以下内容适用于我在4.4版的Nexus 10上。
// request scan
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, SELECT_PICTURE);
Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
scanIntent.setData(Uri.fromFile(refreshFile));
sendBroadcast(scanIntent);
“refreshFile”是我从String“fPath”中删除的文件,然后将其转换为文件。
String filePath = fPath;
File refreshFile = new File(filePath);
答案 1 :(得分:1)
尝试
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
将此添加到您的清单:
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<data android:scheme="file" />
</intent-filter>
答案 2 :(得分:0)
我现在遇到的问题是4.4中不允许使用sendBroadcast方法,并且使用Media Store内容提供商找到了一个很好的解决方案:https://stackoverflow.com/a/20780472/1060805
我在Android 4.4上进行了测试,但效果很好。我认为这是一个可靠的方法。
答案 3 :(得分:0)
我有同样的问题。我编写了以下代码,它适用于从棒棒糖到oreo的所有版本。在下面添加代码
// fileID == MediaStore.Images.Media._ID; for the file when you get the file from the content
// resolver
public static boolean deleteCREntryForFilePath(Context context, String filePath, long fileID) {
boolean fDeleted = false;
ContentResolver cr = context.getContentResolver();
int rowsDeleted = 0;
Uri imageURI = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String deleteStr = MediaStore.Images.Media._ID + "=" + fileID;
// Remove entry from database
rowsDeleted = context.getContentResolver().delete(
imageURI, deleteStr, null);
if (rowsDeleted > 0)
fDeleted = true;
return(fDeleted);
}