android - 从 API 8 开始获取用户/所有者个人资料联系 URI 和用户图像

标签 android uri contacts contactscontract

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

我想知道如何从 API 8 (Android 2.2) 到 API 13 做到这一点。我只需要照片(所以如果事先没有用户个人资料联系人的概念也没关系到 API 14),尽管我不确定它是否真的可行。

最佳答案

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。

关于android - 从 API 8 开始获取用户/所有者个人资料联系 URI 和用户图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16163088/

相关文章:

具有自定义属性的 Android 运行时资源覆盖

uri - 芝麻帆 openrdf 中类型化 URI 的使用

java - 创建 SEO 友好 URI 字符串的最佳方式

Android ContactsContract.Contacts.openContactPhotoInputStream 总是返回 null

python - 使用 oauth2.0 导入谷歌联系人

Android:如何使用 access_token 获取 facebook 用户图像

android - App Bundles (AAB) 是否自动使用 APK 签名方案 v2?

android - 在 Android 中共享 DefaultHttpClient。同步还是不同步?

c# - 回调URL匹配逻辑

java - 如何在 Android 手机中添加新联系人?