WindowVideoAdapter.java 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. package com.edufound.android.xyyf.adapter;
  2. import android.annotation.TargetApi;
  3. import android.content.Context;
  4. import android.graphics.Bitmap;
  5. import android.graphics.drawable.Drawable;
  6. import android.media.MediaMetadataRetriever;
  7. import android.media.ThumbnailUtils;
  8. import android.net.Uri;
  9. import android.os.Build;
  10. import android.os.Handler;
  11. import android.os.Message;
  12. import android.provider.MediaStore;
  13. import android.support.annotation.NonNull;
  14. import android.support.v7.widget.CardView;
  15. import android.support.v7.widget.RecyclerView;
  16. import android.view.LayoutInflater;
  17. import android.view.View;
  18. import android.view.ViewGroup;
  19. import android.widget.ImageView;
  20. import com.edufound.android.xyyf.R;
  21. import com.edufound.android.xyyf.ijkplayer.media.IjkVideoView;
  22. import com.edufound.android.xyyf.util.Logger;
  23. import com.edufound.android.xyyf.video.VideoPersenter;
  24. import java.util.HashMap;
  25. import tv.danmaku.ijk.media.player.IMediaPlayer;
  26. public class WindowVideoAdapter extends RecyclerView.Adapter<WindowVideoAdapter.WindowVideoApapterHolder> {
  27. private LayoutInflater mLayoutInflater;
  28. private Context mContext;
  29. private VideoPersenter.VideoJsonBean[] mVideoBean;
  30. private HashMap<String, Drawable> mVideoBitmap;
  31. Message holderMsg;
  32. public WindowVideoAdapter(Context context, VideoPersenter.VideoJsonBean[] beans, HashMap<String, Drawable> map) {
  33. mContext = context;
  34. mVideoBean = beans;
  35. mVideoBitmap = map;
  36. mLayoutInflater = LayoutInflater.from(context);
  37. // loadVideoBitmap();
  38. }
  39. @NonNull
  40. @Override
  41. public WindowVideoApapterHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
  42. Logger.e("WindowVideoApapterHolder");
  43. return new WindowVideoApapterHolder(LayoutInflater.from(mContext).inflate(R.layout.fragment_video, viewGroup, false));
  44. }
  45. @Override
  46. public void onViewAttachedToWindow(@NonNull WindowVideoApapterHolder holder) {
  47. super.onViewAttachedToWindow(holder);
  48. holder.showImage();
  49. return;
  50. }
  51. @Override
  52. public void onViewDetachedFromWindow(@NonNull WindowVideoApapterHolder holder) {
  53. holder.mVideoView.stopPlayback();
  54. // holder.mVideoView.seekTo(0);
  55. return;
  56. }
  57. @Override
  58. public void onBindViewHolder(@NonNull final WindowVideoApapterHolder holder, int i) {
  59. try {
  60. Logger.e("onBindViewHolder");
  61. // String url = AesUtil.Decrypt(mVideoBean[i].videourl);
  62. final String url = mVideoBean[i].videourl;
  63. // String url = "http://efunimgs.ai160.com/ott/test/002tPr2Xlx07oP7B4ro40104120022hP0k010.mp4";
  64. // String url = "https://www.apple.com/105/media/cn/iphone-x/2017/01df5b43-28e4-4848-bf20-490c34a926a7/films/feature/iphone-x-feature-cn-20170912_1280x720h.mp4";
  65. holder.mVideoView.setVideoURI(Uri.parse(url));
  66. Logger.e("url:" + url);
  67. holder.mVideoName = mVideoBean[i].videoname;
  68. holder.url = url;
  69. holder.mImageFrame.setBackground(mVideoBitmap.get(mVideoBean[i].videoid));
  70. holder.mImageFrame.setTag(mVideoBitmap.get(mVideoBean[i].videoid));
  71. // if (holder.mImageFrame.getTag() != null) {
  72. // holder.mImageFrame.setBackground((Drawable) holder.mImageFrame.getTag());
  73. // } else {
  74. // new Thread() {
  75. // @Override
  76. // public void run() {
  77. // super.run();
  78. // Drawable drawable = new BitmapDrawable(createVideoThumbnail(url, 200, 200));
  79. // holder.mImageFrame.setTag(drawable);
  80. // holderMsg = new Message();
  81. // holderMsg.what = 2;
  82. // holderMsg.obj = holder;
  83. // handler.sendMessage(holderMsg);
  84. // }
  85. // }.start();
  86. // }
  87. } catch (Exception e) {
  88. e.printStackTrace();
  89. }
  90. }
  91. @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
  92. public Bitmap createVideoThumbnail(String url, int width, int height) {
  93. Bitmap bitmap = null;
  94. MediaMetadataRetriever retriever = new MediaMetadataRetriever();
  95. int kind = MediaStore.Video.Thumbnails.MINI_KIND;
  96. try {
  97. if (Build.VERSION.SDK_INT >= 14) {
  98. retriever.setDataSource(url, new HashMap<String, String>());
  99. } else {
  100. retriever.setDataSource(url);
  101. }
  102. bitmap = retriever.getFrameAtTime(1000);
  103. } catch (IllegalArgumentException ex) {
  104. // Assume this is a corrupt video file
  105. } catch (RuntimeException ex) {
  106. // Assume this is a corrupt video file.
  107. } finally {
  108. try {
  109. retriever.release();
  110. } catch (RuntimeException ex) {
  111. // Ignore failures while cleaning up.
  112. }
  113. }
  114. if (kind == MediaStore.Images.Thumbnails.MICRO_KIND && bitmap != null) {
  115. bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
  116. ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
  117. }
  118. return bitmap;
  119. }
  120. Handler handler = new Handler(new Handler.Callback() {
  121. @Override
  122. public boolean handleMessage(Message msg) {
  123. switch (msg.what) {
  124. case 1:
  125. // WindowVideoApapterHolder holder = (WindowVideoApapterHolder) msg.obj;
  126. // if (holder.mImageFrame.getTag() != null) {
  127. // holder.mImageFrame.setBackground((Drawable) holder.mImageFrame.getTag());
  128. // } else {
  129. // Drawable drawable = new BitmapDrawable(createVideoThumbnail(holder.url, 200, 200));
  130. // holder.mImageFrame.setTag(drawable);
  131. // holder.mImageFrame.setBackground(drawable);
  132. // }
  133. break;
  134. case 2:
  135. WindowVideoApapterHolder holder = (WindowVideoApapterHolder) msg.obj;
  136. Logger.e("设置--" + holder.mVideoName + "---图片");
  137. holder.mImageFrame.setBackground((Drawable) holder.mImageFrame.getTag());
  138. break;
  139. }
  140. return false;
  141. }
  142. });
  143. @Override
  144. public int getItemCount() {
  145. return mVideoBean.length;
  146. }
  147. public class WindowVideoApapterHolder extends RecyclerView.ViewHolder {
  148. String url;
  149. CardView mVideoCardView;
  150. IjkVideoView mVideoView;
  151. ImageView mImageFrame;
  152. String mVideoName;
  153. WindowVideoApapterHolder(View itemView) {
  154. super(itemView);
  155. mVideoCardView = itemView.findViewById(R.id.fragment_cardview);
  156. mVideoCardView.setRadius(50);
  157. mVideoView = itemView.findViewById(R.id.fragment_video);
  158. mVideoView.setRender(IjkVideoView.RENDER_TEXTURE_VIEW);
  159. mImageFrame = itemView.findViewById(R.id.fragment_image_frame);
  160. mImageFrame.setVisibility(View.GONE);
  161. mVideoView.setOnPreparedListener(new IMediaPlayer.OnPreparedListener() {
  162. @Override
  163. public void onPrepared(IMediaPlayer mp) {
  164. Logger.e("加载--" + mVideoName + "--完成了");
  165. // showImage();
  166. // mVideoView.start();
  167. // mVideoView.pause();
  168. // handler.sendEmptyMessageDelayed(1, 0);
  169. }
  170. });
  171. mVideoView.setOnErrorListener(new IMediaPlayer.OnErrorListener() {
  172. @Override
  173. public boolean onError(IMediaPlayer mp, int what, int extra) {
  174. Logger.e("WindowVideoAdapter---WindowVideoApapterHolder-onError");
  175. return false;
  176. }
  177. });
  178. mVideoView.setOnCompletionListener(new IMediaPlayer.OnCompletionListener() {
  179. @Override
  180. public void onCompletion(IMediaPlayer mp) {
  181. Logger.e("WindowVideoAdapter---WindowVideoApapterHolder-onCompletion");
  182. }
  183. });
  184. }
  185. Handler handler = new Handler(new Handler.Callback() {
  186. @Override
  187. public boolean handleMessage(Message msg) {
  188. switch (msg.what) {
  189. case 1:
  190. if (mVideoView.isPlaying() == false) {
  191. mVideoView.start();
  192. }
  193. if (mVideoView.getCurrentPosition() > 500) {
  194. mImageFrame.setVisibility(View.GONE);
  195. } else {
  196. handler.sendEmptyMessageDelayed(1, 0);
  197. }
  198. break;
  199. }
  200. return false;
  201. }
  202. });
  203. public void sendHanlder(int what) {
  204. handler.sendEmptyMessage(what);
  205. }
  206. public void start() {
  207. Logger.e("WindowVideoAdapter---WindowVideoApapterHolder--start");
  208. mVideoView.start();
  209. }
  210. public void stop() {
  211. Logger.e("WindowVideoAdapter---WindowVideoApapterHolder--stop");
  212. mVideoView.stopPlayback();
  213. }
  214. public void hideImage() {
  215. Logger.e("WindowVideoAdapter---WindowVideoApapterHolder--hideImage");
  216. // mImageFrame.setVisibility(View.GONE);
  217. handler.sendEmptyMessageDelayed(1, 1000);
  218. }
  219. public void showImage() {
  220. Logger.e("WindowVideoAdapter---WindowVideoApapterHolder--showImage");
  221. mImageFrame.setVisibility(View.VISIBLE);
  222. }
  223. }
  224. }