Загрузка изображения контакта с помощью LOOKUP_KEY и удобного метода openContactPhotoInputStream - PullRequest
3 голосов
/ 30 ноября 2011

Я изменяю свое приложение для хранения информации о контактах, используя LOOKUP_KEY вместо _ID, как предлагается в документации API. Единственная проблема, с которой я столкнулся, это то, что я больше не могу загрузить фотографию контакта.

Вот проблемный код:

InputStream s = ContactsContract.Contacts.openContactPhotoInputStream(getContentResolver(), contactUri);

Это возвращает следующую ошибку: java.lang.IllegalArgumentException: URI: content://com.android.contacts/contacts/lookup/1424i118.2312i1220228108/photo

ContactUri, который я использую в качестве аргумента, получается следующим образом: Uri contactUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, contact_key);

и в этом примере contact_key равно 1424i118.2312i1220228108

На основе документов API этот вспомогательный метод должен работать как с CONTENT_URI, так и с CONTENT_LOOKUP_URI, который я использую.

Есть идеи? Благодаря.

1 Ответ

7 голосов
/ 04 декабря 2011

Для тех, у кого похожая проблема, это помогло мне:

public Bitmap getPhoto(Uri uri){
    Bitmap photoBitmap = null;

    String[] projection = new String[] { ContactsContract.Contacts.PHOTO_ID };

    Cursor cc = getContentResolver().query(uri, projection, null, null, null);

    if(cc.moveToFirst()) {
        final String photoId = cc.getString(cc.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
        if(photoId != null) {
            final Cursor photo = managedQuery(
                    Data.CONTENT_URI,
                    new String[] {Photo.PHOTO},
                    Data._ID + "=?",
                    new String[] {photoId},
                    null
            );

            // Convert photo blob to a bitmap
            if(photo.moveToFirst()) {
                byte[] photoBlob = photo.getBlob(photo.getColumnIndex(Photo.PHOTO));
                photoBitmap = BitmapFactory.decodeByteArray(photoBlob, 0, photoBlob.length);
            }

            photo.close();
        }

    } 
    cc.close();

    return photoBitmap;
}
...