Я разрабатываю приложение для Android и хочу получать свои местные контакты. Чтобы быть точным, я хочу отобразить все контакты, у которых есть адрес электронной почты. Мой текущий подход выглядит так
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
private static final String[] CONTACT_PROJECTION = new String[] {
Email.CONTACT_ID,
Contacts.DISPLAY_NAME_PRIMARY,
Email.ADDRESS,
};
Cursor data = mResolver.query(Data.CONTENT_URI,
CONTACT_PROJECTION,
Data.MIMETYPE + "='" + Email.CONTENT_ITEM_TYPE + "'",
null, Contacts.DISPLAY_NAME_PRIMARY + " ASC");
Проблема с использованием этого запроса заключается в том, что результат содержит строки, которые не соответствуют контакту в моей локальной адресной книге. Вероятно, я использовал эти адреса электронной почты раньше, но не сохранил их в своей адресной книге.
Я уже пробовал другой подход, когда я сделал запрос на Contacts.CONTENT_URI
с Contacts._ID
. Этот идентификатор используется в качестве внешнего ключа для сопоставления контактов во втором запросе с их электронными письмами. Решением был вложенный курсор, а время выполнения было очень медленным. Для сотни контактов запрос соответствовал более двух секунд. Это причина для использования асинхронного CursorLoader
, но я хочу избежать этого, если это возможно.
Какие-либо предложения? заранее спасибо
#Редактировать 1:
К сожалению, оба решения не архивируют желаемое улучшение.
Например, когда я пишу новое электронное письмо на ранее неизвестный адрес с помощью своего приложения Gmail, после этого адрес отображается в обоих запросах с идентификатором контакта, но не в моей обычной адресной книге. Такого рода «контакты» наводняют мой запрос.
Может ли это быть связано со значением ContactsContract.CommonDataKinds.Email.TYPE?
#Редактировать 2:
Я нашел интересный флаг Contacts.IN_VISIBLE_GROUP + "=1"
. Кажется, фильтрует нежелательные адреса. Есть ли у кого-нибудь опыт с этим? Я не хочу сильно фильтровать.