在联系人 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。
那他们是怎么做到的?
答案 0 :(得分:3)
由于联系ID可能会不时更改(例如,当联系人同步已损坏且联系人需要从服务器重新联系时),Android会引入LookupKeys和LookupUris的概念。
LookupKey
是opaque
值,Contacts
框架内部可以将其翻译为一组字段:contact-id
,raw-contact-ids
,{ {1}}等等。
每当您尝试通过primary-display-names
访问联系人时,系统会从Uri中提取LookupUri
,尝试访问LookupKey
,并比较其他字段(原始 - ids,名称等)到找到的联系人,如果看起来是正确的联系人,则返回它。
如果找不到contact-id
,或者系统检测到错误的联系人,则会对所有联系人进行查询以找到正确的联系人(使用存储在该密钥上的辅助字段)。
因此,contact-id
可以作为快速方法返回LookupKey
,或者在发生错误的情况下搜索它。