【问题标题】:Get a URI for a RawContact photo in Android在 Android 中获取 RawContact 照片的 URI
【发布时间】: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 照片?我也在寻找一种方法来获得它,但没有成功......

标签: android photos rawcontacts


【解决方案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% 的用户这是可以接受的。

【讨论】:

    猜你喜欢
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多