Android Получить контактное изображение из журнала вызовов

Было довольно легко получить изображение контакта при запросе People.CONTENT_URI с помощью простого

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

Потому что я знал контакт ID. Теперь мне нужно сделать то же самое после входа в журнал вызовов. С:

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

Я получаю список из журнала вызовов, но я не могу найти способ связать его с идентификатором контакта, необходимым для загрузки фотографии. Приложение работает с уровня api 4+.

Любая помощь приветствуется. Спасибо.

Решение, в соответствии с приведенным ниже Кристианом, работает для меня:

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

Затем вы должны попытаться получить идентификатор контакта, используя поля журнала запросов. Итак, вы можете реализовать что-то вроде этого:

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

Затем вы можете использовать этот идентификатор контакта, чтобы получить фотографию. Что-то вроде этого в вашем случае:

 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 

Это отлично работает для меня ..

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

Я делаю это так:

 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 } 

Попробуй это …

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