手机影音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 = 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的点击事件,把视频播放出来

时间: 2024-08-10 02:09:33

手机影音3--本地视频列表的相关文章

手机影音第五天 视频列表的显示与播放以及个别牌子手机播放的问题

先展示下本次做好的效果: 接着上次的说,上次说到了去获取手机里的视频信息,下面就用listview来展示视频列表与调用系统播放器来播放视频. 1.根据获取到的视频列表,去设置适配器Adapter,然后利用前面写的listview的例子,来展示数据,这个就不详细说明了. 2.点击单个listview的数据,来监听其事件,在监听的方法里,去调取播放方法. 2.1利用隐式意图去调用所有符合要求的播放器.     class MyOnItemClickListener implements Adapte

手机影音第四天,顶部标题栏的布局实现与本地视频的搜索

前面讲了下面的菜单布局与中间的fragmentLayout的布局与实现,今天就写了顶部title的布局以及去搜索本地sd卡里的视频. 一.顶部布局实现 效果图如下: 1.分析下: a.这个顶部布局是个LinearLayout布局 b.左侧这个321影音是个ImageView,然后这个搜索框是一个TextView,右侧的游戏图标是个相对布局,里面是一个textview和一个Image构成的点,最右侧的那个记录是一个Imageview c.最主要的是中间的这个搜索框,为什么是一个textview呢,

手机影音第十四天,本地音乐列表的展示与播放(利用视频播放的布局)

代码已经托管到码云,有兴趣的小伙伴可以下载看看 https://git.oschina.net/joy_yuan/MobilePlayer 效果图: Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过Content Provider的方式提供给用户.当手机开机或者有SD卡插拔等事件发生时,系统将会自动扫描SD卡和手机内存上的媒体文件,如audio,video,图片等,将相应的信息放到定义好的数据库表格中.在这个

黑马2018年最新kotlin项目实战视频 (手机影音、即时通讯、黑马外卖、坦克大战等)

├─1.kotlin简介和学习方法│ 01_kotlin课程简介_01.mp4│ 02_kotlin学习方法_01.mp4│ 03_kotlin选好教练车_01.mp4│ 03_kotlin选好教练车_02.mp4│ 04_kotlin你好世界_01.mp4│ 05_kotlin变量与输出_01.mp4│ 05_kotlin变量与输出_02.mp4│ ├─10.类,对象和接口(三)│ 38_kotlin面向对象-抽象类和接口_01.mp4│ 38_kotlin面向对象-抽象类和接口_02.mp4

手机影音第十一天,显示视频缓冲,显示卡顿时的网速,播放系统视频时调用播放器的选择

代码已经托管到码云,有兴趣的小伙伴可以下载看看 https://git.oschina.net/joy_yuan/MobilePlayer 一.设置视频缓冲进度 显示视频播放进度的效果图如下:灰色的是缓冲的进度. 原理:只有播放网络视频时,才有缓冲这个说法,所以要先判断视频资源是否为网络资源 /**  * 判断是否是网络的资源  * @param uri  * @return  */ public boolean isNetUri(String uri) {     boolean reault

Android 跳转系统选择本地视频的功能

今天在项目开发的过程中产品要求添加选择本地视频的功能,于是就翻阅和查找各种资料,进行功能的开发,但是在开发过程中发现,各种不同的品牌的手机跳转至系统选择本地视频的功能结果不太一样,所以我就对一些主流的品牌进行了测试,现做如下总结: 1.选择本地视频的功能 Button click event: Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTEN

iOS 本地视频和网络视频流播放

需求:最近公司需要做一个楼宇对讲的功能:门口机(连接WIFI)拨号对室内机(对应的WIFI)的设备进行呼叫,室内机收到呼叫之后将对收到的数据进行UDP广播的转发,手机(连接对应的WIFI)收到视频流之后,实时的展示视频数据(手机可以接听,挂断,手机接听之后,室内机不展示视频,只是进行转发.) 简单点说就是手机客户端需要做一个类似于直播平台的软件,可以实时的展示视频,实时的播放接收到的声音数据,并且实时将手机麦克风收到的声音回传给室内机,室内机负责转发给门口机. 之前从来做过视频播放都是本地文件的

手机影音第六天 自定义播放器页面的实现(按钮暂时未监听)

目前进度的项目源代码托管在里码云上,地址如下: https://git.oschina.net/joy_yuan/MobilePlayer 感兴趣的可以去下载看看,多多支持 这次就摒弃了系统自带的控制栏,即之前写的通过系统自带的控制栏 videoview.setMediaController(new MediaController(this)); 转而自己写控制器布局,实际截图如下: 效果图: 一.Activity的声明周期重温与横竖屏切换时的问题 有2个页面,A页面,B页面,下面括号里的A,B

照相、从相册上取照片、播放音频、播放本地视频、播放网络视频、MPMoviePlayerController

一.照相.从相册上去照片 1. 先判断是否支持照相功能 *判断当前设备是否支持照相功能,支持返回YES 否则返回NO 注意:模拟器不支持照相功能 把握一个原则只要是物理硬件相关的功能模拟器都不支持 例如: UIImagePickerController 专门处理与照片相关的功能类 是一个控制器 继承于导航视图控制器 if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]