1

我的应用程序中有一个联系人选择器,它返回一个联系人,然后我将一些信息存储到 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

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

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

4

2 回答 2

2

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

编辑:
根据文档

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

所以你不应该对 URI 进行编码或解码。照原样通过。

于 2013-01-10T05:33:49.477 回答
1

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

就像是:

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

我认为android需要contactid来确定它是否已经改变,尽管文档说明它是可选的。

希望这可以帮助。

于 2013-01-15T00:36:30.303 回答