我有以下两种方式定义DocumentFile
:
DocumentFile documentFile;
Uri documentFileUri;
我可以通过以下方法从SD卡中删除文档文件:
documentFile.delete();
DocumentsContract.deleteDocument(contentResolver, documentFileUri);
但上述方法中的任何一个都不会删除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;
}
答案 0 :(得分:1)
正如胖子所指出的那样,该行为是设计使然-记录在此Google问题中:https://issuetracker.google.com/issues/138887165
解决方案:
可能没有比以下问题更好的解决方案了:
DocumentFile
对象或URI
和DocumentsContract.deleteDocument
删除文件MediaScannerConnection.scanFile(...)
答案 1 :(得分:0)
我有点晚了,但我希望我能找到问题的解决方案......即使是从问题发布之日起2年后。完整的代码示例可以在https://drive.google.com/file/d/1zCdaGwslr5XfWH_t0iZPKDukChOLXMg3/view?usp=sharing找到。 (用Kotlin编写)这段代码适用于Android版LOLLIPOP及以上版本。
代码很简单,很容易理解。