Android Get contact image from call log

It was pretty easy to get a contact image when People.CONTENT_URI , with a simple

 People.loadContactPhoto(activity, ContentUris.withAppendedId(People.CONTENT_URI, contactId) 

because i knew contact id. Now I need to do the same after entering the call log. FROM:

 String[] strFields = { android.provider.CallLog.Calls.CACHED_NAME, android.provider.CallLog.Calls.NUMBER, }; String strUriCalls="content://call_log/calls"; Uri UriCalls = Uri.parse(strUriCalls); Cursor cursorLog = this.getContentResolver().query(UriCalls, strFields, null, null, null); 

I get the list from the call log, but I can’t find a way to associate it with the contact ID needed to upload the photo. The application works from api level 4+.

Any help is appreciated. Thank.

The solution, according to Christian below, works for me:

  private long getContactIdFromNumber(String number) { String[] projection = new String[]{Contacts.Phones.PERSON_ID}; Uri contactUri = Uri.withAppendedPath(Contacts.Phones.CONTENT_FILTER_URL,Uri.encode(number)); Cursor c = getContentResolver().query(contactUri, projection, null, null, null); if (c.moveToFirst()) { long contactId=c.getLong(c.getColumnIndex(Contacts.Phones.PERSON_ID)); return contactId; } return -1; } 
+3
android contacts calllog android-contacts
Jul 07 '11 at 17:38
source share
5 answers

Then you should try to get the contact ID using the query log fields. So you can implement something like this:

 private String getContactIdFromNumber(String number) { String[] projection = new String[]{Contacts.Phones._ID}; Uri contactUri = Uri.withAppendedPath(Contacts.Phones.CONTENT_FILTER_URL, Uri.encode(number)); Cursor c = getContentResolver().query(contactUri, projection, null, null, null); if (c.moveToFirst()) { String contactId=c.getString(c.getColumnIndex(Contacts.Phones._ID)); return contactId; } return null; } 

Then you can use this contact id to get the photo. Something like this in your case:

 cursorLog.moveToFirst(); String number = cursorLog.getString(cursorLog.getColumnIndex(android.provider.CallLog.Calls.NUMBER)); contactId = getContactIdFromNumber(number) People.loadContactPhoto(activity, ContentUris.withAppendedId(People.CONTENT_URI, contactId); // blah blah blah 
+8
Jul 07 2018-11-17T00:
source share

This works great for me.

 private void contactPickedFromLog(Intent data) { // TODO Auto-generated method stub String contactNumber = data.getStringExtra(CONTACT_NUMBER); Cursor cursor = getContentResolver().query( Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.decode(contactNumber)), new String[] { PhoneLookup._ID }, null, null, null); if(cursor.moveToFirst()){ long contactId = cursor.getLong(0); InputStream inputStream = Contacts.openContactPhotoInputStream( getContentResolver(), ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId)); if(inputStream!=null) Bitmap bitmap = BitmapFactory.decodeStream(inputStream); } } 
+1
Feb 08 2018-12-12T00:
source share

I do it as follows:

 ContentResolver cr=this.getContentResolver(); Cursor cc = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); while (cc.moveToNext()) { contactId = cc.getString(cc.getColumnIndex(ContactsContract.Contacts._ID)); Uri contactPhotoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(contactId)); InputStream is=ContactsContract.Contacts.openContactPhotoInputStream(cr, contactPhotoUri); //blah-blah } 
0
Jul 07 2018-11-17T00:
source share

Try it...

 public Bitmap getPhoto(String phoneNumber) { Uri phoneUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); Uri photoUri = null; ContentResolver cr = 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(), R.drawable.ic_contact_picture); return getCircleBitmap(defaultPhoto); } if (photoUri != null) { InputStream input = ContactsContract.Contacts.openContactPhotoInputStream( cr, photoUri); if (input != null) { return getCircleBitmap(BitmapFactory.decodeStream(input)); } } else { Bitmap defaultPhoto = BitmapFactory.decodeResource(getResources(), R.drawable.ic_contact_picture); return getCircleBitmap(defaultPhoto); } Bitmap defaultPhoto = BitmapFactory.decodeResource(getResources(), R.drawable.ic_contact_picture); contact.close(); return defaultPhoto; } 
0
Aug 17 '16 at 8:56
source share

All of the above answers are correct. You can also get photos using this ...

c.getString (c.getColumnIndex (CallLog.Calls.CACHED_PHOTO_URI));

works in SDK> = 23

if you work with a minimum SDK ...

 Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(num)); uri = ((phone_uri != null) ? Uri.parse(phone_uri) : uri); Cursor cursor = getContext().getContentResolver().query(uri, null, null, null, null); if (cursor != null) { if (cursor.moveToNext()) { String id = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID)); String name = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); image_uri = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.PHOTO_URI)); Log.d(TAG, "name " + name + " id "+id+" image_uri "+ image_uri); } cursor.close(); } 
0
Dec 30 '17 at 5:34 on
source share



All Articles