2016-02-25 10 views
3

Я разрабатываю модуль, в котором мне нужно показать все видео с телефона в виде видео эскизов. Я взял BaseAdapter, чтобы показать все миниатюры видео в GridView. Единственная проблема заключается в том, что мне пришлось написать миниатюру извлечения видео из видеофайла в растровое изображение в getView() BaseAdapter.Загрузить Btimap видео эскизов из sdcard

((Activity) context).runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Bitmap bmThumbnail = ThumbnailUtils.createVideoThumbnail(
               videoValues.get(position).getFile() 
               .getAbsolutePath(), Thumbnails.MINI_KIND); 
       imageThumbnail.setImageBitmap(bmThumbnail); 
       bmThumbnail = null; 
    } 
    }); 

Я хочу загрузить это асинхронно с помощью некоторого загрузчика изображений. Я уже пробовал Aquery, Universal Image Loader, Picasso и т. Д., Но ни один из них не дает асинхронную загрузку изображений с кешированием памяти, кэшированием файлов, механизмом обратного вызова отказа и т. Д.

Может ли кто-нибудь предложить, как я могу достичь этого эффективно? ТИА.

+0

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

+0

@manishkumar - См. Мой ответ ниже. –

ответ

1

Для решения этой проблемы, я сделал класс VideoThumbLoader. Он асинхронно генерирует Bitmap и передает его адаптеру. Таким образом, основное преимущество заключается в том, что весь процесс обрабатывается в фоновом потоке.

Код класса, как показано ниже:

import android.annotation.SuppressLint; 
import android.graphics.Bitmap; 
import android.media.ThumbnailUtils; 
import android.os.AsyncTask; 
import android.provider.MediaStore; 
import android.support.v4.util.LruCache; 
import android.widget.ImageView; 

public class VideoThumbLoader { 

    private LruCache<String, Bitmap> lruCache; 

    @SuppressLint("NewApi") 
    public VideoThumbLoader() { 
     int maxMemory = (int) Runtime.getRuntime().maxMemory();// obtain maximum 
                   // memory to run 
     int maxSize = maxMemory/4;// get cache memory size 35 
     lruCache = new LruCache<String, Bitmap>(maxSize) { 
      @Override 
      protected int sizeOf(String key, Bitmap value) { 
       // this will be called when the cache deposited in each 
       return value.getByteCount(); 
      } 
     }; 
    } 

    public void addVideoThumbToCache(String path, Bitmap bitmap) { 
     if (getVideoThumbToCache(path) == null && bitmap != null) { 

      lruCache.put(path, bitmap); 
     } 
    } 

    public Bitmap getVideoThumbToCache(String path) { 

     return lruCache.get(path); 
    } 

    public void showThumbByAsynctack(String path, ImageView imgview) { 

     if (getVideoThumbToCache(path) == null) { 
      // asynchronous loading 
      new MyBobAsynctack(imgview, path).execute(path); 
     } else { 
      imgview.setImageBitmap(getVideoThumbToCache(path)); 
     } 
    } 

    class MyBobAsynctack extends AsyncTask<String, Void, Bitmap> { 
     private ImageView imgView; 
     private String path; 

     public MyBobAsynctack(ImageView imageView, String path) { 
      this.imgView = imageView; 
      this.path = path; 
     } 

     @Override 
     protected Bitmap doInBackground(String... params) { 

      Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(params[0], 
        MediaStore.Video.Thumbnails.MINI_KIND); 

      // provide 
      if (getVideoThumbToCache(params[0]) == null) { 
       addVideoThumbToCache(path, bitmap); 
      } 
      return bitmap; 
     } 

     @Override 
     protected void onPostExecute(Bitmap bitmap) { 
      if (imgView.getTag().equals(path)) {// through Tag can be bound 
               // pictures address and 
               // imageView, this address 
               // Listview loading the image 
               // dislocation solution 
       imgView.setImageBitmap(bitmap); 
      } 
     } 
    } 
} 

И со стороны адаптера, просто вызовите:

private VideoThumbLoader mVideoThumbLoader = new VideoThumbLoader(); 
imageThumbnail.setTag(videoValues.get(position).getFile() 
        .getAbsolutePath());// binding imageview 
imageThumbnail.setImageResource(R.drawable.videothumb); //default image 
mVideoThumbLoader.showThumbByAsynctack(videoValues.get(position) 
        .getFile().getAbsolutePath(), imageThumbnail); 

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

1


Использование SuziLoader

Этот загрузчик загружает эскизы для видео, которые локально хранятся в файловой системе в фоновом режиме.

String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/video.mp4"; 
ImageView mThumbnail = (ImageView) findViewById(R.id.thumbnail); 

SuziLoader loader = new SuziLoader(); //Create it for once. 
loader.with(MainActivity.this) //Context 
    .load(path) //Video path 
    .into(mThumbnail) // imageview to load the thumbnail 
    .type("mini") // mini or micro 
    .show(); // to show the thumbnail 

Чтобы получить эту зависимость использовать следующие шаги

Шаг 1. Добавьте репозиторий JitPack в файл сборки
Добавьте его в корневой build.gradle в конце хранилища:

allprojects { 
    repositories { 
     ... 
     maven { url 'https://jitpack.io' } 
    } 
} 

Шаг 2. Добавить зависимость

dependencies { 
    compile 'com.github.sushinpv:SuziVideoThumbnailLoader:0.1.0' 
} 

ADD READ EXTERNAL STORAGE Разрешение манифеста

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
+0

Быстрое прокручивание изображений (например, сетка или список или переработка) автоматически изменятся, как случайное изменение. и нарушить работу пользователя. – Attaullah