Доступ к внутренней адресной книге

Уже более двух дней я пытаюсь получить список всех контактов из внутренней адресной книги (без контактов facebook, gmail или twitter) с указанием их семьи и имени.

Мне удалось получить список со всеми контактами, включая социальные контакты. Итак, я посмотрел на account_types и увидел, что в моем HTC Desire все внутренние контакты адресной книги были из «com.htc.android.pcsc», и я подумал: «Отлично, мне просто нужно отфильтровать весь список». Но тогда все люди с мобильными телефонами Android, отличными от htc, не смогут использовать мое приложение, если я жестко запрограммирую этот фильтр.

Следующей идеей было позволить пользователю выбрать, какую учетную запись он хочет использовать, но, к сожалению, «com.htc.android.pcsc» не появился в списке, который я получил от AccountManager?!?

Итак, мой вопрос: есть ли какой-либо стандартный способ доступа к внутренней адресной книге? Я действительно застрял с этим, и любой намек высоко ценится!

/edit: Возможно, я недостаточно ясно выразился. Я могу получить список контактов с помощью API ContactsContract:

ArrayList phoneContacts = new ArrayList();   
String[] projection = new String[] {
    Data.MIMETYPE,
    ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
    ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME
   };
String selection =  Data.MIMETYPE+" = '"+ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE+"'";
Cursor cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, projection, selection, null, null);
while (cursor.moveToNext()) {
phoneContacts.add(...);
} 
cursor.close();

Но затем у меня есть контакты из всех типов учетных записей, таких как com.google / com.htc.socialnetwoork.facebook и т. д.

И мой вопрос: как я могу отфильтровать все эти социальные сети и контакты gmail, чтобы у меня был список контактов, которые только из моей внутренней адресной книги?

/edit2: я нашел пример, описывающий те же трудности, что и у меня: http://forum.synchronous.ch/showthread.php?t=2057 У Synthesis AG была такая же проблема с их SyncML, что люди жаловались, что они не могут синхронизировать свою внутреннюю адресную книгу/телефонную книгу только с gmail , facebook и т. д. Но им удалось отделить внутреннюю адресную книгу от всех этих других типов учетных записей. Так что должен быть способ решить эту проблему, но я не могу понять, как это сделать. Пожалуйста помоги!


person Christoph Haefner    schedule 27.12.2010    source источник


Ответы (3)


На вопрос был дан ответ в другом потоке: Какой тип/имя учетной записи используется по умолчанию для контактов в приложении контактов Android?

person Christoph Haefner    schedule 05.07.2011

Вам действительно нужно заботиться о типах учетных записей?
Просто извлеките агрегированные контакты верхнего уровня, а не каждый отдельный необработанный контакт, и используйте его в качестве списка контактов.

Например, у меня есть много контактов, которые связаны вместе в одну запись контакта, даже несмотря на то, что есть несколько базовых необработанных записей контактов (например, из моей учетной записи Google, Facebook и т. д.).

Если вы отфильтруете все отдельные контакты Google и Facebook из моей телефонной книги, вы останетесь ни с чем. Или, если вы перечислите все необработанные контакты, у вас будет 90 контактов со многими дубликатами вместо 50 реальных людей.

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

person Christopher Orr    schedule 27.12.2010
comment
Дело в том, что я не хочу кодировать синхронизацию, а таблица контактов верхнего уровня не предоставляет достаточно информации о контакте, поэтому мне нужно придерживаться необработанных контактов. И вторая причина в том, что когда мне нужно создать новый контакт, мне нужно знать, в какой аккаунт я должен его добавить. - person Christoph Haefner; 28.12.2010

Когда вы добавляете контакт в адресную книгу своего телефона, вы должны установить ACCOUNT_NAME и ACCOUNT_TYPE на null. Но устройство изменяет эти значения на какое-то подходящее имя и тип, и эти значения не одинаковы для разных производителей.

Я не знаю действительно хорошего способа отфильтровать все учетные записи, кроме учетной записи адресной книги. Я вижу только способы реализовать такое поведение, но оба они кажутся не очень хорошими:

  1. Вы можете получить список учетных записей и отфильтровать любой контакт с учетной записью из этого списка. Контакты с SIM-карты с типом аккаунта "com.anddroid.contacts.sim" тоже нужно отфильтровать.
  2. Вы можете сохранить поддельный контакт во внутреннюю адресную книгу, затем найти его и определить тип его учетной записи. Это можно сделать только один раз, например, при первом запуске вашего приложения.
person Michael    schedule 30.12.2010
comment
Насколько я понимаю, вы должны установить Account_Type и Account_Name, как описано в API-Reference: developer.android.com/reference/android/provider/ - person Christoph Haefner; 07.01.2011