web-dev-qa-db-ja.com

連絡先の写真を読み込むにはどうすればよいですか?

Androidの連絡先の写真を読み込めません。私は答えをグーグルで探しましたが、今のところ空っぽです。連絡先を照会してから写真をロードする例はありますか?

だから、を使用して呼び出されたアクティビティの結果から来るcontactUriを与えられた

startActivityForResult(new Intent(Intent.ACTION_PICK,ContactsContract.CommonDataKinds.Phone.CONTENT_URI),PICK_CONTACT_REQUEST) 

は:

content://com.Android.contacts/data/1557

LoadContact(..)は正常に動作します。ただし、getPhoto(...)メソッドを呼び出すと、写真InputStreamのnull値が取得されます。また、URI値が異なるため、混乱を招きます。 contactPhotoUriの評価結果:

content://com.Android.contacts/contacts/1557

以下のコードのインラインのコメントを参照してください。

 class ContactAccessor {

    /**
     * Retrieves the contact information.
     */
    public ContactInfo loadContact(ContentResolver contentResolver, Uri contactUri) {

        //contactUri --> content://com.Android.contacts/data/1557

        ContactInfo contactInfo = new ContactInfo();

        // Load the display name for the specified person
        Cursor cursor = contentResolver.query(contactUri,
                                            new String[]{Contacts._ID, 
                                                         Contacts.DISPLAY_NAME, 
                                                         Phone.NUMBER,
                                                         Contacts.PHOTO_ID}, null, null, null);
        try {
            if (cursor.moveToFirst()) {
                contactInfo.setId(cursor.getLong(0));
                contactInfo.setDisplayName(cursor.getString(1));
                contactInfo.setPhoneNumber(cursor.getString(2));
            }
        } finally {
            cursor.close();
        }        
        return contactInfo;  // <-- returns info for contact
    }

    public Bitmap getPhoto(ContentResolver contentResolver, Long contactId) {
        Uri contactPhotoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);

        // contactPhotoUri --> content://com.Android.contacts/contacts/1557

        InputStream photoDataStream = Contacts.openContactPhotoInputStream(contentResolver,contactPhotoUri); // <-- always null
        Bitmap photo = BitmapFactory.decodeStream(photoDataStream);
        return photo;
    }

    public class ContactInfo {

        private long id;
        private String displayName;
        private String phoneNumber;
        private Uri photoUri;

        public void setDisplayName(String displayName) {
            this.displayName = displayName;
        }

        public String getDisplayName() {
            return displayName;
        }

        public void setPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }

        public String getPhoneNumber() {
            return phoneNumber;
        }

        public Uri getPhotoUri() {
            return this.photoUri;
        }

        public void setPhotoUri(Uri photoUri) {
            this.photoUri = photoUri;
        }

        public long getId() {
            return this.id;
        }

        public void setId(long id) {
            this.id = id;
        }

    }
}

明らかに、私はここで何か間違ったことをしていますが、問題が何であるかを理解できないようです。ありがとう。

43
PaulH

サムネイルを表示する問題に対する多くの質問と回答をスキャンした後、私はこの特定の難問に自分の解決策を投稿すると思いました。

以下のクラスは、Context、QuickContactBadge、および電話番号を受け取り、指定された電話番号に利用可能なものがある場合、ローカルに保存された画像をバッジに添付します。

クラスは次のとおりです。

public final class QuickContactHelper {

private static final String[] PHOTO_ID_PROJECTION = new String[] {
    ContactsContract.Contacts.PHOTO_ID
};

private static final String[] PHOTO_BITMAP_PROJECTION = new String[] {
    ContactsContract.CommonDataKinds.Photo.PHOTO
};

private final QuickContactBadge badge;

private final String phoneNumber;

private final ContentResolver contentResolver;

public QuickContactHelper(final Context context, final QuickContactBadge badge, final String phoneNumber) {

    this.badge = badge;
    this.phoneNumber = phoneNumber;
    contentResolver = context.getContentResolver();

}

public void addThumbnail() {

    final Integer thumbnailId = fetchThumbnailId();
    if (thumbnailId != null) {
        final Bitmap thumbnail = fetchThumbnail(thumbnailId);
        if (thumbnail != null) {
            badge.setImageBitmap(thumbnail);
        }
    }

}

private Integer fetchThumbnailId() {

    final Uri uri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    final Cursor cursor = contentResolver.query(uri, PHOTO_ID_PROJECTION, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");

    try {
        Integer thumbnailId = null;
        if (cursor.moveToFirst()) {
            thumbnailId = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
        }
        return thumbnailId;
    }
    finally {
        cursor.close();
    }

}

final Bitmap fetchThumbnail(final int thumbnailId) {

    final Uri uri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, thumbnailId);
    final Cursor cursor = contentResolver.query(uri, PHOTO_BITMAP_PROJECTION, null, null, null);

    try {
        Bitmap thumbnail = null;
        if (cursor.moveToFirst()) {
            final byte[] thumbnailBytes = cursor.getBlob(0);
            if (thumbnailBytes != null) {
                thumbnail = BitmapFactory.decodeByteArray(thumbnailBytes, 0, thumbnailBytes.length);
            }
        }
        return thumbnail;
    }
    finally {
        cursor.close();
    }

}

}

そして、アクティビティ内の典型的なユースケースは次のとおりです。

String phoneNumber = "...";
QuickContactBadge badge = (QuickContactBadge) view.findViewById(R.id.friend);
new QuickContactHelper(this, badge, phoneNumber).addThumbnail();

フラグメントでは、わずかに異なります。

String phoneNumber = "...";
QuickContactBadge badge = (QuickContactBadge) view.findViewById(R.id.friend);
new QuickContactHelper(getActivity(), badge, phoneNumber).addThumbnail();

より効率的な方法があります。たとえば、メッセージタイムラインをレンダリングする場合、常に新しいヘルパークラスインスタンスを作成して再作成するのではなく、特定の電話番号のすべてのバッジインスタンスに同じビットマップオブジェクトを再使用します。ビットマップを取得します-しかし、ここでの私の目的は、わかりやすくするために絶対最小限に抑えたソリューションを投稿すると同時に、すぐに使用できる完全で使用可能なソリューションを提供することでした。このソリューションは、Andriod 4.0で構築およびテストされており、4.1でもテストされています。

30
Phil

これは私のために働く:

public static Bitmap loadContactPhoto(ContentResolver cr, long  id) {
    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
    InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
    if (input == null) {
        return null;
    }
    return BitmapFactory.decodeStream(input);
}
33
wrongmissle

多くのデバッグの夜を経て、最良のアプローチはcontact idを使用することであり、photo idの使用に失敗した場合です。

public static Bitmap loadContactPhoto(ContentResolver cr, long  id,long photo_id) 
{

    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
    InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
    if (input != null) 
    {
        return BitmapFactory.decodeStream(input);
    }
    else
    {
        Log.d("PHOTO","first try failed to load photo");

    }

    byte[] photoBytes = null;

    Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, photo_id);

    Cursor c = cr.query(photoUri, new String[] {ContactsContract.CommonDataKinds.Photo.PHOTO}, null, null, null);

    try 
    {
        if (c.moveToFirst()) 
            photoBytes = c.getBlob(0);

    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();

    } finally {

        c.close();
    }           

    if (photoBytes != null)
        return BitmapFactory.decodeByteArray(photoBytes,0,photoBytes.length);
    else
        Log.d("PHOTO","second try also failed");
    return null;
}

エミュレータとNexus Sデバイスでテストされたコードは動作しているようです。

16
assaf passal

みんな、私はこれを理解しようとして何時間も費やしました。これは、電話番号(ダッシュなし)でFacebookの写真を取得するために作成したメソッドです。もちろん、それに応じて変更できます。

    public Bitmap getFacebookPhoto(String phoneNumber) {
    Uri phoneUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    Uri photoUri = null;
    ContentResolver cr = this.getContentResolver();
    Cursor contact = cr.query(phoneUri,
            new String[] { ContactsContract.Contacts._ID }, null, null, null);

    if (contact.moveToFirst()) {
        long userId = contact.getLong(contact.getColumnIndex(ContactsContract.Contacts._ID));
        photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, userId);

    }
    else {
        Bitmap defaultPhoto = BitmapFactory.decodeResource(getResources(), Android.R.drawable.ic_menu_report_image);
        return defaultPhoto;
    }
    if (photoUri != null) {
        InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(
                cr, photoUri);
        if (input != null) {
            return BitmapFactory.decodeStream(input);
        }
    } else {
        Bitmap defaultPhoto = BitmapFactory.decodeResource(getResources(), Android.R.drawable.ic_menu_report_image);
        return defaultPhoto;
    }
    Bitmap defaultPhoto = BitmapFactory.decodeResource(getResources(), Android.R.drawable.ic_menu_report_image);
    return defaultPhoto;
}
16
ROFLwTIME

これらのアプローチはどれも役に立たなかった。うまくいったのは:

String[] projection = new String[] {
                ContactsContract.Contacts.PHOTO_ID,                 ///< the correct ID for photo retrieval in loadLocalContactPhotoBytes()
//              ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER,
//              ContactsContract.CommonDataKinds.Photo.PHOTO
        };

        ContentResolver cr = ctx.getContentResolver();

        Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                //      Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI,
                //              new String[] {RawContacts._ID, RawContacts.ACCOUNT_TYPE, RawContacts.ACCOUNT_NAME},
                //              new String[] {Contacts._ID},
                projection, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");

....

//上記の「カーソル」は、以下の引数として渡されます

    private byte[] loadLocalContactPhotoBytes(ContentResolver cr, Cursor cursor, byte[] defaultPhotoBytes)
    {
        byte[] photoBytes = null;// = cursor.getBlob(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Photo.PHOTO));

//      int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
        int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
//      Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
//      Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
        Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, id);

        Cursor c = cr.query(photoUri, new String[] {ContactsContract.CommonDataKinds.Photo.PHOTO}, null, null, null);

        try 
        {
            if (c.moveToFirst()) 
                photoBytes = c.getBlob(0);

        } catch (Exception e) {
            // TODO: handle exception
            Log.w(_TAG, e.toString());

        } finally {

            c.close();
        }           

        photoBytes = photoBytes == null ? defaultPhotoBytes : photoBytes;
        return photoBytes;
    }
5
kellogs

キックのために、ここで答えのほとんどを単一のクラスにコピーして、Facebookのサムネイルを取得できるかどうかを確認しました。彼らはしませんでした....しかし、ここに私がおそらくあなたが同じことをするのを救うためにしたことを示します。

結果をダイアログに簡単に表示します。

注意してください-最適化されていないため、エラーをキャッチしてカーソルを閉じる必要があります

連絡先選択インテントを開始するには:

private static final int SELECT_CONTACT = 1468;

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
contactPickerIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

try {
    startActivityForResult(contactPickerIntent, SELECT_CONTACT);
} catch (ActivityNotFoundException e) {
    e.printStackTrace();
}

コールバック:

@Override
    public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

    if (data != null && resultCode == Activity.RESULT_OK) {

        switch (requestCode) {

        case SELECT_CONTACT:

            Uri contactURI = data.getData();

            if (contactURI != null) {

                String contactID = data.getData().getLastPathSegment().trim();

                String contactName = ContactThumb.getDisplayName(getActivity(), contactURI);

                if (contactName != null && !contactName.isEmpty() && contactID != null && !contactID.isEmpty()) {

                    final int THUMBNAIL_SIZE = 100;

                    Bitmap contactThumb = ContactThumb.loadContactPhoto(getActivity(), Long.valueOf(contactID));

                    if (contactThumb != null) {

                        final AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());

                        final int width = contactThumb.getWidth();
                        final int height = contactThumb.getHeight();
                        final int ratio = width / height;

                        final Bitmap resized = ThumbnailUtils.extractThumbnail(contactThumb, (THUMBNAIL_SIZE * ratio),
                                THUMBNAIL_SIZE);

                        Drawable icon = new BitmapDrawable(getActivity().getResources(), resized);

                        alert.setIcon(icon);

                        alert.setTitle("Contact details");

                        final TextView homeTV = new TextView(getActivity());

                        homeTV.setText(contactName + " : " + contactID);
                        homeTV.setTextSize(12);

                        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
                            homeTV.setTextColor(Color.WHITE);
                        }

                        homeTV.setPadding(30, 2, 20, 10);
                        homeTV.setMovementMethod(LinkMovementMethod.getInstance());

                        alert.setView(homeTV);
                        alert.show();

                    } else {
                        Toast.makeText(getActivity(), "Photo null", Toast.LENGTH_SHORT).show();
                    }
                }

            }

            break;
        }
    } else {
        // cancelled or error
    }
}

ContactThumbが試行する...

import Java.io.InputStream;
import Android.content.ContentResolver;
import Android.content.ContentUris;
import Android.content.Context;
import Android.database.Cursor;
import Android.graphics.Bitmap;
import Android.graphics.BitmapFactory;
import Android.net.Uri;
import Android.provider.ContactsContract;
import Android.provider.ContactsContract.Contacts;
import Android.provider.ContactsContract.PhoneLookup;
import Android.provider.ContactsContract.CommonDataKinds.Phone;
import Android.util.Log;

public class ContactThumb {

private static final String TAG = "THUMB";

public static String getDisplayName(final Context ctx, final Uri contactURI) {

    String cname = null;

    try {

        final String[] projection = new String[] { ContactsContract.Contacts.DISPLAY_NAME };
        final Cursor cursor = ctx.getContentResolver().query(contactURI, projection, null, null, null);

        if (cursor != null) {

            try {

                if (cursor.moveToFirst()) {
                    cname = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                }

            } finally {
                cursor.close();
            }

        }

    } catch (final Exception e) {
        e.printStackTrace();
    }

    return cname;
}

public static Bitmap loadContactPhoto(final Context ctx, final long contactId) {

    final Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);

    final InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(ctx.getContentResolver(), contactUri);

    if (input != null) {
        Log.i(TAG, "loadContactPhoto: input");

        return BitmapFactory.decodeStream(input);

    } else {

        byte[] photoBytes = null;

        Uri photoUri = Uri.withAppendedPath(contactUri, Contacts.Photo.CONTENT_DIRECTORY);

        final Cursor c = ctx.getContentResolver().query(photoUri,
                new String[] { ContactsContract.CommonDataKinds.Photo.PHOTO }, null, null, null);

        try {

            if (c.moveToFirst()) {
                photoBytes = c.getBlob(0);
            }

        } catch (final Exception e) {
            e.printStackTrace();

        } finally {
            c.close();
        }

        if (photoBytes != null) {

            Log.i(TAG, "loadContactPhoto: photoBytes");

            return BitmapFactory.decodeByteArray(photoBytes, 0, photoBytes.length);

        } else {

            Bitmap another = finalAttempt(ctx, contactId);

            if (another != null) {

                Log.i(TAG, "loadContactPhoto: another");

                return another;
            } else {

                Log.i(TAG, "loadContactPhoto: might be returning default");

                return getFacebookPhoto(ctx, getContactNumber(ctx, String.valueOf(contactId)));
            }
        }
    }
}

public static String getContactNumber(final Context ctx, final String contactID) {

    Cursor phones = null;

    try {

        phones = ctx.getContentResolver().query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + " = " + contactID, null, null);

        String cnum = null;

        if (phones != null && phones.getCount() > 0) {

            while (phones.moveToNext()) {
                cnum = phones.getString(phones.getColumnIndex(Phone.NUMBER));

                if (cnum != null && !cnum.isEmpty() && !cnum.contains("@")) {

                    Log.i(TAG, "getContactNumbers: : cnum: " + cnum);

                    try {
                        phones.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    return cnum;
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

public static Bitmap getFacebookPhoto(final Context ctx, String phoneNumber) {

    Uri phoneUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    Uri photoUri = null;
    ContentResolver cr = ctx.getContentResolver();

    Cursor contact = cr.query(phoneUri, new String[] { ContactsContract.Contacts._ID }, null, null, null);

    if (contact.moveToFirst()) {
        long userId = contact.getLong(contact.getColumnIndex(ContactsContract.Contacts._ID));
        photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, userId);

    } else {
        Bitmap defaultPhoto = BitmapFactory.decodeResource(ctx.getResources(), Android.R.drawable.ic_menu_report_image);
        return defaultPhoto;
    }
    if (photoUri != null) {
        InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, photoUri);
        if (input != null) {
            return BitmapFactory.decodeStream(input);
        }
    } else {
        Bitmap defaultPhoto = BitmapFactory.decodeResource(ctx.getResources(), Android.R.drawable.ic_menu_report_image);
        return defaultPhoto;
    }
    Bitmap defaultPhoto = BitmapFactory.decodeResource(ctx.getResources(), Android.R.drawable.ic_menu_report_image);
    return defaultPhoto;
}

public static Bitmap finalAttempt(final Context ctx, final long contactId) {

    byte[] photoBytes = null;

    String[] projection = new String[] { ContactsContract.Contacts.PHOTO_ID, ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NUMBER, };

    ContentResolver cr = ctx.getContentResolver();

    final Uri contactUri = ContentUris.withAppendedId(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, contactId);

    Cursor cursor = cr.query(contactUri, projection, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");

    if (cursor != null && cursor.moveToFirst()) {

        int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
        Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, id);

        Cursor c = cr.query(photoUri, new String[] { ContactsContract.CommonDataKinds.Photo.PHOTO }, null, null, null);

        try {
            if (c.moveToFirst()) {
                photoBytes = c.getBlob(0);
            }

        } catch (Exception e) {

        } finally {
            cursor.close();
            c.close();
        }

        if (photoBytes != null) {
            return BitmapFactory.decodeByteArray(photoBytes, 0, photoBytes.length);
        }
    }

    return null;
}

}

いずれかの方法で問題が解決しない場合は、コードをコピーして貼り付けた回答に賛成票を投じてください!

Androidデベロッパーが推奨する方法 については、このリンクを確認してください

がんばろう

3
brandall

Androidのドキュメントによると、この方法で行う必要があります。

public Bitmap openPhoto(long contactId) {
        Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
        Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
        Cursor cursor = getContentResolver().query(photoUri,
                new String[] {ContactsContract.Contacts.Photo.PHOTO}, null, null, null);
        if (cursor == null) {
            return null;
        }
        try {
            if (cursor.moveToFirst()) {
                byte[] data = cursor.getBlob(0);
                if (data != null) {
                    return BitmapFactory.decodeStream(new ByteArrayInputStream(data));
                }
            }
        } finally {
            cursor.close();
        }
        return null;

}

contactIdの略:

getString(c.getColumnIndex(ContactsContract.Contacts._ID))

ソース: https://developer.Android.com/reference/Android/provider/ContactsContract.Contacts.Photo.html

私の問題は、デバイスの連絡先がFacebookから同期されたため、写真が利用できないためだったようです。

http://groups.google.com/group/Android-developers/msg/be8d0cf3928e4b7f

2
PaulH

撮影したコード: developer.Android.com

public InputStream openPhoto(long contactId) {
     Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
     Uri photoUri = Uri.withAppendedPath(contactUri, Contacts.Photo.CONTENT_DIRECTORY);
     Cursor cursor = getContentResolver().query(photoUri,
          new String[] {Contacts.Photo.PHOTO}, null, null, null);
     if (cursor == null) {
         return null;
     }
     try {
         if (cursor.moveToFirst()) {
             byte[] data = cursor.getBlob(0);
             if (data != null) {
                 return new ByteArrayInputStream(data);
             }
         }
     } finally {
         cursor.close();
     }
     return null;
 }
1
Vikas

いくつかの調査の後、次の場所で解決策を見つけました。 クイックコンタクトバッジの表示

いくつかの小さな変更を加えた私のコードは、私のためにうまく動作します

    public Bitmap loadContactPhoto(String name) {
    String photoUri = null;     
    int thumbnailColumn;        
    ContentResolver cr = GlobalData.instance().getContext().getContentResolver();
    String[] projection = new String[] { ContactsContract.Contacts._ID ,ContactsContract.Contacts.PHOTO_ID,  ContactsContract.Contacts.PHOTO_URI, ContactsContract.Contacts.PHOTO_THUMBNAIL_URI};
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, projection, ContactsContract.Contacts.DISPLAY_NAME + "='" + name + "'", null, null);
    if (cursor.moveToFirst()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
                thumbnailColumn =   cursor.getColumnIndex(Contacts.PHOTO_THUMBNAIL_URI);
            else
                thumbnailColumn = cursor.getColumnIndex(PhoneLookup._ID);

            photoUri = cursor.getString(thumbnailColumn);

            if(photoUri != null)
                return loadContactPhotoThumbnail(photoUri);
            else
                return null;    
    }
    return null;
}
private Bitmap loadContactPhotoThumbnail(String photoData) {
    AssetFileDescriptor afd = null;
    try {

        Uri thumbUri;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            thumbUri = Uri.parse(photoData);
        } else {
            final Uri contactUri = Uri.withAppendedPath(Contacts.CONTENT_URI, photoData);
            thumbUri = Uri.withAppendedPath(contactUri, Photo.CONTENT_DIRECTORY);
        }
        afd = GlobalData.instance().getContext().getContentResolver().openAssetFileDescriptor(thumbUri, "r");
        FileDescriptor fileDescriptor = afd.getFileDescriptor();
        if (fileDescriptor != null)
            return BitmapFactory.decodeFileDescriptor(fileDescriptor, null, null);
    } catch (FileNotFoundException e) {
    } finally {
        if (afd != null) {
            try {
                afd.close();
            } catch (IOException e) {
            }
        }
    }
    return null;
}
0
Arnold

私の投稿を確認してください:

https://stackoverflow.com/a/41445851/173381

public  Bitmap retrieveContactPhoto(Context context, String number) {
        ContentResolver contentResolver = context.getContentResolver();
        String contactId = null;
        Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));

        String[] projection = new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.PhoneLookup._ID};

        Cursor cursor =
                contentResolver.query(
                        uri,
                        projection,
                        null,
                        null,
                        null);

        if (cursor != null) {
            while (cursor.moveToNext()) {
                contactId = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID));
            }
            cursor.close();
        }

        Bitmap photo = BitmapFactory.decodeResource(context.getResources(),
                R.mipmap.popup);

        try {

            Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(contactId));
            Uri displayPhotoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.DISPLAY_PHOTO);

                AssetFileDescriptor fd =
                        getContentResolver().openAssetFileDescriptor(displayPhotoUri, "r");
                InputStream inputStream=fd.createInputStream();


            if (inputStream != null) {
                photo = BitmapFactory.decodeStream(inputStream);
            }

            assert inputStream != null;
            inputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return photo;
    }
0
Neeraj Singh