Android 3.0 - Как получить ВСЕ контакты через ContactsContract

Я работаю над приложением Android Honeycomb (v3.0), которое требует отображения ВСЕХ контактов, хранящихся в учетной записи Google, зарегистрированной на устройстве. Одна из проблем, с которыми я сталкиваюсь, заключается в том, что я могу получить только те контакты, которые доступны в «Моих контактах», «Помеченные в Android» и «Другие контакты». Я также хотел бы иметь возможность извлекать контакты из «Каталога». Я считаю, что раздел «Каталог» — это функция, предоставляемая Google организациям и компаниям, которые хотят предоставить каталог всех участников/сотрудников в своих доменах другим. Пожалуйста, посмотрите на скриншот ниже:

Каталог

Пока у меня есть следующая строка в моем файле манифеста:

<uses-permission android:name="android.permission.READ_CONTACTS" />

Я пробовал использовать этот код:

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
while (cursor.moveToNext()) { 
    String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
} 
cursor.close();

В моем случае «Мои контакты» и «Помеченные в Android» пусты. Тем не менее, (1) контакт в «Другие контакты» получается. Однако «Каталог» содержит сотни контактов, которые не извлекаются.

Мой вопрос: есть ли способ убедиться, что контакты в «Каталоге» также извлекаются? Я знаю, что могу просто скопировать контакты с помощью веб-браузера, а затем синхронизировать их с устройства, но если в "Справочник" добавляется новый контакт, мне пришлось бы каждый раз делать это вручную, так что для меня это не лучший выбор. Пожалуйста, порекомендуйте.


comment
developer.android.com/resources/samples/ContactManager/   -  person VicVu    schedule 24.01.2012
comment
Я только что попробовал код в функции getContacts() (файл ContactManager.java), но в итоге нет записей, независимо от того, что я установил для mShowInvisible.   -  person BVB    schedule 24.01.2012
comment
Настройка String selection = null; вернула тот же результат, что и у меня изначально с кодом, который я упомянул.   -  person BVB    schedule 24.01.2012
comment
После поиска ответа и не найдя его, я в итоге скопировал контакты из каталога в «Мои контакты». Жаль, что это приходится делать вручную.   -  person BVB    schedule 29.01.2012


Ответы (1)


посмотрите на следующий код

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
          public class TestContacts extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
            null, null, null);
    if (cur.getCount() > 0) {
        while (cur.moveToNext()) {
            String id = cur.getString(cur
                    .getColumnIndex(ContactsContract.Contacts._ID));
            String name = cur
                    .getString(cur
                            .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
      if (("1")
                    .equals(cur
                            .getString(cur
                                    .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))) {
                Cursor pCur = cr.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = ?", new String[] { id }, null);
                int i = 0;
                int pCount = pCur.getCount();
                String[] phoneNum = new String[pCount];
                String[] phoneType = new String[pCount];
                while (pCur.moveToNext()) {
                    phoneNum[i] = pCur
                            .getString(pCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    phoneType[i] = pCur
                            .getString(pCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));

                    i++;
                }
            }
person Ronak Mehta    schedule 14.02.2012
comment
Я думаю, что Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); не сможет запросить Каталог. Кажется, я пробовал это раньше. - person BVB; 15.02.2012
comment
Мне не удалось найти мирного решения этой проблемы. Обходной путь, который я использовал, заключался в том, чтобы вручную добавлять контакты из каталога в «Мои контакты». Это заставит код, который вы разместили, работать нормально (мой оказался немного другим, но идея та же). Конечно, если бы в Справочнике появилась новая запись, ее пришлось бы переместить вручную. Я сообщу, если найду лучший способ сделать это. - person BVB; 06.06.2012
comment
@BVB Тем временем вы нашли лучшее решение? - person Danilo Bargen; 27.07.2015
comment
Я не касался этой проблемы пару лет назад и, к сожалению, не смог найти лучшего решения. - person BVB; 27.07.2015