連絡先の URI を取得し、写真への入力ストリームを開こうとして連絡先に写真があることを確認し、写真への URI を取得してデコードするコードをアプリに持っています。
まれに、URI が存在しないという奇妙な例外が発生します。存在しない写真ファイルへのURIを取得しました。
写真の URI を取得します。
// Get Uri to the contact
Uri contact = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,
c.getInt(c.getColumnIndex(PhoneLookup._ID)));
// Get input stream of the photo
InputStream is = Contacts.openContactPhotoInputStream(context.getContentResolver(), contact);
// If no input stream (then there is no photo of contact), return 'null' instead of photo Uri
if (is == null) {
Log.d(TAG, "No photo");
return;
}
// Get display photo Uri of the contact
Uri photoUri = Uri.withAppendedPath(contact, ContactsContract.Contacts.Photo.DISPLAY_PHOTO);
この時点で、連絡先に写真がない場合は、is
取得null
して返します。しかし、まれに、photoUri
取得しcontent://com.android.contacts/contacts/303/display_photo
ます。
それをデコードします(他の関数で):
InputStream isPhoto = context.getContentResolver().openInputStream(photoUri);
この行からスローされる例外は次のとおりです。
java.io.FileNotFoundException: No photo file found for ID 0
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146)
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:617)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:717)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:614)
at android.content.ContentResolver.openInputStream(ContentResolver.java:449)
at com.app.android.utils.ImageUtils.decodeBitmapFromPhotoUri(ImageUtils.java:39)
...
コンテンツリゾルバーが、存在しない写真への URI を返すのではなく (連絡先が存在し、写真がないことは確かです)、どうすればよいのnull
でしょうか?
更新: デバイスで撮影されていない写真 (Google アカウントから受信した写真やインターネットからダウンロードした写真など) でのみ発生することがわかりました。