how to get contact photo URI

后端 未结 5 1553
夕颜
夕颜 2020-12-01 16:59

I am working with Android Contact ContentProvider. I have a Phone Number and I need to get the URI of the Photo of the contact associated with thi

相关标签:
5条回答
  • 2020-12-01 17:26

    You can get PHOTO_URI by NUMBER just use following code also you can use _ID.

     public static String getContactPhoto(Context context, String phoneNumber) {
        ContentResolver cr = context.getContentResolver();
        Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
        Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.PHOTO_URI}, null, null, null);
        if (cursor == null) {
            return null;
        }
        String contactImage= null;
        if (cursor.moveToFirst()) {
            contactImage= cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.PHOTO_URI));
        }
    
        if (!cursor.isClosed()) {
            cursor.close();
        }
        return contactImage;
    }
    
    0 讨论(0)
  • 2020-12-01 17:31

    To get the conatct id using the phone number use the following code:

    import android.provider.ContactsContract.PhoneLookup;
    
    public String fetchContactIdFromPhoneNumber(String phoneNumber) {
        Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
            Uri.encode(phoneNumber));
        Cursor cursor = this.getContentResolver().query(uri,
            new String[] { PhoneLookup.DISPLAY_NAME, PhoneLookup._ID },
            null, null, null);
    
        String contactId = "";
    
        if (cursor.moveToFirst()) {
            do {
            contactId = cursor.getString(cursor
                .getColumnIndex(PhoneLookup._ID));
            } while (cursor.moveToNext());
        }
    
        return contactId;
      }
    

    and use the contact id obtained to get the contatc photo URI. Use the following code for getting photo URI:

    import android.provider.ContactsContract;
    import android.provider.ContactsContract.CommonDataKinds.Phone;
    
    public Uri getPhotoUri(long contactId) {
        ContentResolver contentResolver = getContentResolver();
    
        try {
            Cursor cursor = contentResolver
                .query(ContactsContract.Data.CONTENT_URI,
                    null,
                    ContactsContract.Data.CONTACT_ID
                        + "="
                        + contactId
                        + " AND "
    
                        + ContactsContract.Data.MIMETYPE
                        + "='"
                        + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE
                        + "'", null, null);
    
            if (cursor != null) {
            if (!cursor.moveToFirst()) {
                return null; // no photo
            }
            } else {
            return null; // error in cursor process
            }
    
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    
        Uri person = ContentUris.withAppendedId(
            ContactsContract.Contacts.CONTENT_URI, contactId);
        return Uri.withAppendedPath(person,
            ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
      }
    

    Hope this would help.

    0 讨论(0)
  • 2020-12-01 17:35

    Here's the code from Android Documentation.

    Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
    return Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
    
    0 讨论(0)
  • 2020-12-01 17:46

    This solution demonstrates how to get an image from a user contact and then display it in an ImageView.

    ImageView profile  = (ImageView)findViewById(R.id.imageView1);                 
    Uri my_contact_Uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(Contact_Id));
    InputStream photo_stream = ContactsContract.Contacts.openContactPhotoInputStream(getContentResolver(),my_contact_Uri);            
    BufferedInputStream buf =new BufferedInputStream(photo_stream);
    Bitmap my_btmp = BitmapFactory.decodeStream(buf);
    profile.setImageBitmap(my_btmp);
    
    0 讨论(0)
  • 2020-12-01 17:51
        final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB;
        String phoneNumber = "+1 416 385 7805";
        ContentResolver contentResolver = context.getContentResolver();
        Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
        String[] projection = new String[] {
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.LOOKUP_KEY,
                IS_HONEYCOMB ? ContactsContract.Contacts.PHOTO_THUMBNAIL_URI : ContactsContract.Contacts._ID,
                };
        Cursor cursor =
                contentResolver.query(
                        uri,
                        projection,
                        null,
                        null,
                        null);
        if (cursor != null && cursor.moveToNext()) {
            long contactId = cursor.getLong(0);
            String lookupKey = cursor.getString(1);
            String thumbnailUri = cursor.getString(2);           
            cursor.close();
        }
    

    So now if sdk is honeycomb or higher u have thumbnail uri of the contact. Or you can construct a lookup uri like this:

    Uri uri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey);
    

    P.S. If you already know contact id and/or lookup key you can construct a Uri from string:

    lookup: content://com.android.contacts/contacts/lookup/{lookup key}/{contact id} thumbnail: content://com.android.contacts/contacts/{contact id}/photo

    So it's better to cache these values.

    0 讨论(0)
提交回复
热议问题