在android中存储和检索联系人

时间:2012-06-25 11:00:19

标签: android android-contacts

我的应用程序中有一个联系人选择器,它返回一个联系人,然后我将几个信息存储到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”为null,即使我知道id有效,因为它来自联系人选择器。

在查询中输入一些日志记录:

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

我认为它应该是(曾经编码过的)。 谁能发现我做错了什么?

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

2 个答案:

答案 0 :(得分:2)

使用Uri.decode()代替Uri.encode()

修改
根据{{​​3}}:

  

查找键应该是未编码的 - 它存储在编码中   表单,可以在URI中使用。

所以你不应该编码或解码URI。按原样传递。

答案 1 :(得分:1)

作为Dheeraj V.S.说,你不应该编码或解码它已经编码的lookupkey,所以重新编码它可能会有奇怪的结果。现在我认为您的方法会导致ID更改的联系人出现问题。如果是这种情况,那么您应该尝试在查询uri中附加联系人的最后一个已知密钥,看看会发生什么。

类似的东西:

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

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

希望这会有所帮助。