上篇文章我们讲了音乐播放器,这篇我们来讲一下视频播放器。
MadiaPlayer不是特别了解的请看上一篇文章的解析图。这次我们直接写了
首先,先看一下效果:
本次介绍的功能点:
1、读取本地视频文件,保存在List中
2、设置播放暂停
3、设置进度条和音量的关联
4、设置进度条和视频进度的关联
5、设置缓冲效果
6、设置全屏
7、获取网速
8、自定义监听卡
9、滑动屏幕改变音量
基本上这就是核心功能吧!开始了
读取本地视频文件,保存在List中
/**
* 从本地sdcard获取数据
* 1、遍历sdcard,通过后缀名获取(效率比较慢)
* 2、通过内容提供者数据库中获取(Android系统内部有一个扫描器 ———— “媒体扫描器”,当手机开机完成后,或者sdcard插好后,
* 系媒体扫描器会发送一个广播开始工作,开始扫描sdcard,然后把数据存到数据库中,从而提供给第三方使用)
* todo 内容提供者:解决应用与应用共享数据,通过内容提供者暴露出来使用。
* 3、6.0动态权限
*/
public void getDataFromLocal() {
// 新建一个线程,比较耗时
new Thread(){
public void run(){
// 获取内容提供者
ContentResolver contentResolver = getContext().getContentResolver();
Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
String[] obj = {
MediaStore.Video.Media.DISPLAY_NAME,//视频文件在sdcard的名称
MediaStore.Video.Media.DURATION,//视频总时长
MediaStore.Video.Media.SIZE,//视频的文件大小
MediaStore.Video.Media.DATA,//视频的绝对地址(视频的播放地址)
MediaStore.Video.Media.ARTIST,//歌曲的演唱者
};
// 查询方法。 参数1:uri. 参数2: 查询的指令
Cursor cursor = contentResolver.query(uri, obj, null, null, null);
if(cursor != null) {
while(cursor.moveToNext()) {
MediaItem mediaItem = new MediaItem();
mList.add(mediaItem);
// TODO: 2018/1/4 查询的0 1等位置是根据contentResolver.query()方法传入的obj参数获取的。
//视频的名称
String name = cursor.getString(0);
mediaItem.setName(name);
//视频的时长
long duration = cursor.getLong(1);
mediaItem.setDuration(duration);
//视频的文件大小
long size = cursor.getLong(2);
mediaItem.setSize(size);
//视频的播放地址
String data = cursor.getString(3);
mediaItem.setData(data);
//艺术家
String artist = cursor.getString(4);
mediaItem.setArtist(artist);
}
cursor.close();
}
// 更新UI
handler.sendEmptyMessage(MAG_HANDLER);
}
}.start();
}
/**
* 6.0动态获取sd卡权限
*/
public boolean isGrantExternalRW(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && activity.checkSelfPermission(
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
activity.requestPermissions(new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, 1);
return false;
}
return true;
}
API与音乐的API是一样的 ,接下面我们直接看一下几个监听
// 准备好的监听
video_view.setOnPreparedListener(onPreparedListener);
// 播放出错了监听
video_view.setOnErrorListener(onErrorListener);
// 播放完成了的监听
video_view.setOnCompletionListener(onCompListener);
// seekbar视频状态改变监听
seekbarVideo.setOnSeekBarChangeListener(seekBarListener);
// seekBar音量的状态改变
seekbarVoice.setOnSeekBarChangeListener(seekBarVoiceListener);
设置播放暂停 与 进度条与视频的同步
/**
* 准备好监听,播放并且更新seekBar
*/