使用 API 8 及更高版本获取用户/所有者个人资料联系人 URI 和用户图像
Posted
技术标签:
【中文标题】使用 API 8 及更高版本获取用户/所有者个人资料联系人 URI 和用户图像【英文标题】:Get user/owner profile contact URI and user image with API 8 onwards 【发布时间】:2013-04-16 07:09:17 【问题描述】:从 API 14(android 4.0 及更高版本)开始,我可以使用 ContactsContract.Profile.CONTENT_URI
获取手机所有者的联系人个人资料 Uri,并通过它获取他们的头像/联系人照片。
我想知道如何从 API 8 (Android 2.2) 到 API 13 做到这一点。我只需要照片(所以如果之前没有用户个人资料联系人的概念也可以到 API 14),尽管我不确定这实际上是否可行。
【问题讨论】:
我没有以前的 API 15 手机进行测试,但 API 8-13 中有用户照片这样的概念吗? 我不是 100% 确定 - 它可能是特定于手机的。 android.stackexchange.com/questions/5454/… 2.2 的模拟器当然似乎根本没有任何用户照片的概念。 @iskarjarak 你有什么解决办法吗?!我也面临同样的问题! @sirlate 我已经添加了我最终做的事情作为答案。我希望这会有所帮助。 【参考方案1】:在 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_ID
或PHOTO_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。
【讨论】:
以上是关于使用 API 8 及更高版本获取用户/所有者个人资料联系人 URI 和用户图像的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式在 Android 的 API 23 及更高版本中获取位置(纬度、经度)?
iOS 8 及更高版本(使用 Swift)应用程序是不是可以创建基于用户位置的自定义闹钟
Android Edittext 不能专注于 API 22(代码在 API 23 及更高版本上运行良好)
如何在 Equinox 3.10 及更高版本中获取所有已加载的包