2010-12-27 3 views
0

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

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

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

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

/edit: Возможно, я не сделал себя достаточно ясным. I может захватить ContactList, через 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();

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

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

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

ответ

0

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

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

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

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

+0

Дело в том, что я wan't закодировать синхронизации-ап и «контакты на высшем уровне» таблицы не обеспечивают достаточно информации о контакте, поэтому мне нужно придерживаться необработанных контактов. И вторая причина в том, что когда мне нужно создать новый контакт, мне нужно знать, на какой учетной записи я должен его добавить. –

0

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

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

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

Как я вижу, вы должны установить Account_Type и имя_компьютера, как описано в API-ссылке: http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html –

Смежные вопросы