この障害にぶつかるまでは、Picasso で画像を読み込むのは一見とても簡単に思えます。理由がわからない!連絡先にサムネイルしかない場合、または代わりに PHOTO_THUMBNAIL_URI を具体的に要求する場合は、PHOTO_URI を介して連絡先から写真を読み込むことができます。
@Override
public void bindView(View view, Context context, Cursor cursor) {
ImageView icon = (ImageView)view.findViewById(R.id.ContactImage);
String photoUri = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI));
if (photoUri == null) {
icon.setImageDrawable(null);
} else {
Picasso.with(context).load(photoUri).into(icon);
}
}
価値があるのは、使用するPicasso.with(context).load(photoUri).placeholder(R.drawable.placeholder).error(R.drawable.error).into(icon);
と、高解像度の画像を持つすべての連絡先の代わりにプレースホルダー画像が表示されることです。「エラー」画像は表示されません。使用するだけに戻すとicon.setImageURI(Uri.parse(photoUri));
、高解像度のコンタクト画像が再び正常に表示されます。(しかし、私はおしゃれな非同期キャッシング画像ローダーを持っていません!)
更新: @copolii と彼の以下の回答のおかげで、以下は Picasso 2.1.1 で問題なく動作するようになりました。
@Override
public void bindView(View view, Context context, Cursor cursor) {
Long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
String photoUri = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI));
ImageView icon = (ImageView)view.findViewById(R.id.ContactImage);
if (photoUri == null) {
icon.setImageDrawable(null);
} else {
Picasso
.with(context)
.load(contactUri)
.into(icon);
}
}
これにより、高解像度の写真がある場合は高解像度の写真が読み込まれ、ない場合は低解像度の写真が表示されます。連絡先に写真が設定されていない場合は、空白または null に設定されます。