首页 > 代码库 > 手机影音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     <TextView
13         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     <ProgressBar
23         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             @Override
106             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 = http://www.mamicode.com/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 activity
159      * @return
160      */
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_STORAGE
168             }, 1);
169 
170             return false;
171         }
172 
173         return true;
174     }
175 
176 }
VideoPager.java

 

3.设置item的点击事件,把视频播放出来

 

手机影音3--本地视频列表