Я делаю поле автозаполнения, которое запрашивает контакты по отображаемому имени и электронной почте. Когда кто-то нажимает на нужный контакт после фильтрации, этот контакт добавляется в список с его адресом электронной почты, отображаемым именем и изображением, если он есть.
Пока что мне удалось сделать все, кроме того, чтобы сделать фото. Вот как я запускаю запрос, чтобы получить адрес электронной почты, отображаемое имя, идентификатор и идентификатор фотографии.
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);