【问题标题】:Working with android contact aggregation使用 android 联系人聚合
【发布时间】:2017-08-10 14:23:16
【问题描述】:

我一直在尝试了解 android 中的“联系人框架”是如何工作的。

我的用例类似于 WhatsApp 的好友列表:

  1. 如果添加了新联系人,则应调用同步适配器。
  2. 如果现有联系人的“姓名”发生更改,更改也应显示在我的列表中。

这是我需要帮助的第二个点。

现在,阅读所有文档,我认为它应该是这样工作的:

  • 您使用my_account_typeAccount Manager 注册了一个帐户。
  • 您将RawContact 添加到my_account_namemy_account_type
  • 对于上述 RawContact 的 _id,将 ContactsContract.DataMIME 值添加为 Phone.CONTETN_TYPE_ITEM,并将 phone number 添加到该数据。
  • 对于同一个 RawContact 的 _id,添加 ContactsCtonract.DataMIME' value asmy_custom_mime_type 并向其中添加应用特定数据。

现在,“联系人聚合器”根据 MIME=Phone.CONTENT_TYPE_ITEM 及其值聚合联系人,从而将 RawContact 与具有相同 Phone.CONTENT_TYPE_ITEM 值的所有其他联系人加入。

那么问题 1:这是实际发生的情况吗?

现在,如果上述情况属实,则在获取应用列表中的数据时,可以使用ContentProvider#query() 并查找my_custom_mime_type,并获取StructuredName.DISPLAY_NAME 以获取显示名称。该框架具有此StructuredName.DISPLAY_NAME,因为它已将MyApp 添加的联系人聚合到所有其他类似联系人。

问题 2:这种方式对我不起作用。相反,我将phone number 作为DIPLAY_NAME

我试图查看 WhatsApp 的 RawContact :

RawContact : WhatsApp - com.whatsapp - 87211 - 87210 - null
 Raw : WhatsApp count : 5
    >> DISPLAY_NAME for this : display_name_person
    >> vnd.android.cursor.item/name > display_name_person - 0 -  end_name - null - null - null - null - null - null
    >> vnd.android.cursor.item/vnd.com.whatsapp.profile > xxxxxxxxxxxx@s.whatsapp.net - 0 -  Message +91 xxxxx xxxxx - null - null - null - null - null - null
    >> vnd.android.cursor.item/vnd.com.whatsapp.voip.call > xxxxxxxxxxxx@s.whatsapp.net - 0 -  Voice call +91 xxxxx xxxxx - null - null - null - null - null - null
    >> vnd.android.cursor.item/vnd.com.whatsapp.video.call > xxxxxxxxxxxx@s.whatsapp.net - 0 -  Video call +91 xxxxx xxxxx - null - null - null - null - null - null
    >> vnd.android.cursor.item/phone_v2 > xxxxxxxxxx - 2 -  null - xxxxxxxxxxxxx - null - null - null - null - null

所以,你看,他们将DISPLAY_NAME 保存在 RawContact 的左侧,但是当从电话簿更新名称时如何更新该名称?而且,聚合功能是不是完全没用了?

【问题讨论】:

    标签: android android-contentprovider android-contacts


    【解决方案1】:
    1. 您不能相信Android 会自动将您的RawContacts 合并到所需的联系人中,这是不可靠的,例如,如果您有一对已婚夫妇作为两个不同的联系人,每个联系人都包含相同的家庭电话数字,Android 不应该合并这两者。 只有当两个 RawContact 之间的相似度超过某个阈值时,它才会自动聚合。

    您应该明确将您的新 RawContacts 与该 Contact 中的至少一个(最好是全部)现有 RawContacts 聚合,添加到您的操作中操作如下:

    ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI)
      .withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER)
      .withValue(AggregationExceptions.RAW_CONTACT_ID1, yourNewRawContactId)
      .withValue(AggregationExceptions.RAW_CONTACT_ID2, someExistingRawContactId)
      .build();
    
    1. 我认为您不需要将显示名称添加到您的RawContact,一旦您明确将其聚合到现有的Contact,它应该继承由其他一些RawContact 设置的主要显示名称

    【讨论】:

    • 显式聚合是已知的,但重点是,Signal 和 Whatsapp 等其他应用程序是这样做的吗?如果是,为什么他们在 RawContact 中添加了显示名称?
    • 我认为这与旧的 Android 设备有关,没有名称的 RawContacts 存在问题,请检查您的目标受众设备,看看是否适合您。
    • 此外,该输出中的87210 联系人的_id 是一个新的联系人_id,而不是应该与之聚合的那个。
    • 如果是旧版本,如果Display_name发生变化,如何更新它?
    • 顺便说一句,“RawContacts 的问题”是什么,你能指出一些参考吗?
    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2017-04-02
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多