Android 联系人:查找键如何工作?
Posted
技术标签:
【中文标题】Android 联系人:查找键如何工作?【英文标题】:Android contacts: How does the lookup key works? 【发布时间】:2017-07-09 05:56:43 【问题描述】:除了联系人id,android 还获得了LOOK_UP 键。由于联系人的id是可以改变的,所以可以通过LOOK_UP键获取用户uri。
public static Uri lookupContactUri(String lookup, Context context)
ContentResolver contentResolver = context.getContentResolver();
Uri lookupUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookup);
return ContactsContract.Contacts.lookupContact(contentResolver, lookupUri);
但是它是如何工作的呢? Contacts.lookupContact
的源代码并没有详细说明实际的实现。那么谁能解释一下他们是如何做到这一点的?
/**
* Computes a content URI (see @link #CONTENT_URI) given a lookup URI.
* <p>
* Returns null if the contact cannot be found.
*/
public static Uri lookupContact(ContentResolver resolver, Uri lookupUri)
if (lookupUri == null)
return null;
Cursor c = resolver.query(lookupUri, new String[]Contacts._ID, null, null, null);
if (c == null)
return null;
try
if (c.moveToFirst())
long contactId = c.getLong(0);
return ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
finally
c.close();
return null;
我测试的另一件事是使用 ContactsContract.AggregationExceptions 合并两个联系人,然后挖掘联系人 uri。两个 LOOK_UP 键都产生了与预期相同的联系人 uri。
那么他们是怎么做到的呢?
【问题讨论】:
【参考方案1】:由于联系人 ID 可能会不时更改(例如,当联系人同步损坏并且联系人需要从服务器重新同步时),Android 引入了 LookupKeys 和 LookupUris 的概念。
LookupKey
是一个opaque
值,可以在内部由Contacts
框架转换为一组字段:contact-id
、raw-contact-ids
、primary-display-names
等。
每当您尝试通过 LookupUri
访问联系人时,系统都会从 Uri 中提取 LookupKey
,尝试访问 contact-id
,并比较其他字段(原始 ID、姓名等)。 ) 到找到的联系人,如果它看起来是正确的联系人,它会返回它。
如果没有找到contact-id
,或者系统检测到它是错误的联系人,则会对所有联系人进行查询以找到正确的联系人(使用存储在该键上的辅助字段)。
所以LookupKey
可以作为一种快速方法来返回contact-id
,或者在发生不好的情况时搜索它。
【讨论】:
如果我在本地存储联系人,什么情况下可以更改联系人 ID? 这样一种情况是,如果同步提供商(例如 google)检测到其联系人之一损坏,它可能会清除设备中的所有联系人,并从服务器重新同步它们,导致所有 id 发生变化。 “LookupKey”在某些情况下会改变吗?还是稳定?什么是“不透明值”? 请注意,查找键可以为空。如果您再次添加相同的联系人,它将为空。以上是关于Android 联系人:查找键如何工作?的主要内容,如果未能解决你的问题,请参考以下文章