手機影音3--本地視頻列表,影音3--列表
1.寫布局 相對布局 : ListView和TextView和ProgressBar,初始化
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <ListView 7 android:divider="@null" 8 android:id="@+id/listview" 9 android:layout_width="match_parent"10 android:layout_height="match_parent" />11 12 <TextView13 android:id="@+id/tv_nomedia"14 android:layout_width="wrap_content"15 android:layout_height="wrap_content"16 android:layout_centerInParent="true"17 android:text="沒有發現視頻..."18 android:textColor="#000000"19 android:textSize="18sp"20 android:visibility="gone" />21 22 <ProgressBar23 android:id="@+id/pb_loading"24 android:layout_width="wrap_content"25 android:layout_height="wrap_content"26 android:layout_centerInParent="true"27 />28 29 </RelativeLayout>
video_pager.xml
2.載入本地的視頻,在子線程中載入視頻,載入的視頻放入集合中; 設定適配器要在主線程;用Handler,設定適配器
1 public class VideoPager extends BasePager { 2 3 private ListView listview; 4 private TextView tv_nomedia; 5 private ProgressBar pb_loading; 6 7 8 private VideoPagerAdapter videoPagerAdapter; 9 10 /** 11 * 裝資料集合 12 */ 13 private ArrayList<MediaItem> mediaItems; 14 15 16 public VideoPager(Context context) { 17 super(context); 18 19 } 20 21 private Handler handler = new Handler(){ 22 @Override 23 public void handleMessage(Message msg) { 24 super.handleMessage(msg); 25 if(mediaItems != null && mediaItems.size() >0){ 26 //有資料 27 //設定適配器 28 videoPagerAdapter = new VideoPagerAdapter(context,mediaItems,true); 29 listview.setAdapter(videoPagerAdapter); 30 //把文本隱藏 31 tv_nomedia.setVisibility(View.GONE); 32 }else{ 33 //沒有資料 34 //文本顯示 35 tv_nomedia.setVisibility(View.VISIBLE); 36 } 37 38 39 //ProgressBar隱藏 40 pb_loading.setVisibility(View.GONE); 41 } 42 }; 43 44 /** 45 * 初始化當前頁面的控制項,由父類調用 46 * @return 47 */ 48 @Override 49 public View initView() { 50 View view = View.inflate(context, R.layout.video_pager,null); 51 listview = (ListView) view.findViewById(R.id.listview); 52 tv_nomedia = (TextView) view.findViewById(R.id.tv_nomedia); 53 pb_loading = (ProgressBar) view.findViewById(R.id.pb_loading); 54 //設定ListView的Item的點擊事件 55 listview.setOnItemClickListener(new MyOnItemClickListener()); 56 return view; 57 } 58 59 class MyOnItemClickListener implements AdapterView.OnItemClickListener { 60 61 @Override 62 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 63 64 MediaItem mediaItem = mediaItems.get(position); 65 // Toast.makeText(context, "mediaItem=="+mediaItem.toString(), Toast.LENGTH_SHORT).show(); 66 67 //1.調起系統所有的播放-隱式意圖 68 // Intent intent = new Intent(); 69 // intent.setDataAndType(Uri.parse(mediaItem.getData()),"video/*"); 70 // context.startActivity(intent); 71 72 //2.調用自己寫的播放器-顯--一個播放地址 73 // Intent intent = new Intent(context,SystemVideoPlayer.class); 74 // intent.setDataAndType(Uri.parse(mediaItem.getData()),"video/*"); 75 // context.startActivity(intent); 76 //3.傳遞列表資料-對象-序列化 77 Intent intent = new Intent(context,SystemVideoPlayer.class); 78 Bundle bundle = new Bundle(); 79 bundle.putSerializable("videolist",mediaItems); 80 intent.putExtras(bundle); 81 intent.putExtra("position",position); 82 context.startActivity(intent); 83 84 } 85 } 86 87 88 @Override 89 public void initData() { 90 super.initData(); 91 LogUtil.e("本地視頻的資料被初始化了。。。"); 92 //載入本地視頻資料 93 getDataFromLocal(); 94 } 95 96 /** 97 * 從本地的sdcard得到資料 98 * //1.遍曆sdcard,尾碼名 99 * //2.從內容提供者裡面擷取視頻100 * //3.如果是6.0的系統,動態擷取讀取sdcard的許可權101 */102 private void getDataFromLocal() {103 104 new Thread(){105 @Override106 public void run() {107 super.run();108 109 // isGrantExternalRW((Activity) context);110 // SystemClock.sleep(2000);111 mediaItems = new ArrayList<>();112 ContentResolver resolver = context.getContentResolver();113 Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;114 String[] objs = {115 MediaStore.Video.Media.DISPLAY_NAME,//視頻檔案在sdcard的名稱116 MediaStore.Video.Media.DURATION,//視頻總時間長度117 MediaStore.Video.Media.SIZE,//視頻的檔案大小118 MediaStore.Video.Media.DATA,//視頻的絕對位址119 MediaStore.Video.Media.ARTIST,//歌曲的演唱者120 121 };122 Cursor cursor = resolver.query(uri, objs, null, null, null);123 if(cursor != null){124 while (cursor.moveToNext()){125 126 MediaItem mediaItem = new MediaItem();127 128 mediaItems.add(mediaItem);//寫在上面129 130 String name = cursor.getString(0);//視頻的名稱131 mediaItem.setName(name);132 133 long duration = cursor.getLong(1);//視頻的時間長度134 mediaItem.setDuration(duration);135 136 long size = cursor.getLong(2);//視頻的檔案大小137 mediaItem.setSize(size);138 139 String data = cursor.getString(3);//視頻的播放地址140 mediaItem.setData(data);141 142 String artist = cursor.getString(4);//藝術家143 mediaItem.setArtist(artist);144 }145 146 cursor.close();147 }148 149 //Handler發訊息150 handler.sendEmptyMessage(10);151 }152 }.start();153 154 }155 156 /**157 * 解決安卓6.0以上版本不能讀取外部儲存許可權的問題158 * @param activity159 * @return160 */161 public static boolean isGrantExternalRW(Activity activity) {162 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && activity.checkSelfPermission(163 Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {164 165 activity.requestPermissions(new String[]{166 Manifest.permission.READ_EXTERNAL_STORAGE,167 Manifest.permission.WRITE_EXTERNAL_STORAGE168 }, 1);169 170 return false;171 }172 173 return true;174 }175 176 }VideoPager.java
3.設定item的點擊事件,把視頻播放出來