Доступ к внутренней адресной книге - PullRequest
0 голосов
/ 27 декабря 2010

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

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

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

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

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

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.synthesis.ch/showthread.php?t=2057 У Synthesis AG была та же проблема со своим SyncML, что люди жаловались, что не могут синхронизироваться со своей внутренней адресной книгой / телефонной книгой только с gmail, facebook и т. Д. Но им удалось отделить внутреннюю адресную книгу от всех этих других типов учетных записей. Поэтому должен быть способ решить эту проблему, но я не могу понять, как это сделать. Пожалуйста, помогите!

Ответы [ 3 ]

2 голосов
/ 06 июля 2011
0 голосов
/ 30 декабря 2010

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

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

  1. Вы можете получить список учетных записей и отфильтровать любой контакт с учетной записью из этого списка.Контакты с SIM-карты с типом учетной записи "com.anddroid.contacts.sim" также должны быть отфильтрованы.
  2. Вы можете сохранить поддельный контакт во внутренней адресной книге, затем найти его и определить тип его учетной записи.Это можно сделать только один раз, например, при первом запуске вашего приложения.
0 голосов
/ 28 декабря 2010

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

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

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

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

...