2014-01-16 2 views
1

Загрузка изображений с помощью Picasso, похоже, так просто, пока я не попал в этот блокпост. Не знаю, почему! Я могу загружать фотографии из контактов через PHOTO_URI, если у контактов есть только миниатюра, или, если я попрошу специально указать PHOTO_THUMBNAIL_URI.Пикассо загружает PHOTO_THUMBNAIL_URI, но не PHOTO_URI

@Override 
    public void bindView(View view, Context context, Cursor cursor) { 

     ImageView icon = (ImageView)view.findViewById(R.id.ContactImage); 
     String photoUri = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI)); 

     if (photoUri == null) { 
      icon.setImageDrawable(null); 
     } else { 
      Picasso.with(context).load(photoUri).into(icon); 
     } 
    } 

Для чего это стоит: если я использую Picasso.with(context).load(photoUri).placeholder(R.drawable.placeholder).error(R.drawable.error).into(icon); тогда я вижу замещающее изображение на месте каждого контакта, который имеет высокое разрешение изображения. Я никогда не вижу «ошибки». Если я вернусь к использованию только icon.setImageURI(Uri.parse(photoUri));, то я снова увижу фотографии с высоким разрешением. (Но у меня нет притягательного загрузчика кэширования асинхронного изображения!)

UPDATE: Благодаря @copolii и его ответы ниже, следующие в настоящее время работают безотказно с Пикассо 2.1.1:

@Override 
public void bindView(View view, Context context, Cursor cursor) { 

    Long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); 
    Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id); 
    String photoUri = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI)); 

    ImageView icon = (ImageView)view.findViewById(R.id.ContactImage); 

    if (photoUri == null) { 
     icon.setImageDrawable(null); 
    } else { 
     Picasso 
      .with(context) 
      .load(contactUri) 
      .into(icon); 
    } 

} 

Этих загружает фотографию с более высоким разрешением, если она есть, а если нет, отображает фотографию с низким разрешением, и если для контакта нет фотографии, для нее установлен пустой/нулевой.

ответ

4

Вы пытались использовать contact uri?

Этот последний логический параметр в openContactPhotoInputStream обещает предоставить вам фотографию высокого разрешения, если таковая имеется.

Вместо использования photo uri используйте contact uri или contact lookup uri.

UPDATE Поскольку вопрос был дан ответ, я, хотя я бы разместить соответствующие подробности здесь: Небольшой тест приложение размещено здесь (Вы должны Android Studio): https://github.com/copolii/PicassoContactsTest

Если вы установили как a placeholder и значок error, для контактов, которые не имеют изображения, отображается значок error. Я бы рекомендовал установить социальный парень лица в качестве вашего владельца места и без значка ошибки. Таким образом, ваш держатель места остается включенным, если у контакта нет изображения.

Если вы сделать хотят провести различие между этими двумя, выберите значок ошибки с выше в виде (т.е. не использовать большой красный OMFG индикатора ошибки).

--- Предыдущая Содержание ---

Позвольте мне знать, если это помогает.

Я сделал работу для контактов фото загрузки, и если я что-то отсутствует, вы должны получить высокое разрешение изображения (API 14+) автоматически:

if (SDK_INT < ICE_CREAM_SANDWICH) { 
    return openContactPhotoInputStream(contentResolver, uri); 
} else { 
    return openContactPhotoInputStream(contentResolver, uri, true); 
} 

Кажется, что openContactPhotoInputStream не как PHOTO_URI.

Android Docs: openContactPhotoInputStream

Если URIs различимы я могу легко добавить поддержку PHOTO_URI, а также (у меня есть, чтобы узнать, как загрузить это первый, хотя).Я уже определить, если данный URI является фотографиями контакта URI или поиск URI контакта (более старые версии Android не любят подстановки URIs кормили в openContactPhotoInputStream так что я должен разыменовать поиска URI в контакт uri перед тем, как передать его openContactPhotoInputStream).

Надеюсь, это поможет.

+0

Когда я пользуюсь PHOTO_URI, но контакт не имеет фотографии с высоким разрешением, он возвращает URI, такие как 'content: // com.android.contacts/contacts/38/photo', и он работает и отображается просто отлично. Но если у них есть фотография с высоким разрешением, она возвращает URI, сформированный как 'content: // com.android.contacts/display_photo/5', и это когда я ничего не получаю, или, если задано, заполнителя. – courtlandj

+0

И, чтобы быть понятным, я получаю только фотографию с низким разрешением, если я использую PHOTO_THUMBNAIL_URI, хотя я запускаю KitKat. Определенно выше ICS. – courtlandj

+0

ОК, спасибо. это полезная информация. Кажется, что 'openContactPhotoInputStream' не может обрабатывать uris, например' content: // com.android.contacts/display_photo/5' . Я попробую в маленьком тестовом приложении и посмотрю, чего не хватает. – copolii

 Смежные вопросы

  • Нет связанных вопросов^_^