Android手机联系人是否存在全局统一的唯一标识符?
结论
Android 系统确实为每一个联系人分配了全局统一的唯一标识符,你遇到的同个联系人查询返回不同ID的问题,是用错了查询字段导致的。
问题成因
你当前代码查询Email.ContentUri、StructuredPostal.ContentUri这类CommonDataKinds下属子URI时,取的ContactsContract.Contacts.InterfaceConsts.Id实际是单条数据记录的行ID:
- 邮箱、地址、电话这类联系人附属数据,都存在系统联系人库的
Data表中,每一条邮箱记录、每一条地址记录都是该表的独立行,自然有不同的行ID。你拿到的744是目标联系人对应邮箱条目的行ID,752是同个联系人对应地址条目的行ID,本来就不是联系人的全局ID。
正确的全局唯一ID用法
所有CommonDataKinds的子类URI都提供了CONTACT_ID字段,这个字段才是关联到联系人全局表的唯一标识符:
- 同一个联系人的所有邮箱、地址、电话等附属数据的
CONTACT_ID完全一致 - 该ID和直接查询
ContactsContract.Contacts表得到的联系人ID完全对应,只要联系人不被删除、不被系统合并,该ID不会发生变化
代码修改示例
以查询邮箱的代码为例,只要修改查询字段即可:
// 把projection的第一个字段从 ContactsContract.Contacts.InterfaceConsts.Id 替换为CONTACT_ID string[] projectionEmail = { ContactsContract.CommonDataKinds.Email.ContactId, // 替换为CONTACT_ID ContactsContract.Contacts.InterfaceConsts.DisplayName, ContactsContract.Contacts.InterfaceConsts.PhotoUri, ContactsContract.CommonDataKinds.Email.Address };
查询地址时同理,替换为ContactsContract.CommonDataKinds.StructuredPostal.ContactId即可,此时拿到的ID就是同一个联系人的统一ID。
内容的提问来源于stack exchange,提问作者luigivampa
相关产品推荐
相关产品推荐

