我有两个问题,为了让我的问题在这里明确一个简短的代码段:
ContentResolver resolver = context.getContentResolver();
DocumentsContract.deleteDocument(resolver, documentUri);
resolver.openFileDescriptor(documentUri, "rw");
文档说明最后一行"如果URI下没有文件或模式无效,则抛出FileNotFoundException。"
但实际上我得到java.lang.IllegalArgumentException
。
(问题1)这是一个错误还是OK?
(问题2)openFileDescriptor()
显然不是测试文档是否存在的好方法。什么是"官方"这样做的方法?
编辑(添加错误日志):
W / System.err:java.lang.IllegalArgumentException:无法确定9016-4EF8:myFolder / file1.wav是否为9016-4EF8的子级:myFolder:java.io.FileNotFoundException:缺少9016-4EF8的文件: myFolder / file1.wav at /storage/extSdCard/myFolder/file1.wav
W / System.err:在android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
W / System.err:在android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:148)
W / System.err:在android.content.ContentProviderProxy.openAssetFile(ContentProviderNative.java:618) W / System.err:在android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:945) W / System.err:在android.content.ContentResolver.openFileDescriptor(ContentResolver.java:784) W / System.err:在android.content.ContentResolver.openFileDescriptor(ContentResolver.java:739)并
documentUri ="内容://com.android.externalstorage.documents/tree/9016-4EF8%3AmyFolder/document/9016-4EF8%3AmyFolder%2Ffile1.wav"
答案 0 :(得分:1)
这是一个错误还是OK?
我认为这是一个错误,因为它应该在这里抛出一个FileNotFoundException
。
openFileDescriptor()显然不是测试文档是否存在的好方法。这样做的“官方”方法是什么?
简单的解决方案是使用DocumentFile
及其exists()
方法。
如果我能够毫无问题地删除documentUri标识的文档,那么实际文档的性质应该与openFileDescriptor无关,是不是?
嗯,知道应该责怪谁是有帮助的。在这种情况下,问题在于Google。
关于DocumentFile:我成功地避开了它,并想知道我现在是否因为exists()而被迫包含它?
如果您愿意,我们当然欢迎您克隆其exists()
的实施。由于某种间接性,你会发现它in DocumentsContractApi19
:
public static boolean exists(Context context, Uri self) {
final ContentResolver resolver = context.getContentResolver();
Cursor c = null;
try {
c = resolver.query(self, new String[] {
DocumentsContract.Document.COLUMN_DOCUMENT_ID }, null, null, null);
return c.getCount() > 0;
} catch (Exception e) {
Log.w(TAG, "Failed query: " + e);
return false;
} finally {
closeQuietly(c);
}
}