其他分享
首页 > 其他分享> > Android联系人:查找键如何工作?

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