Android Получить изображение контакта из журнала вызовов - PullRequest
3 голосов
/ 07 июля 2011

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

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

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

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

Ответы [ 5 ]

8 голосов
/ 07 июля 2011

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

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
1 голос
/ 09 февраля 2012

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

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);
    }
}  
0 голосов
/ 30 декабря 2017

Все вышеприведенные ответы верны. Вы также можете получить фотографию этим ...

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

работать в SDK> = 23

, если вы работаете с минимальным 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 голосов
/ 17 августа 2016

Попробуйте это ...

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 голосов
/ 07 июля 2011

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

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