Android контактный запрос - PullRequest
3 голосов
/ 23 июня 2010

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

В основном так:

public static final String SELECTION =
    "("+ContactsContract.Contacts.HAS_PHONE_NUMBER +"='1') OR " + RawContacts.ACCOUNT_TYPE + "='" + Constants.ACCOUNT_TYPE + "'";

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

Может кто-нибудь помочь мне здесь, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

Лучший способ прочитать необработанный контакт вместе со всеми связанными с ним данными - использовать каталог ContactsContract.RawContacts.Entity.Если в необработанном контакте есть строки данных, курсор сущности будет содержать строку для каждой строки данных.Если в необработанном контакте нет строк данных, курсор все равно будет содержать одну строку с необработанной информацией об уровне контакта.

Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
 Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY);
 Cursor c = getContentResolver().query(entityUri,
          new String[]{RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1},
          null, null, null);
 try {
     while (c.moveToNext()) {
         String sourceId = c.getString(0);
         if (!c.isNull(1)) {
             String mimeType = c.getString(2);
             String data = c.getString(3);
             //decide here based on mimeType, see comment later
         }
     }
 } finally {
     c.close();
 }

Вам нужно будет отфильтровать результат на основе mimeType

Например, если mimeType равен Phone.CONTENT_ITEM_TYPE, то в столбце DATA1 хранится номер телефона, но если тип данных равен Email.CONTENT_ITEM_TYPE, тогда DATA1 сохраняет адрес электронной почты.

Таким образом, вам не нужно будет использовать HAS_PHONE_NUMBER, поскольку вы будете напрямую перебирать элементы.

1 голос
/ 23 июня 2010

Возможно, вам следует использовать Email.CONTENT_URI, поскольку он содержит все записи данных типа "vnd.android.cursor.item/email_v2" MIME в сочетании с связанными необработанными контактами и агрегированными данными контактов .

...