【发布时间】:2017-08-10 14:23:16
【问题描述】:
我一直在尝试了解 android 中的“联系人框架”是如何工作的。
我的用例类似于 WhatsApp 的好友列表:
- 如果添加了新联系人,则应调用同步适配器。
- 如果现有联系人的“姓名”发生更改,更改也应显示在我的列表中。
这是我需要帮助的第二个点。
现在,阅读所有文档,我认为它应该是这样工作的:
- 您使用
my_account_type向Account Manager注册了一个帐户。 - 您将
RawContact添加到my_account_name和my_account_type。 - 对于上述 RawContact 的
_id,将ContactsContract.Data与MIME值添加为Phone.CONTETN_TYPE_ITEM,并将phone number添加到该数据。 - 对于同一个 RawContact 的
_id,添加ContactsCtonract.Data和MIME' 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