首页 > 代码库 > 手机影音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>
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 }
3.设置item的点击事件,把视频播放出来
手机影音3--本地视频列表
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。