0

两天多来,我试图从内部地址簿(没有 facebook-、gmail- 或 twitter 联系人)中获取所有联系人的列表,以及他们的家人和名字。

我设法获得了一个包含所有联系人的列表,包括社交联系人。所以我查看了 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 等与他们的内部地址簿/电话簿同步。但他们设法将内部地址簿与所有其他帐户类型分开。所以必须有办法解决这个问题,但我不知道如何。请帮忙!

4

3 回答 3

2

该问题已在另一个线程中得到解答:Android 联系人应用程序上联系人的默认帐户类型/名称是什么?

于 2011-07-05T22:15:50.683 回答
0

你真的需要关心账户类型吗?
只需检索聚合的顶级联系人 - 而不是每个单独的原始联系人 - 并将其用作您的联系人列表。

例如,我有许多联系人被链接到一个联系人条目中,即使有多个潜在的原始联系人条目(例如来自我的 Google 帐户或 Facebook 等)。

如果您从我的电话簿中过滤掉所有单独的 Google 和 Facebook 联系人,您将一无所有。或者,如果您列出所有原始联系人,您将有 90 个联系人,其中有很多重复,而不是只有 50 个实际人。

因此,如果您只是检索聚合的联系人,则帐户类型应该无关紧要。

于 2010-12-27T22:16:03.997 回答
0

将联系人添加到手机通讯录时,您必须将ACCOUNT_NAME和设置ACCOUNT_TYPEnull。但是设备将这些值更改为一些适当的名称和类型,并且这些值对于不同的制造商是不一样的。

我不知道有什么真正好的方法可以过滤掉除通讯录帐户之外的所有帐户。我只看到实现这种行为的方法,但它们似乎都不太好:

  1. 您可以获取帐户列表并从此列表中过滤掉与帐户的任何联系人。SIM 中具有"com.anddroid.contacts.sim"帐户类型的联系人也必须被过滤掉。
  2. 您可以将虚假联系人保存到内部通讯录中,然后找到它并确定其帐户类型。它只能执行一次,例如在您的应用程序首次启动时。
于 2010-12-30T06:54:25.707 回答