在联系人 id 之上,Android 还获得了 LOOK_UP key 。由于联系人的 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。
他们是怎么做到的?
最佳答案
由于联系人 ID 会不时更改(例如,当联系人同步损坏并且需要从服务器重新同步联系人时),Android 引入了 LookupKeys 和 LookupUris 的概念。
LookupKey
是一个不透明
值,它可以在内部由Contacts
框架转换为一组字段:contact -id
、raw-contact-ids
、primary-display-names
等
每当您尝试通过 LookupUri
访问联系人时,系统都会从 Uri 中提取 LookupKey
,尝试访问 contact-id
,并将其他字段(原始 ID、姓名等)与找到的联系人进行比较,如果它看起来是正确的联系人,则将其返回。
如果未找到 contact-id
,或者系统检测到它是错误的联系人,则会对所有联系人进行查询以找到正确的联系人(使用存储在该键上的辅助字段)。
因此 LookupKey
充当返回 contact-id
或搜索它的快速方法,以防发生不良情况。
关于安卓联系人 : How does the lookup key works?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42336352/