Я использую код ниже, чтобы получить список видео и миниатюру с URL видео но загрузка данных в представлении переработчика занимает более 5 секунд.
public class VideoAsync extends AsyncTask { private static final String TAG = "VideoAsync"; private VideoAdapter videoAdapter; private RecyclerView recyclerView; private List<Video> videoList; private Context context; public VideoAsync(RecyclerView recyclerView, Context context) { this.recyclerView = recyclerView; this.videoList = new ArrayList<>(); this.context = context; } @Override protected Object doInBackground(Object[] objects) { return getAllMedia(); } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); videoAdapter = new VideoAdapter(getAllMedia(), context); recyclerView.setAdapter(videoAdapter); videoAdapter.notifyDataSetChanged(); } private List<Video> getAllMedia() { HashSet<Video> videoItemHashSet = new HashSet<>(); String[] projection = { MediaStore.Video.VideoColumns.DATA ,MediaStore.Video.Media.TITLE,
MediaStore.Video.VideoColumns.DURATION } ; Курсор курсора = context.getContentResolver (). Query (MediaStore.Video.Media.EXTERNAL_CONTENT_URI, проекция , ноль, ноль, ноль); пытаться { cursor.moveToFirst ( ) ;
do{ Video video = new Video(); video.setVideoPath((cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)))); video.setVideoTitle((cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)))); video.setVideoDuration(duration(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION)))); video.setThumbnail(getThumbNail((cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA))))); videoItemHashSet.add(video); }while(cursor.moveToNext()); cursor.close(); } catch (Exception e) { e.printStackTrace(); } videoList.addAll(videoItemHashSet); Log.d(TAG, "getAllMedia: "+ videoList.size()) ; return videoList; } private static Bitmap getThumbNail(String imagePath){ return ThumbnailUtils.createVideoThumbnail(imagePath, MediaStore.Video.Thumbnails.MINI_KIND); } private static String duration(String time){ long duration = Long.parseLong(time); return String.format("%d:%d", TimeUnit.MILLISECONDS.toMinutes(duration), TimeUnit.MILLISECONDS.toSeconds(duration) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration)) ); } } //Video fragment
Здесь Adapter установлен внутри класса Videoasync. Открытый класс VideosFragment extends Fragment {
@BindView(R.id.rv_video) RecyclerView recyclerView; private VideoAsync videoAsync; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_videos, container, false); ButterKnife.bind(this, view); setRecyclerView(); return view; } private void setRecyclerView(){ recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); videoAsync = new VideoAsync(recyclerView, getContext()); videoAsync.execute(); } }
2 ответа
Эта строка, вероятно, замедляет процесс загрузки. В худшем случае это может вызвать исключение OOM
ThumbnailUtils.createVideoThumbnail(imagePath, MediaStore.Video.Thumbnails.MINI_KIND);
По состоянию на
video.setThumbnail(getThumbNail((cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)))));
Всегда рекомендуется загружать растровое изображение только при необходимости, если только не существует строгого управления памятью. Чтобы сэкономить время, я бы разрешил загрузку растрового изображения в Glide или любую другую подобную библиотеку. тем не менее, измените на:
do{
Video video = new Video();
video.setVideoPath((cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA))));
video.setVideoTitle((cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE))));
video.setVideoDuration(duration(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION))));
//video.setThumbnail(getThumbNail((cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)))));
videoItemHashSet.add(video);
}while(cursor.moveToNext());
И внутри onBindViewHolder адаптера recyclerView загружайте видео растровое изображение динамически с Glide например:
@Override
public void onBindViewHolder(YourAdapter.ItemViewHolder holder, int position) {
Video v = videoItemHashset.get(position);
Glide.with(your_context)
.asBitmap()
.load(Uri.fromFile(new File(v.getVideoPath())))
.centerCrop()
.into(holder.videoThumbnailImageView);
holder.mPosition = position;///in case you're going to need it for playing the video at that position
}
public static Bitmap retriveVideoFrameFromVideo(String videoPath)throws Throwable
{
Bitmap bitmap = null;
MediaMetadataRetriever mediaMetadataRetriever = null;
try
{
mediaMetadataRetriever = new MediaMetadataRetriever();
if (Build.VERSION.SDK_INT >= 14)
mediaMetadataRetriever.setDataSource(videoPath, new HashMap<String, String>());
else
mediaMetadataRetriever.setDataSource(videoPath);
// mediaMetadataRetriever.setDataSource(videoPath);
bitmap = mediaMetadataRetriever.getFrameAtTime(1, MediaMetadataRetriever.OPTION_CLOSEST);
}
catch (Exception e)
{
e.printStackTrace();
throw new Throwable("Exception in retriveVideoFrameFromVideo(String videoPath)"+ e.getMessage());
}
finally
{
if (mediaMetadataRetriever != null)
{
mediaMetadataRetriever.release();
}
}
return bitmap;
}`enter code here`
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.