1

この障害にぶつかるまでは、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 に設定されます。

4

1 に答える 1

4

を使ってみましたcontact uriか?

の最後のブール値パラメーターopenContactPhotoInputStreamは、利用可能な場合に高解像度の写真を取得することを約束します。

を使用する代わりにphoto uricontact uriまたはを使用しますcontact lookup uri

更新 質問に回答したので、関連する詳細をここに投稿します。小さなテストアプリがここに投稿されます (Android Studio が必要です): https://github.com/copolii/PicassoContactsTest

とアイコンの両方を設定するplaceholderと、写真のない連絡先にはアイコンが表示されます。ソーシャルフェイスの男をプレースホルダーとして設定し、エラーアイコンを表示しないことをお勧めします. そうすれば、連絡先に写真がない場合でも、プレースホルダーはオンのままになります。errorerror

2 つを区別たい場合は、上記を念頭に置いてエラー アイコンを選択してください (つまり、大きな赤い OMFGエラー インジケータを使用しないでください)。

--- 前のコンテンツ ---

それが役立つかどうか教えてください。

連絡先の写真を読み込む作業を行いました。何か不足していない限り、高解像度の写真 (API 14+) を自動的に取得する必要があります。

if (SDK_INT < ICE_CREAM_SANDWICH) {
  return openContactPhotoInputStream(contentResolver, uri);
} else {
  return openContactPhotoInputStream(contentResolver, uri, true);
}

openContactPhotoInputStream は PHOTO_URI が気に入らないようです。

Android ドキュメント: openContactPhotoInputStream

URI が区別できる場合は、PHOTO_URI のサポートも簡単に追加できます (ただし、最初に読み込む方法を見つける必要があります)。指定された uri が連絡先の写真の uriであるか、連絡先の検索 uriであるかを既に判断しています (古いバージョンの Android では、検索 uri がフィードされるのを好まないため、に渡す前に検索 uri連絡先 uriopenContactPhotoInputStreamに逆参照する必要があります)。openContactPhotoInputStream

これが役立つことを願っています。

于 2014-01-19T08:10:15.777 に答える