【问题标题】:Android contacts: How does the lookup key works?Android 联系人:查找键如何工作?
【发布时间】:2017-07-09 05:56:43
【问题描述】:

除了联系人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。

那么他们是怎么做到的呢?

【问题讨论】:

    标签: android android-contacts


    【解决方案1】:

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

    LookupKey 是一个opaque 值,可以在内部由Contacts 框架转换为一组字段:contact-idraw-contact-idsprimary-display-names 等。

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

    所以LookupKey 可以作为一种快速方法来返回contact-id,或者在发生不好的情况时搜索它。

    【讨论】:

    • 如果我在本地存储联系人,什么情况下可以更改联系人 ID?
    • 这样一种情况是,如果同步提供商(例如 google)检测到其联系人之一损坏,它可能会清除设备中的所有联系人,并从服务器重新同步它们,导致所有 id 发生变化。
    • “LookupKey”在某些情况下会改变吗?还是稳定?什么是“不透明值”?
    • 请注意,查找键可以为空。如果您再次添加相同的联系人,它将为空。
    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    相关资源
    最近更新 更多