你要找的是LOOKUP_KEY
一个不透明的值,其中包含有关如何在其行 ID 由于同步或聚合而更改时查找联系人的提示。
要让联系人LOOKUP_KEY 循环访问您的联系人,下面是一个示例:
注意:<uses-permission android:name="android.permission.READ_CONTACTS" /> 是必需的。
val contentUri = ContactsContract.Contacts.CONTENT_URI
val cursor = context?.contentResolver?.query(contentUri, null, null, null, null)
if (cursor != null) {
while (cursor.moveToNext()) {
val id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID))
val name =
cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY))
val lookupKey =
cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY))
}
}
cursor?.close()
以下是使用LOOKUP_KEY 检索联系人的方法:
val lookupKey = "0r1-3C263544104632"
val lookupUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey)
val uri = ContactsContract.Contacts.lookupContact(contentResolver, lookupUri)
val cursor = context?.contentResolver?.query(uri, null, null, null, null)
if (cursor != null) {
while (cursor.moveToNext()) {
val id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID))
val name =
cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY))
}
}
cursor?.close()
}
请注意,必须同步联系人才能避免重新生成LOOKUP_KEY。
保证为每个联系人生成LOOKUP_KEY,但是,如果未设置帐户且未同步帐户,则每当修改联系人时都会重新生成LOOKUP_KEY。
考虑到这一点,如果设备已同步,您将始终拥有唯一的 LOOKUP_KEY。 LOOKUP_KEY 依赖于 Google Cloud,这可能与 Apple 使用的解决方案相同。
Android 设备不太可能没有 Google 帐户,因为大多数 Android 用户都依赖 Google 服务。
恐怕这是拥有唯一标识符的最佳方法,但是,如果您愿意,您可以将用户电话号码与其他联系方式结合起来,但不能保证这种方法有效,因为联系人可能会改变.如果您的用户已注册并且您将获得他们的信息,那么您可以在后端检查哪些哈希值符合您的期望,然后根据您自己的同步工作。
如果你想玩玩,我已经创建了一个 sample app 实现,你可以在其中查看联系人并找到查找键以及使用查找键检索联系人。
我还建议你看看SyncAdapter。