Android联系人:查找键如何工作?
作者:互联网
除了联系人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.
那么他们如何做呢?
解决方法:
由于联系人ID可能会不时更改(例如,当联系人同步被破坏并且需要从服务器重新同步联系人时),Android引入了LookupKeys和LookupUris的概念.
LookupKey是一个不透明的值,可以由Contacts框架在内部将其转换为一组字段:contact-id,raw-contact-id,primary-display-names等.
每当您尝试通过LookupUri访问联系人时,系统会从Uri中提取LookupKey,尝试访问contact-id,并将其他字段(原始ID,姓名等)与找到的联系人进行比较(如果有)似乎是正确的联系人,它将返回它.
如果未找到联系人ID,或者系统检测到它是错误的联系人,则会对所有联系人进行查询以找到正确的联系人(使用存储在该键上的辅助字段).
因此,LookupKey充当一种快速方法,可以返回联系人ID,或在发生不良情况时进行搜索.
标签:android-contacts,android 来源: https://codeday.me/bug/20191111/2021674.html