4

我知道我可以使用以下方法获取联系人照片的 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 而不是设置图像视图位图。

谢谢。

4

4 回答 4

2

这是您的问题的解决方案。解决方案

我也遇到了同样的问题,在四处挖掘并阅读了 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;
}
于 2014-02-19T13:06:42.820 回答
1

我认为您需要直接访问“数据”表(ContactsContract.Data)来获取原始联系人的照片。'data15' 列应该存储它。Contacts.Photo.CONTENT_DIRECTORY 是联系人的主要照片路径,但默认情况下未为原始联系人提供此类路径。

于 2011-08-28T08:25:52.623 回答
0

如果您正在查询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);
于 2011-10-11T13:32:00.367 回答
0

一年后并没有真正的答案,我想这是不可能的。

我最终使用了setImageBitmap而不是setImageUri,并为位图使用了缩放代码以尽可能减少内存消耗(一个请求越来越小的位图大小直到大小低于 const 限制的循环)。

这似乎对我们几乎所有的用户都有效,有些人仍然抱怨小部件中缺少图片,但我会说不到 2-3% 的用户,这是可以接受的。

于 2012-04-22T13:24:38.343 回答