正确删除DocumentFile(尊重MediaStore)

时间:2016-03-06 20:27:19

标签: android storage-access-framework documentfile

我有以下两种方式定义DocumentFile

DocumentFile documentFile;
Uri documentFileUri;

我可以通过以下方法从SD卡中删除文档文件:

  1. documentFile.delete();
  2. DocumentsContract.deleteDocument(contentResolver, documentFileUri);
  3. 但上述方法中的任何一个都不会删除MediaStore中的相应条目。

    处理这个问题的正确方法是什么?如果我使用ContentProvider删除本地文件,它将从数据库中删除File AND行(contentResolver.delete(localFileUri, null, null);)。如果我使用DocumentsContract但我不希望发生同样的情况......

    我想要什么

    我想立即更新MediaStore。通常情况下我会调用contentResolver.delete(documentFileUri, null, null);,但这会失败,但有一个例外,即uri不支持删除...

    问题

    有没有比我的解决方法更有效的方法呢?

    解决方法

    目前,在删除DocumentFile后,我使用以下功能立即更新媒体商店:

    public static boolean updateAfterChangeBlocking(String path, int timeToWaitToRecheckMediaScanner)
    {
        final AtomicBoolean changed = new AtomicBoolean(false);
        MediaScannerConnection.scanFile(StorageManager.get().getContext(),
                new String[]{path}, null,
                new MediaScannerConnection.OnScanCompletedListener() {
                    public void onScanCompleted(String path, Uri uri) {
                        changed.set(true);
                    }
                });
    
        while (!changed.get()) {
            try {
                Thread.sleep(timeToWaitToRecheckMediaScanner);
            } catch (InterruptedException e) {
                return false;
            }
        }
    
        return true;
    }
    

2 个答案:

答案 0 :(得分:1)

正如胖子所指出的那样,该行为是设计使然-记录在此Google问题中:https://issuetracker.google.com/issues/138887165

解决方案:

可能没有比以下问题更好的解决方案了:

  • 通过DocumentFile对象或URIDocumentsContract.deleteDocument删除文件
  • 要进行即时媒体存储更新(这就是我想要的),您必须手动更新媒体存储,例如通过像我已经将其发布在问题中一样呼叫MediaScannerConnection.scanFile(...)

答案 1 :(得分:0)

我有点晚了,但我希望我能找到问题的解决方案......即使是从问题发布之日起2年后。完整的代码示例可以在https://drive.google.com/file/d/1zCdaGwslr5XfWH_t0iZPKDukChOLXMg3/view?usp=sharing找到。 (用Kotlin编写)这段代码适用于Android版LOLLIPOP及以上版本。

代码很简单,很容易理解。