2011-06-28 4 views
4

Я знаю, что могу получить URI из фото контакта, используя:Получить URI для фото RawContact в Android

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 вместо фактического сгустка происходит потому, что код находится в AppWidget и кажется как там есть очень жесткий предел в несколько мегабайт при передаче данных из виджета в пусковую установку, поэтому мне нужно использовать setImageViewUri, а не setImageViewBitmap.

Спасибо.

+0

Удалось ли вам получить фотографию RawContact? Я также ищу способ получить его, но не успеваю ... – dazito

ответ

2

Вот решение проблемы. 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; 
} 
+0

Приятная находка! :) Я немного читал о ContactsContract.RawContacts.DisplayPhoto, похоже, что они добавили это только в API 14, так что это могло бы объяснить, почему я никогда не нашел его в документах. – marmor

1

Мне кажется, вам нужно напрямую получить доступ к таблице данных (ContactsContract.Data), чтобы получить фотографию для сырых контактов. Столбец 'data15' должен хранить его. Contacts.Photo.CONTENT_DIRECTORY - основной путь к контакту контакта, но такой путь не предоставляется для сырых контактов по умолчанию.

+0

Спасибо, но data15 - это сама фотография blob, поэтому я не могу использовать setImageViewUri на ней ... могу ли я как-то получить URI этого blob ? – marmor

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); 
+0

Спасибо @Guihji, но мне нужно получить доступ к фотографии RawContact, а не выбранному первичному для этого контакта. Мне нужно raw, потому что на некоторых устройствах синхронизированные фотографии Facebook недоступны для сторонних приложений, поэтому я сначала пытаюсь получить основной, если я не могу получить к нему доступ (это означает, что это фотография FB), я пытаюсь получить еще одну фотографию от одного из Raw's. – marmor

0

Через год и не реальный ответ, я предполагаю, что это не может сделайте.

Я закончил с использованием setImageBitmap вместо setImageUri, и используется код масштабирования для точечного рисунка, чтобы уменьшить потребление памяти как можно больше (цикл, который запрашивает меньшие и меньшие размеры растрового изображения до тех пор, размер не находится в константной пределе).

это, казалось, хорошо работает почти для всех наших пользователей, некоторые все еще жалуются на недостающие фотографии в виджетах, но я бы сказал, что менее 2-3% наших пользователей, которые являются приемлемыми.