如何在删除照片时刷新Android MediaStore

时间:2013-11-13 13:50:45

标签: android mediastore android-mediascanner

问题:如何让媒体商店刷新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。)删除时刷新媒体商店。

4 个答案:

答案 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);
}