Android - Get Contact Photo from phone number

主宰稳场 提交于 2019-12-18 14:52:49

问题


how can I get contact photo from a contact's address (phone number)?


回答1:


public static 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.drawable.default_image);

        try {
            InputStream inputStream = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(),
                    ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, new Long(contactId)));

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

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

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



回答2:


You can use the column below to get the contacts photo uri, ContactsContract.CommonDataKinds.Phone.PHOTO_URI.




回答3:


I think this vesion works better in all android versions :

public   Bitmap getContactsDetails(String address) {
    Bitmap bp = BitmapFactory.decodeResource(context.getResources(),
            R.drawable.contact_default_picture);





    Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address));

    // querying contact data store
    Cursor phones = context.getContentResolver().query(contactUri, null, null, null, null);


    while (phones.moveToNext()) {
        String image_uri = phones.getString(phones.getColumnIndex(
                ContactsContract.CommonDataKinds.Phone.PHOTO_URI));

        if (image_uri != null) {

            try {
                bp = MediaStore.Images.Media
                        .getBitmap(context.getContentResolver(),
                                Uri.parse(image_uri));

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    return   bp;

}



回答4:


Call this method to get all contact information.

public void readContacts() {
  StringBuffer sb = new StringBuffer();
  sb.append("......Contact Details.....");
  ContentResolver cr = getContentResolver();
  Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
    null, null, null);
  String phone = null;
  String emailContact = null;
  String emailType = null;
  String image_uri = "";
  Bitmap bitmap = null;
  if (cur.getCount() > 0) {
   while (cur.moveToNext()) {
    String id = cur.getString(cur
      .getColumnIndex(ContactsContract.Contacts._ID));
    String name = cur
      .getString(cur
        .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

    image_uri = cur
      .getString(cur
        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
    if (Integer
      .parseInt(cur.getString(cur
        .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
     System.out.println("name : " + name + ", ID : " + id);
     sb.append("\n Contact Name:" + name);
     Cursor pCur = cr.query(
       ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
       null,
       ContactsContract.CommonDataKinds.Phone.CONTACT_ID
         + " = ?", new String[] { id }, null);
     while (pCur.moveToNext()) {
      phone = pCur
        .getString(pCur
          .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
      sb.append("\n Phone number:" + phone);
      System.out.println("phone" + phone);
     }
     pCur.close();

     Cursor emailCur = cr.query(
       ContactsContract.CommonDataKinds.Email.CONTENT_URI,
       null,
       ContactsContract.CommonDataKinds.Email.CONTACT_ID
         + " = ?", new String[] { id }, null);
     while (emailCur.moveToNext()) {
      emailContact = emailCur
        .getString(emailCur
          .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
      emailType = emailCur
        .getString(emailCur
          .getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
      sb.append("\nEmail:" + emailContact + "Email type:" + emailType);
      System.out.println("Email " + emailContact
        + " Email Type : " + emailType);

     }

     emailCur.close();
    }

    if (image_uri != null) {
     System.out.println(Uri.parse(image_uri));
     try {
      bitmap = MediaStore.Images.Media
        .getBitmap(this.getContentResolver(),
          Uri.parse(image_uri));
      sb.append("\n Image in Bitmap:" + bitmap);
      System.out.println(bitmap);

     } catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }

    }


    sb.append("\n........................................");
   }

   textDetail.setText(sb);
  }
 }



回答5:


This is the function:

    public static  Bitmap getContactsDetails(String address) {
        Bitmap bp = BitmapFactory.decodeResource(context.getResources(),
                         R.drawable.default_contact_photo);
        String selection = ContactsContract.CommonDataKinds.Phone.NUMBER + " = '" + address + "'"; 
        Cursor phones = context.getContentResolver().query(
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, selection,
                null, null);
        while (phones.moveToNext()) {
            String image_uri = phones.getString(phones.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.PHOTO_URI));

             if (image_uri != null) {
                 try {
                  bp = MediaStore.Images.Media
                    .getBitmap(context.getContentResolver(),
                      Uri.parse(image_uri));

                 } catch (FileNotFoundException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
                 } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
                 }
             }  
        }
        return bp;
    }



回答6:


You can make some changes if you want to get Retrieving the larger photo

 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;
    }

for Retrieving the thumbnail-sized photo

 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;
 }

for more detail:

Click Here




回答7:


here is the working code

 public static 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.drawable.about_icon_email);





    Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(contactId));
    Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
    cursor = context.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;
}


来源:https://stackoverflow.com/questions/28272558/android-get-contact-photo-from-phone-number

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!