4

我实现了一个ContentProvider通过覆盖的openFile(...)方法。然后我通过使用ContentResolver.openFileDescriptor(...)方法对其进行了测试。如 javadoc 中所述,openFileDescriptor假设调用ContentProvider.openFile

“...打开原始文件描述符以访问 URI 下的数据。这类似于openAssetFileDescriptor(Uri, String),但使用底层openFile(Uri, String) ContentProvider.openFile()方法...”

问题是该openFile()方法从未被调用过。相反,我观察到它openAssetFile()被调用了。我用 android 4.1.2r1 对其进行了测试。当我查看 android 类 ContentResolver (4.1.2) 的源代码时,我看到它openFileDescriptor()只会调用openAssetFileDescriptor(),我根本找不到任何ContentProvider.openFile()可以调用的执行路径。

有人知道我错在哪里吗?- 谢谢

这是我的测试方法调用:

context.getContentResolver().openFileDescriptor(bitmapUri, "r").getFileDescriptor();

bitmapUri是这样的“内容://com.myprovider.authority/filename”

4

1 回答 1

3

对我来说,这似乎是 openFileDescriptor() 中的一个错误。我终于打电话了ContentResolver.openInputStream()/ContentResolver.openOutputStream()。这些方法正确调用openFile()以获取文件。

或者,您可以执行以下操作:

ContentResolver resolver = context.getContentResolver();
ContentProviderClient providerClient = resolver.acquireContentProviderClient(uri);
ParcelFileDescriptor descriptor = providerClient.openFile(uri, "r");

不要忘记释放 ContentProviderClient。

于 2014-02-09T10:08:03.880 回答