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

Posted

技术标签:

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

除了联系人idandroid 还获得了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】:

由于联系人 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”在某些情况下会改变吗?还是稳定?什么是“不透明值”? 请注意,查找键可以为空。如果您再次添加相同的联系人,它将为空。

以上是关于Android 联系人:查找键如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用联系人 id 和查找键获取 rawcontact id

怎么添加android新建联系人

如何使用 android 平台获取所有工作资料联系人

如何通过 LookUpKey 获取联系电话号码?

在 Android 上检索联系人图像

如何在 Contacts Android 中查找所有电话号码并为其添加前缀?