我需要查询 Android 设备中的联系人,以便在我的项目中使用,并且需要以一种可以在应用程序实例和电话簿联系人之间建立关联的方式保存它们。
我发现每个联系人的 CONTACT_ID(引用了_ID)可能会在设备之间更改,因此如果我切换到其他 Android 设备,该 ID 将无效。一个临时解决方案是使用联系人的SOURCE_ID,它是一个字符串,可唯一地标识该行与其源帐户的联系。该解决方案非常好,因为如果联系人来自(例如)Google 帐户,则每个设备上都将保持完全相同的 ID。问题是 - 并非所有联系人都有 SOURCE_ID。
还可以使用其数据作为过滤器查询特定联系人,这可能起到唯一的 ID 作用,例如他的电话号码等...但是每个数据都有缺陷。例如:一个联系人可能有多个电话号码(这仍然可以接受),而且号码可能会有所不同(例如:202-555-0105 相当于 +1-202-555-0105,也相当于 (202) 555-0105 和 2025550105)。
编辑:并非所有联系人都有电话号码,那该怎么办呢?
我发现每个联系人的 CONTACT_ID(引用了_ID)可能会在设备之间更改,因此如果我切换到其他 Android 设备,该 ID 将无效。一个临时解决方案是使用联系人的SOURCE_ID,它是一个字符串,可唯一地标识该行与其源帐户的联系。该解决方案非常好,因为如果联系人来自(例如)Google 帐户,则每个设备上都将保持完全相同的 ID。问题是 - 并非所有联系人都有 SOURCE_ID。
还可以使用其数据作为过滤器查询特定联系人,这可能起到唯一的 ID 作用,例如他的电话号码等...但是每个数据都有缺陷。例如:一个联系人可能有多个电话号码(这仍然可以接受),而且号码可能会有所不同(例如:202-555-0105 相当于 +1-202-555-0105,也相当于 (202) 555-0105 和 2025550105)。
编辑:并非所有联系人都有电话号码,那该怎么办呢?
因此,面临这个问题 -
如何获取 Android 电话簿中联系人的唯一标识符,以便它们在跨设备时保持相同?
注意:IOS 默认情况下可以实现(参见 文档)-
表示同一人的不同帐户中的联系人可能会自动链接在一起。链接的联系人显示为统一的联系人,显示在 OS X 和 iOS 应用程序中。统一的联系人是合并到一个联系人中的一组链接联系人的内存中的临时视图。
默认情况下,Contacts 框架返回统一的联系人。每个获取到的统一联系人(CNContact)对象都有自己的唯一标识符,与集合中任何单个联系人的标识符都不同。应使用其标识符重新获取统一联系人。
LOOKUP_KEY
保证为每个联系人生成,但是如果该账户未同步,则在每次联系人被修改时LOOKUP_KEY
将会更改。考虑到这一点,如果设备已同步,您将始终拥有唯一的LOOKUP_KEY
。LOOKUP_KEY
依赖于 Google Cloud,这可能是 Apple 使用的相同解决方案。一个 Android 设备没有谷歌帐户并不同步的情况非常罕见。我已更新了答案,提供了更多信息。 - Rodrigo Queiroz