使用API​​ 8以后获取用户/所有者配置文件联系人URI和用户图像

时间:2013-04-23 07:09:31

标签: android uri contacts contactscontract

从API 14(Android 4.0以后)开始,我可以使用ContactsContract.Profile.CONTENT_URI获取手机用户的联系人资料Uri,并通过它获取他们的头像/联系人照片。

我想知道如何从API 8(Android 2.2)到API 13执行此操作。我只需需要照片(因此,如果没有用户配置文件联系人的概念,则可以到API 14),虽然我不确定它实际上是否可能。

1 个答案:

答案 0 :(得分:6)

<2> Pre API 14,API 14之前没有用户配置文件的概念。

这意味着它不仅仅是在4.0之前的设备上运行时找到替换ContactsContract.Profile.CONTENT_URI的替代方案的情况。你真的必须实施一种解决方法。

解决方案不佳(A):使用SIM电话号码

如果用户已将自己添加为联系人,则可以按号码查找该联系人信息(包括他们的照片/头像),就像任何其他联系人一样。可以使用

从SIM中检索用户的电话号码
((TelephonyManager)getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE)).getLine1Number();

获得号码后,您可以使用查询查找,例如

// Use PhoneLookup.PHOTO_URI from API 11 onwards for more direct lookup
final String[] proj = { PhoneLookup.DISPLAY_NAME, 
                        PhoneLookup._ID,
                        PhoneLookup.PHOTO_ID };
Cursor c = cr.query(Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
                                         Uri.encode(number)),
                    proj, null, null, PhoneLookup.DISPLAY_NAME);

在您移动光标并检索相应的PHOTO_IDPHOTO_URI后,如果它存在,您可以构建正确的URI,如下所示:

// I assume local variables long photoId or String photoUriString
Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI,
                                          photoId);
// Just use Uri.parse(photoUriString); from API 11 onwards     

然而,此方法存在一些问题:

  • 并非所有运营商都将电话号码存储在他们的SIM卡中。
  • 并非所有手机都可以写入SIM的该部分。
  • 并非所有写入该部分的手机都会以Android可用的格式执行此操作。

稍微更好的解决方案(B):在您的应用程序中添加用户头像选项

为用户实施一种方式,选择图像作为其个人资料照片/头像,作为应用程序中的选项或设置。这是合理的直接实现,但强制用户手动添加头像,如果他们想在您的应用程序中使用

我不想重新发明轮子,所以这里是good starting point for selecting an image。您应该保存适当大小的图像版本,而不仅仅是用户选择返回的URI,以防更改,移动或删除源图像。

您可能希望在API 14及更高版本的设备中同时使用此功能,因为它允许用户拥有特定于您的应用程序的不同头像。

替代解决方案(C):A和B

为什么要这么麻烦?为什么不只是B?

考虑两者兼顾,因为某些SIM卡包含其电话号码的用户可能已将自己添加为联系人(我相信2.3 SMS应用程序尝试查找SIM号码),我相信他们会非常感谢他们不必手动设置一个头像。让用户自动完成额外的工作并不是一件好事。


我最初添加A只是为了测试我们正在测试的旧设备的部分功能,然后稍后添加B.