在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用联系人 id 和查找键获取 rawcontact id

插入具有特定联系人 ID 的 RawContact

在 rawcontact 中插入自定义铃声(新联系人)

添加 RawContact 使其聚合到现有联系人

删除特定 RawContact 内容目录条目

如何在Android开发中获取SIM卡信息