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は「content://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 に答える