Получить URI для фотографии RawContact в Android - PullRequest
4 голосов
/ 28 июня 2011

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

Спасибо.

Ответы [ 4 ]

2 голосов
/ 19 февраля 2014

Вот решение вашей проблемы. Решение

У меня тоже была та же проблема, и после того, как я покопался и прочитал исходный код 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;
}
1 голос
/ 28 августа 2011

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

0 голосов
/ 22 апреля 2012

Год спустя и никакого реального ответа, я думаю, что это не может быть сделано.

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

0 голосов
/ 11 октября 2011

Если вы запрашиваете 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);
...