trungdinhtrong
trungdinhtrong

Reputation: 2674

ContentResolver.openFileDescriptor() does not call ContentProvider.openFIle

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"

Upvotes: 6

Views: 15161

Answers (1)

user711058
user711058

Reputation: 715

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.

Upvotes: 6

Related Questions