Получение контактного фото - PullRequest
0 голосов
/ 04 января 2012

У меня проблема с получением фотографии контакта, которую вы видите в приложении обмена сообщениями и уведомлении о новой почте.Я посмотрел несколько примеров кодов, но у меня ничего не получилось, вот что у меня сейчас

, это должно получить фото URI и превратить его в растровое изображение для использования или, по крайней мере, кажется

public static Bitmap getContactImage(long id,Context context){
    InputStream input = getPhoto(id,context);
    if(input == null){
        return null;
    }
    return BitmapFactory.decodeStream(input);
}

public static InputStream getPhoto(long contactId,Context context){
    Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
    Uri photoUri = Uri.withAppendedPath(contactUri, Contacts.Photo.CONTENT_DIRECTORY);
    InputStream in = null;
    try{
        in = context.getContentResolver().openInputStream(photoUri);
    }catch(FileNotFoundException e){
        Log.d(TAG, e.toString());
    }
    return in;
}

и вот как я звоню

long contactID = 0;
                Bitmap image = BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_contact_picture);
                Cursor contact = context.getContentResolver().query(Data.CONTENT_URI,new String[] {Data.CONTACT_ID},Email.ADDRESS  + "='" + from + "'",null,null);
                if(contact.moveToFirst() && contact != null){
                    contactID = contact.getLong(0);
                    image = getContactImage(contactID,context);
                }

Я получаю контактный идентификатор в порядке (проверяется путем поиска номера человека, который запрашивает), но затем он не находит фотографию контакта.Я знаю, что есть фотография, потому что я проверяю ее на себе, чтобы удостовериться, и у меня есть фотография контакта, таким образом, я не знаю, что еще я должен сделать.

Мне всегда очень неудобно перемещаться по поставщику контактов, потому что в этом так много всего.

Ответы [ 3 ]

1 голос
/ 05 января 2012

Я получил, я сделал запрос против RAW_CONTACT_ID с MIMETYPE, и это дало мне фотографию, которую я искал

Cursor p = context.getContentResolver().query(Data.CONTENT_URI,new String[] {Photo.PHOTO},
                Data.RAW_CONTACT_ID + "=" + contactId + " AND " + Data.MIMETYPE + "='" + Photo.CONTENT_ITEM_TYPE+"'"
                ,null,null);
0 голосов
/ 04 января 2012

Вы делаете это неправильно.

Сначала получите идентификатор фотографии из столбца PHOTO_ID таблицы ContactsContract.Contacts. Затем извлеките байтовый массив из столбца PHOTO (который фактически является псевдонимом DATA15) из ContactsContract.Data по идентификатору, который вы получили на предыдущем шаге. И, наконец, декодируйте этот байтовый массив, используя BitmapFactory, чтобы получить растровое изображение. Здесь - документы по этому поводу.

0 голосов
/ 04 января 2012

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

//Querying for all contacts(Apply selection parameter in query to get a specific contact)

Uri contacts = ContactsContract.Contacts.CONTENT_URI;

cur = null;
cur = Main.context.getContentResolver().query(contacts, null, null,
                    null, null);    

int contactIdIndex = cur.getColumnIndex(ContactsContract.PhoneLookup._ID);
int contactId = cur.getInt(contactIdIndex);

// Фото

    Uri contactUri = ContentUris.withAppendedId(
                    ContactsContract.Contacts.CONTENT_URI, contactId);

            Uri photoUri = Uri.withAppendedPath(contactUri,
                    ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);

            Cursor cursor = cr
                    .query(
                            photoUri,
                            new String[] { ContactsContract.CommonDataKinds.Photo.PHOTO },
                            null, null, null);

            if (cursor != null && cursor.moveToFirst()) {
                byte[] data = cursor.getBlob(0);

                _conEntry.setPhoto(data);
//Data is the photo bytes for you

            }

            if (cursor != null)
                cursor.close();
...