lio*_*_13 5 android android-contacts kotlin
我需要从 Android 设备查询我正在处理的项目的联系人,我需要以一种可以将应用程序中的实例链接到电话簿中的联系人的方式保存它们。
我发现每个联系人的CONTACT_ID(对_ID的引用)可能会在设备之间发生变化,因此如果我切换到其他 Android 设备,该 ID 将无效。
一个临时解决方案是使用联系人的SOURCE_ID,它是一个字符串,唯一标识该行到其源帐户。解决方案非常好,因为如果联系人来自(例如)Google 帐户,它将在我拥有的每台设备上保持完全相同的 ID。问题是 -并非每个联系人都有 SOURCE_ID。
也可以使用它的数据作为过滤器来查询特定的联系人,这可能用作唯一的 ID,例如他的电话号码等……但是每条数据都有缺陷。例如:一个联系人可能有多个电话号码(这仍然可以)并且号码可以变化(例如:202-555-0105 与 +1-202-555-0105 相同,也与 ( 202) 555 0105 和 2025550105)。
编辑:也不是每个联系人都有电话号码,那又怎样?
因此,在解决问题之后 -
如何为 Android 电话簿中的联系人获取唯一 ID,以便它们在跨设备上是相同的?
注意:默认情况下可以在 IOS 上使用(请参阅文档)-
代表同一个人的不同帐户中的联系人可能会自动链接在一起。链接的联系人在 OS X 和 iOS 应用程序中显示为统一联系人。统一联系人是合并为一个联系人的一组链接联系人的内存中临时视图。
默认情况下,联系人框架返回统一联系人。每个获取的统一联系人 (CNContact) 对象都有自己的唯一标识符,该标识符不同于链接联系人集中的任何单个联系人的标识符。应使用其标识符重新获取统一联系人。
您正在寻找的是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()
Run Code Online (Sandbox Code Playgroud)
以下是您检索与 的联系方式的方法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()
}
Run Code Online (Sandbox Code Playgroud)
请注意,必须同步联系人,以免LOOKUP_KEY重新生成。
保证LOOKUP_KEY为每个联系人生成,但是,如果帐户未设置且未同步,则LOOKUP_KEY每当联系人被修改时,都会重新生成。
考虑到这一点,LOOKUP_KEY如果设备同步,您将始终拥有唯一的。它LOOKUP_KEY依赖于谷歌云,这可能与苹果使用的解决方案相同。
Android 设备不太可能没有 Google 帐户,因为大多数 Android 用户都依赖 Google 服务。
恐怕这是拥有唯一标识符的最佳方法,但是,如果您愿意,您可以将用户电话号码与其他联系方式结合起来进行哈希处理,但不能保证此方法有效,因为联系人可能会发生变化。如果您的用户已注册并且您将拥有他们的信息,那么您可以在后端检查哪些哈希值符合您的期望,然后根据您自己的同步进行工作。
如果您想尝试一下,我已经创建了一个示例应用程序,您可以在其中查看联系人并找到查找键以及使用查找键检索联系人。
我还建议您看看SyncAdapter。
| 归档时间: |
|
| 查看次数: |
279 次 |
| 最近记录: |