Android получает фото контактов из данных. Запрос по электронной почте - PullRequest
3 голосов
/ 17 марта 2011

Я делаю поле автозаполнения, которое запрашивает контакты по отображаемому имени и электронной почте. Когда кто-то нажимает на нужный контакт после фильтрации, этот контакт добавляется в список с его адресом электронной почты, отображаемым именем и изображением, если он есть.

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

    return mContent.query(Email.CONTENT_URI,
              PROJECTION, filter, null, null);

, где проекция:

 PROJECTION = new String[] {ContactsContract.Contacts._ID,
              ContactsContract.Contacts.DISPLAY_NAME,
              ContactsContract.Contacts.PHOTO_ID,
                Email.DATA
            };

Этот делает то, что мне нужно, и возвращает все данные. Но одна вещь, которую я заметил во время отладки этой проблемы, состоит в том, что идентификатор контакта отличается от того, если вы запустите запрос к ContactsContract.Contacts.CONTENT_URI для определенного отображаемого имени, например.

Например, тесты, которые я провел, где я получаю все контакты, запустив Contacts.CONTENT_URI, дал мне контакт с изображением и идентификатором 152. Однако запрос к Email.CONTENT_URI дает мне идентификатор 452 для тот же контакт (с тем же отображаемым именем и адресом электронной почты). поэтому, когда я пытаюсь получить фотографию для содержимого URI, содержащего Id 452, возвращается, что фотография не существует, но если я пытаюсь получить фотографию для 152, она работает отлично.

Что вызывает эту проблему? Как я могу получить правильный идентификатор пользователя? Есть ли какой-либо реляционный запрос, который я могу выполнить, чтобы получить контактный идентификатор, или, возможно, правильный способ получить его с помощью этого.

Спасибо.

EDIT

Я нашел это копаться в старом коде. Может быть полезным для всех.

Итак, полный запрос:

String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID,
            Email.DATA, ContactsContract.CommonDataKinds.Photo.CONTACT_ID };

                String order = " CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME
                        + " NOT LIKE '%@%' THEN 1" + " ELSE 2 END, "
                        + ContactsContract.Contacts.DISPLAY_NAME + " COLLATE NOCASE";
                String filter = Email.DATA + " NOT LIKE '' ) GROUP BY ( " + Email.DATA;

тогда его

getContentResolver().query( Email.CONTENT_URI, PROJECTION, filter, null, order);

Ответы [ 4 ]

7 голосов
/ 25 марта 2011

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

public Uri getContactPhotoUri(long contactId) {
    Uri photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
    photoUri = Uri.withAppendedPath(photoUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
    return photoUri;
}

Но для contactId вы должны использовать:

String id = ContactsContract.CommonDataKinds.Photo.CONTACT_ID;
long contactId = Long.parseLong(id);

Обратите внимание, что распространенной ошибкой является использование ContactsContract.Contacts._ID вместо ContactsContract.CommonDataKinds.Photo.CONTACT_ID

Я надеюсь, что это может помочь вам.

1 голос
/ 09 июня 2011

лучший код будет

Uri photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Id);

    Bitmap photoBitmap;
    ContentResolver cr = getContentResolver();
    InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(cr, photoUri);

    photoBitmap = BitmapFactory.decodeStream(is);

это работает для всех

1 голос
/ 18 марта 2011

может быть, вы можете взглянуть на это сообщение в блоге в примере, где они запрашивают все контакты, адреса электронной почты и фотографию контакта http://blog.app -solut.com / 2011/03 / рабочий-с-contactscontract к запроса-контактов-на-андроида /

1 голос
/ 17 марта 2011

Вы должны использовать RAW_CONTACT_ID в запросе.Например, может быть два разных контакта, т.е. разные RAW_CONTACT_ID для одного CONTACT_ID.

...