安卓联系人 : How does the lookup key works?

标签 android android-contacts

在联系人 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 -idraw-contact-idsprimary-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/

相关文章:

android - 如何在Android中实现图像失真效果

java - 使用 UIL 显示图像的 Pinterest 风格

安卓 WebView : Is there a way to know what the previous URL is?

android - ActionBar 图标不与我的图标一起显示

android - 如何取消contentresolver applyBatch?

Android - 应用已被拒绝,因为它主要面向 child

java - Intent Intents.Insert.ACTION 只在第一次有效吗?

Android联系人自定义字段

android - 如何检测联系人的默认电话号码(如果已设置)

android - 联系人 API 编辑群组