1

連絡先の 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 アカウントから受信した写真やインターネットからダウンロードした写真など) でのみ発生することがわかりました。

4

2 に答える 2

3

写真の入力ストリームを取得する方法を変更すると、すべてが機能します。

それ以外の:

InputStream isPhoto = context.getContentResolver().openInputStream(photoUri);

私が使用した:

InputStream photoInputStream =
    Contacts.openContactPhotoInputStream(context.getContentResolver(), contactUri);

注意: これで、Uri は連絡先の写真ではなく、連絡先のものになります。

于 2013-05-23T09:02:08.717 に答える