2014-01-05 1 views
5

Я экспериментирую с использованием Universal Image Loader (https://github.com/nostra13/Android-Universal-Image-Loader) для отображения миниатюр в виде сетки. Я могу получить его, чтобы показывать эскизы изображений без проблем.Можно ли отображать миниатюры изображений с помощью Universal Image Loader и как?

Как инициализировать ИЮОЖ в классе Application:

@Override 
public void onCreate() { 
    super.onCreate(); 
    initUil(); 
} 

private void initUil() { 
    DisplayImageOptions displayOptions = new DisplayImageOptions.Builder() 
      .cacheInMemory(true) 
      .cacheOnDisc(true) 
      .build(); 

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) 
      .taskExecutor(ThreadPool.getExecutorService()) 
      .defaultDisplayImageOptions(displayOptions) 
      .build(); 

    ImageLoader.getInstance().init(config); 
} 

Как я использую его для отображения миниатюр:

public class MediaCursorAdapter extends SimpleCursorAdapter implements Filterable { 
    @Override 
    public void bindView(View rowView, Context context, Cursor cursor) { 
     String contentUri = getContentUri(cursor); 

     ImageView imgThumb = (ImageView) rowView.findViewById(R.id.imgThumb); 

     ImageLoader.getInstance().displayImage(contentUri, imgThumb); 
    } 
} 

Часть кода для простоты опущены. contentUri может быть либо URI изображения, либо видео URI, в обоих случаях он имеет вид content://...

Можно ли отображать видео эскизы из URI видеоконтента с использованием этой библиотеки? Как?

ответ

10

Хорошо, я понял. ImageLoaderConfiguration имеет опцию, где вы можете передать декодер изображения.

Вот как я изменил инициализацию:

ImageDecoder smartUriDecoder = new SmartUriDecoder(getContentResolver(), new BaseImageDecoder(false)); 

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) 
      .taskExecutor(ThreadPool.getExecutorService()) 
      .defaultDisplayImageOptions(displayOptions) 
      .imageDecoder(smartUriDecoder) 
      .build(); 

И в SmartUriDecoder класс:

public class SmartUriDecoder implements ImageDecoder { 
    private final ContentResolver m_contentResolver; 
    private final BaseImageDecoder m_imageUriDecoder; 

    public SmartUriDecoder(ContentResolver contentResolver, BaseImageDecoder imageUriDecoder) { 
     if (imageUriDecoder == null) { 
      throw new NullPointerException("Image decoder can't be null"); 
     } 

     m_contentResolver = contentResolver; 
     m_imageUriDecoder = imageUriDecoder; 
    } 

    @Override 
    public Bitmap decode(ImageDecodingInfo info) throws IOException { 
     if (TextUtils.isEmpty(info.getImageKey())) { 
      return null; 
     } 

     String cleanedUriString = cleanUriString(info.getImageKey()); 
     Uri uri = Uri.parse(cleanedUriString); 
     if (isVideoUri(uri)) { 
      return makeVideoThumbnail(info.getTargetSize().getWidth(), info.getTargetSize().getHeight(), getVideoFilePath(uri)); 
     } 
     else { 
      return m_imageUriDecoder.decode(info); 
     } 
    } 

    private Bitmap makeVideoThumbnail(int width, int height, String filePath) { 
     if (filePath == null) { 
      return null; 
     } 
     Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail(filePath, MediaStore.Video.Thumbnails.MINI_KIND); 
     Bitmap scaledThumb = scaleBitmap(thumbnail, width, height); 
     thumbnail.recycle(); 
     return scaledThumb; 
    } 

    private boolean isVideoUri(Uri uri) { 
     String mimeType = m_contentResolver.getType(uri); 
     return mimeType.startsWith("video/"); 
    } 

    private String getVideoFilePath(Uri uri) { 
     String columnName = MediaStore.Video.VideoColumns.DATA; 
     Cursor cursor = m_contentResolver.query(uri, new String[] { columnName }, null, null, null); 
     try { 
      int dataIndex = cursor.getColumnIndex(columnName); 
      if (dataIndex != -1 && cursor.moveToFirst()) { 
       return cursor.getString(dataIndex); 
      } 
     } 
     finally { 
      cursor.close(); 
     } 
     return null; 
    } 

    private Bitmap scaleBitmap(Bitmap origBitmap, int width, int height) { 
     float scale = Math.min(
       ((float)width)/((float)origBitmap.getWidth()), 
       ((float)height)/((float)origBitmap.getHeight()) 
     ); 
     return Bitmap.createScaledBitmap(origBitmap, 
       (int)(((float)origBitmap.getWidth()) * scale), 
       (int)(((float)origBitmap.getHeight()) * scale), 
       false 
     ); 
    } 

    private String cleanUriString(String contentUriWithAppendedSize) { 
     // replace the size at the end of the URI with an empty string. 
     // the URI will be in the form "content://....._256x256 
     return contentUriWithAppendedSize.replaceFirst("_\\d+x\\d+$", ""); 
    } 
} 

В документации ИЮОЖ он говорит, что info.getImageKey() возвратит первоначальный URI, указанный для этого изображения, но с добавленный размер в конце, и я не мог найти способ получить исходный URI. Отсюда причина, по которой запах кода cleanUriString().

+0

Heads up, я опробовал этот подход, но я заметил, что большой замедляется, когда я генерировал эскизы для кучи медиа-элементов. Похоже, что UIL создает запись кэша для самого видео в каталоге данных, что означает много времени обработки и больших файлов (просмотр файлов 50 мб и т. Д.). Я все еще смотрю на это, но большое спасибо за интеграцию vids с uil. – Core

+0

Я тоже это заметил, но это происходит только в первый раз. Я предположил, что это потому, что эскизов для видео не было в «MediaStore», поэтому вызов 'ThumbnailUtils.createVideoThumbnail() заставил создать все миниатюры видео. Но я точно не знаю, как работает этот метод, поэтому я могу быть совершенно неправ. –

+0

Привет, я попытался создать свой собственный ImageDecoder на основе вашей работы, но когда я попытаюсь его использовать, декодер завершится с ошибкой: E/ImageLoader: null java.lang.NullPointerException? Почему? – mass441

0

Я бы выбрал этот ответ, кажется, этот человек решил, но он не использует универсальный загрузчик изображений.

Android: Is it possible to display video thumbnails?

+0

Я знаю, как создавать видео эскизы, но я ищу настраиваемое решение с кешированием и синхронизацией, а UIL кажется идеальным кандидатом. –

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