【问题标题】:Storing and retrieving contacts in android在android中存储和检索联系人
【发布时间】:2012-06-25 11:00:19
【问题描述】:

我的应用中有一个联系人选择器,它返回一个联系人,然后我将一些信息存储到 sharedPreferences 中。在共享首选项中,我使用查找键来保存数据(正如 android 文档所建议的那样)

这部分看起来一切都很好,我得到并存储了查找键。

然后我的问题是我来找回联系人,通过查找键查找联系人有时似乎返回 null

以下详细信息来自联系人选择器

 Contact lookup key from the contact picker: 850i%2bw7vj56otre6eqa9b9t7wa%3d%3d  
 Contact id: 2958

然后我尝试使用以下代码根据查找键查找联系人以获取联系人 ID:

Uri lookupUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, Uri.encode("850i%2bw7vj56otre6eqa9b9t7wa%3d%3d"));
Uri res = ContactsContract.Contacts.lookupContact(context.getContentResolver(), lookupUri);

执行此操作后,“res”为空,即使我知道该 id 来自联系人选择器是有效的。

在查找中添加一些记录 res uri 是:

content://com.android.contacts/contacts/lookup/850i%252bw7vj56otre6eqa9b9t7wa%253d%253d

哪个(一旦编码)是我认为应该的。 谁能发现我做错了什么?

问题是,它适用于大多数人(包括我自己),但有些人遇到了这个问题。

【问题讨论】:

    标签: android android-contacts


    【解决方案1】:

    使用Uri.decode() 而不是Uri.encode()

    编辑:
    根据the documentation

    查找键应附加未编码 - 它存储在编码 表单,准备在 URI 中使用。

    因此,您不应该对 URI 进行编码或解码。照原样通过。

    【讨论】:

    • 谢谢,我也没有运气。当我从联系人选择器中获取值时是否应该进行编码,然后在进行查找时进行解码?这是一个棘手的测试,因为我必须与有问题并且自己无法轻松尝试的用户远程进行测试。我有一个与他们一起运行的测试应用程序。如果我让他们使用联系人选择器,它就会显示查找键。如果我然后遍历联系人并通过搜索其他联系人数据来获取该用户的详细信息,我可以看到相同的查找键,唯一的区别是一个是大写,另一个不是。
    • 我建议使用decode() 的原因是因为密钥已经被URI 编码(通过% 的存在来判断)。此外,密钥中的%2b 是十六进制的+%3d=。最后有 == 意味着密钥本身是 base64 编码的(并不重要)。无论如何,如果您 再次 对密钥进行 URI 编码,% 字符本身会以其十六进制形式编码为 %25,我觉得这是不对的。所以我建议改为解码。也许问题不止一个。
    • 使用文档中的信息编辑了答案。
    • 感谢您的信息。我试过完全不解码,但用户仍然没有成功。最后,因为查找键匹配(除了字符串的情况),我编写了一个后备例程来执行标准查找联系人方法调用,如果未找到数据,则直接使用查询查找键字段忽略案例查询。如果他们更改联系人数据不会太好,但它似乎只适用于一小部分用户的一小部分联系人。感谢您的建议。为什么它不适用于标准调用仍然是一个谜。
    【解决方案2】:

    作为 Dheeraj V.S.说,您不应该对已经编码的查找键进行编码或解码,因此重新编码可能会产生奇怪的结果。现在,我认为您的方法会导致 id 已更改的联系人出现问题。如果是这种情况,那么您应该尝试在查找 uri 中附加联系人的最后一个已知键,看看会发生什么。

    类似:

    Uri lookupUri = ContentUris.withAppendedId(Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupkey), contactid);
    

    我认为 android 需要 contactid 以确定它是否已更改,尽管文档声明它是可选的。

    希望这会有所帮助。

    【讨论】:

    • 我想我只是在遇到问题时才添加编码/解码,所以这一切都被删除了。您可以添加联系人 ID,但查找键的整个想法是,如果数据发生更改,它就会起作用。在恢复出厂设置或获得新手机后,联系人 ID 将被删除,而查找 ID 保持不变。在没有更改的情况下,添加联系人 ID 实际上只是一种更快的方法。在这种情况下,即使添加联系人 ID 也不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2013-09-16
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多