在 Android 中获取 RawContact 照片的 URI
Posted
技术标签:
【中文标题】在 Android 中获取 RawContact 照片的 URI【英文标题】:Get a URI for a RawContact photo in Android 【发布时间】:2011-09-24 09:38:35 【问题描述】:我知道我可以使用以下方法获取联系人照片的 URI:
Uri person = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
Uri photoUri = Uri.withAppendedPath(person, Contacts.Photo.CONTENT_DIRECTORY);
有没有办法为 RawContact 做同样的事情?
我试过了:
Uri person = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
Uri photoUri = Uri.withAppendedPath(person, Contacts.Photo.CONTENT_DIRECTORY);
但它不起作用......
我需要一个 URI 而不是实际的 blob 的原因是因为代码位于 AppWidget 中,并且在将数据从小部件传递到启动器时似乎有几个兆的硬性限制,所以我需要使用setImageViewUri 而不是 setImageViewBitmap。
谢谢。
【问题讨论】:
您是否设法获得了 RawContact 照片?我也在寻找一种方法来获得它,但没有成功...... 【参考方案1】:这里是您的问题的解决方案。 Solution
我也遇到了同样的问题,在研究并阅读了 android 的源代码之后,我得到了它。现在可能为时已晚(对您而言),但无论如何都在这里。
public InputStream getBitmapFromUri(String rawContactId) throws FileNotFoundException
final Uri photoUri = Uri.withAppendedPath(
ContentUris.withAppendedId(RawContacts.CONTENT_URI, Long.valueOf(rawContactId)), RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
final InputStream imageStream = contentResolver.openInputStream(photoUri);
return imageStream;
【讨论】:
很好的发现!! :) 我读过一些关于 ContactsContract.RawContacts.DisplayPhoto 的文章,好像他们只在 API 14 上添加了这个,所以这可以解释为什么我从来没有发现它在文档中挖掘。【参考方案2】:我认为您需要直接访问“数据”表(ContactsContract.Data)来获取原始联系人的照片。 'data15' 列应该存储它。 Contacts.Photo.CONTENT_DIRECTORY 是联系人的主要照片路径,但默认情况下未为原始联系人提供此类路径。
【讨论】:
谢谢,但是 data15 是照片 blob 本身,所以我不能在上面使用 setImageViewUri...我能以某种方式获取那个 blob 的 URI 吗?【参考方案3】:如果您正在查询RawContacts
,您还可以将RawContacts.CONTACT_ID
添加到投影中,然后您可以以相同的方式构建URI:
long contactId = cursor.getLong(cursor.getColumnIndex(RawContacts.CONTACT_ID));
Uri person = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
Uri photoUri = Uri.withAppendedPath(person, Contacts.Photo.CONTENT_DIRECTORY);
【讨论】:
感谢@Guihji,但我需要访问 RawContact 的照片,而不是该联系人的选定主要联系人。我需要原始照片,因为在某些设备上,第三方应用程序无法访问 Facebook 同步的照片,所以我首先尝试获取主照片,如果我无法访问它(意味着它是 FB 照片),我会尝试获取另一张照片来自 Raw's 之一。【参考方案4】:一年过去了,还没有真正的答案,我猜是做不到了。
我最终使用setImageBitmap
而不是setImageUri
,
并为位图使用缩放代码以尽可能减少内存消耗(一个请求越来越小的位图大小直到大小低于 const 限制的循环)。
这似乎对我们几乎所有的用户都有效,有些人仍然抱怨小部件中缺少图片,但我会说不到 2-3% 的用户这是可以接受的。
【讨论】:
以上是关于在 Android 中获取 RawContact 照片的 URI的主要内容,如果未能解决你的问题,请参考以下文章