Получение только «обычных» контактов

#android #android-contacts #android-cursor

#Android #android-контакты #android-курсор

Вопрос:

В настоящее время в моем приложении я извлекаю все контакты с помощью запроса курсора followign.

 String[] columnsToReturn = new String[] {
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.DISPLAY_NAME_PRIMARY
};

Cursor contactsCursor = getActivity().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, columnsToReturn, null, null, null);
  

Это возвращает все контакты, включая Skype, WhatsApp и т. Д. Я не хочу этого. Мне нужны только «нормальные». Те, которые не предназначены ни для каких приложений, только те, которые хранятся в ваших аккаунтах Google. Как мне это сделать?

Кроме того, могу ли я исключить собственные записи пользователя? Например, мое имя появляется несколько раз в списке для всех моих разных адресов электронной почты.

Ответ №1:

ContactsContract.Contacts Таблица содержит «консолидированные» контакты.

… запись на совокупность необработанных контактов, представляющих одного и того же человека.

Если вы хотите запросить контакты определенной учетной записи или типа учетной записи, вам необходимо использовать RawContacts . Например, для контактов Google это будет:

 Cursor c = getContentResolver().query(
        RawContacts.CONTENT_URI,
        new String[] { RawContacts.CONTACT_ID, RawContacts.DISPLAY_NAME_PRIMARY },
        RawContacts.ACCOUNT_TYPE   "= ?",
        new String[] { "com.google" },
        null);

ArrayList<String> myContacts = new ArrayList<String>();
int contactNameColumn = c.getColumnIndex(RawContacts.DISPLAY_NAME_PRIMARY);
while (c.moveToNext())
{
    // You can also read RawContacts.CONTACT_ID to read the
    // ContactsContract.Contacts table or any of the other related ones.
    myContacts.add(c.getString(contactNameColumn));
}