Android联系人:查找键如何工作?

时间:2017-02-20 04:10:53

标签: android android-contacts

在联系人 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 个答案:

答案 0 :(得分:3)

由于联系ID可能会不时更改(例如,当联系人同步已损坏且联系人需要从服务器重新联系时),Android会引入LookupKeys和LookupUris的概念。

LookupKeyopaque值,Contacts框架内部可以将其翻译为一组字段:contact-idraw-contact-ids,{ {1}}等等。

每当您尝试通过primary-display-names访问联系人时,系统会从Uri中提取LookupUri,尝试访问LookupKey,并比较其他字段(原始 - ids,名称等)到找到的联系人,如果看起来是正确的联系人,则返回它。 如果找不到contact-id,或者系统检测到错误的联系人,则会对所有联系人进行查询以找到正确的联系人(使用存储在该密钥上的辅助字段)。

因此,contact-id可以作为快速方法返回LookupKey,或者在发生错误的情况下搜索它。