为什么ContentResolver.openFileDescriptor会抛出IllegalArgumentException?出路?

时间:2016-07-15 09:53:28

标签: android android-contentresolver

我有两个问题,为了让我的问题在这里明确一个简短的代码段:

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"

1 个答案:

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