ContentResolver.openFileDescriptor() does not call ContentProvider.openFIle

trungdinhtrong picture trungdinhtrong · Nov 19, 2013 · Viewed 10.5k times · Source

I implemented a ContentProvider by overriding openFile(...) method. Then I tested it by using ContentResolver.openFileDescriptor(...) method. As specified in the javadoc, openFileDescriptor suppose to call ContentProvider.openFile:

"...Open a raw file descriptor to access data under a URI. This is like openAssetFileDescriptor(Uri, String), but uses the underlying openFile(Uri, String) ContentProvider.openFile() method..."

The problem is the openFile() method was never called. Instead I observed that openAssetFile() was called instead. I tested it with android 4.1.2r1. When I review the source code for the android class ContentResolver (4.1.2) I see that openFileDescriptor() will just call openAssetFileDescriptor(), and I cannot find any execution path where ContentProvider.openFile() would be called at all.

Anybody has any idea where I was wrong? - Thanks

Here is my test method call:

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

My bitmapUri is something like this "content://com.myprovider.authority/filename"

Answer

user711058 picture user711058 · Feb 9, 2014

That seems like a bug in openFileDescriptor() to me. I ended up calling ContentResolver.openInputStream()/ContentResolver.openOutputStream(). These methods correclty call openFile() to get to the file.

Alternatively you can do something like this:

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

Dont forget to release ContentProviderClient.