【问题标题】:Access the internal addressbook访问内部通讯录
【发布时间】:2010-12-27 19:12:12
【问题描述】:

两天多来,我一直在尝试从内部通讯录(没有 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 等同步其内部地址簿/电话簿。 但是他们设法将内部地址簿与所有其他帐户类型分开。所以必须有办法解决这个问题,但我不知道如何。请帮忙!

【问题讨论】:

    标签: android contactscontract


    【解决方案1】:

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 重点是我不想编写同步应用程序,并且“顶级联系人”表没有提供有关联系人的足够信息,所以我需要坚持使用原始联系人。第二个原因是,当我需要创建一个新联系人时,我需要知道我必须在哪个帐户上添加它。
      【解决方案3】:

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

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

      1. 您可以获取帐户列表并从该列表中过滤掉与帐户的任何联系人。也必须过滤掉 SIM 中 "com.anddroid.contacts.sim" 帐户类型的联系人。
      2. 您可以将虚假联系人保存到内部通讯录中,然后找到它并确定其帐户类型。它只能执行一次,例如在您的应用首次启动时。

      【讨论】:

      猜你喜欢
      • 2011-10-16
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多