gpt4 book ai didi

android - 为什么 ContentResolver.openFileDescriptor 抛出 IllegalArgumentException?出路?

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:40 26 4
gpt4 key购买 nike

我有两个问题,这里用一段简短的代码来说明我的问题:

ContentResolver resolver = context.getContentResolver();
DocumentsContract.deleteDocument(resolver, documentUri);
resolver.openFileDescriptor(documentUri, "rw");

文档说最后一行“Throws FileNotFoundException if no file exists under the URI or the mode is invalid.”

但实际上我得到了 java.lang.IllegalArgumentException

(问题 1)这是错误还是正常?

(问题 2)openFileDescriptor() 显然不是测试文档是否存在的好方法。执行此操作的“官方”方法是什么?

编辑(添加错误日志):

W/System.err:java.lang.IllegalArgumentException:无法确定 9016-4EF8:myFolder/file1.wav 是否是 9016-4EF8:myFolder 的子项:java.io.FileNotFoundException:9016-4EF8 缺少文件: myFolder/file1.wav 位于/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="content://com.android.externalstorage.documents/tree/9016-4EF8%3AmyFolder/document/9016-4EF8%3AmyFolder%2Ffile1.wav"

最佳答案

Is this a bug or OK?

我认为这是一个错误,因为它应该在此处抛出 FileNotFoundException

openFileDescriptor() is obviously not a good method to test if the document exists. What is the "official" method to do that?

简单的解决方案是使用DocumentFile 及其exists() 方法。

If I'm able to remove the document identified by documentUri without any problem then the nature of the actual document shouldn't be relevant for openFileDescriptor, should it?

嗯,知道应该责怪谁是有帮助的。在这种情况下,问题在于 Google。

And concerning DocumentFile: I successfully avoided it and wonder if I'm now forced to include it only because of 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);
}
}

关于android - 为什么 ContentResolver.openFileDescriptor 抛出 IllegalArgumentException?出路?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38393130/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com