先展示下本次做好的效果:
下面是播放时的画面,只截取了视频框
接着上次的说,上次说到了去获取手机里的视频信息,下面就用listview来展示视频列表与调用系统播放器来播放视频。
1、根据获取到的视频列表,去设置适配器Adapter,然后利用前面写的listview的例子,来展示数据,这个就不详细说明了。
2、点击单个listview的数据,来监听其事件,在监听的方法里,去调取播放方法。
2.1利用隐式意图去调用所有符合要求的播放器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class
MyOnItemClickListener
implements
AdapterView.OnItemClickListener {
@Override
public
void
onItemClick(AdapterView<?> parent, View view,
int
position,
long
id) {
//根据position获取list中的结果
MediaItem item = mediaList.get(position);
//Toast.makeText(context,"当前视频名称"+item.getName(),Toast.LENGTH_SHORT).show();
//调取系统播放器 ---隐式意图
Intent intent=
new
Intent(Intent.ACTION_VIEW);
Uri uri=Uri.parse(
"file://"
+item.getData());
intent.setDataAndType(uri,
"video/mp4"
);
//所有格式
context.startActivity(intent);
}
}
|
在这里就是要注意了,网上有的文章里,是这样写的
1
2
3
|
Intent intent=
new
Intent(Intent.ACTION_VIEW);
intent.setDataAndType(item.getData(),
"video/mp4"
);
//所有格式
context.startActivity(intent);
|
这样写就导致无法弹出系统里符合播放条件的播放器,需要在URI做下处理,在前面加上file://这样才行。
2.2 利用显示意图,直接调用mediaplayer来播放,自己封装了一下mediaplayer,以后可以自己定义播放器的样式,甚至打广告。这个SystemVideoPlayer是自己写的类。
1
2
3
4
|
Intent intent=
new
Intent(context,SystemVideoPlayer.
class
);
Uri uri=Uri.parse(
"file://"
+item.getData());
intent.setDataAndType(uri,
"video/mp4"
);
//所有格式
context.startActivity(intent);
|
2.3 自定义的systemVideoPlayer,注意这个类继承Activity,要去AndroidManifext.xml里注册
在这个类里,去监听videoView的准备播放状态,播放出错状态,播放完成状态,并且设置控制器来控制视频的暂停,快进,快退功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
package
com.yuanlp.mobileplayer.activity;
import
android.app.Activity;
import
android.media.MediaPlayer;
import
android.net.Uri;
import
android.os.Bundle;
import
android.support.annotation.Nullable;
import
android.widget.MediaController;
import
android.widget.Toast;
import
android.widget.VideoView;
import
com.yuanlp.mobileplayer.R;
/**
* Created by 原立鹏 on 2017/7/16.
* 系统播放器
* 注意去Manifext.xml里注册
*/
public
class
SystemVideoPlayer
extends
Activity{
private
VideoView videoview;
private
Uri uri;
@Override
protected
void
onCreate(
@Nullable
Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.system_video_player);
//自定义的播放器样式,暂时为简单版
videoview= (VideoView) findViewById(R.id.videoview);
//得到播放地址,从intent中获取
uri = getIntent().getData();
if
(uri!=
null
){
videoview.setVideoURI(uri);
}
//准备好的监听,监听是否视频准备好
videoview.setOnPreparedListener(
new
MyOnPreparedListener());
//播放出错了的监听
videoview.setOnErrorListener(
new
MyOnErrorListener());
//播放完成的监听
videoview.setOnCompletionListener(
new
MyOnCompletionListener());
//设置控制面板,系统自带的
videoview.setMediaController(
new
MediaController(
this
));
}
/**
* 准备好播放时的监听
*/
class
MyOnPreparedListener
implements
MediaPlayer.OnPreparedListener {
@Override
public
void
onPrepared(MediaPlayer mp) {
videoview.start();
//开始播放
}
}
/**
* 播放出错
*/
class
MyOnErrorListener
implements
MediaPlayer.OnErrorListener {
@Override
public
boolean
onError(MediaPlayer mp,
int
what,
int
extra) {
//出错后,系统会自动提示播放出错,同时自己也弹一个吐司
Toast.makeText(SystemVideoPlayer.
this
,
"播放出错"
,Toast.LENGTH_SHORT).show();
return
false
;
}
}
/**
* 播放完成的监听
*/
class
MyOnCompletionListener
implements
MediaPlayer.OnCompletionListener {
@Override
public
void
onCompletion(MediaPlayer mp) {
Toast.makeText(SystemVideoPlayer.
this
,
"播放完成"
, Toast.LENGTH_SHORT).show();
}
}
}
|
2.4 播放器样式布局
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<RelativeLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:orientation=
"vertical"
android:gravity=
"center"
android:background=
"#000000"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<VideoView
android:layout_centerInParent=
"true"
android:id=
"@+id/videoview"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
/>
</RelativeLayout>
|
3、VideoPager的完整代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
package
com.yuanlp.mobileplayer.pager;
import
android.content.ContentResolver;
import
android.content.Context;
import
android.content.Intent;
import
android.database.Cursor;
import
android.net.Uri;
import
android.os.Handler;
import
android.os.Message;
import
android.os.SystemClock;
import
android.provider.MediaStore;
import
android.view.View;
import
android.widget.AdapterView;
import
android.widget.ListView;
import
android.widget.ProgressBar;
import
android.widget.TextView;
import
android.widget.Toast;
import
com.yuanlp.mobileplayer.R;
import
com.yuanlp.mobileplayer.activity.SystemVideoPlayer;
import
com.yuanlp.mobileplayer.adapter.MyAdapter;
import
com.yuanlp.mobileplayer.base.BasePager;
import
com.yuanlp.mobileplayer.bean.MediaItem;
import
com.yuanlp.mobileplayer.utils.LogUtil;
import
com.yuanlp.mobileplayer.utils.Utils;
import
java.util.ArrayList;
import
java.util.List;
/**
* Created by 原立鹏 on 2017/7/13.
* 本地视频的页面
*/
public
class
VideoPager
extends
BasePager {
private
ListView listview;
private
TextView nomedia;
private
ProgressBar pb_loding;
private
Utils utils;
//保存所有的媒体信息的集合
private
List<MediaItem> mediaList;
private
MyAdapter myAdapter;
public
VideoPager(Context context) {
super
(context);
utils=
new
Utils();
}
private
Handler handler=
new
Handler(){
@Override
public
void
handleMessage(Message msg) {
super
.handleMessage(msg);
if
(mediaList!=
null
&&mediaList.size()>
0
){
//有数据
//设置适配器
myAdapter=
new
MyAdapter(context,mediaList);
listview.setAdapter(myAdapter);
//Toast.makeText(context,"有数据",Toast.LENGTH_SHORT).show();
nomedia.setVisibility(View.GONE);
}
else
{
//没有数据
//文本显示
Toast.makeText(context,
"没有数据"
,Toast.LENGTH_SHORT).show();
}
pb_loding.setVisibility(View.GONE);
//progressbar隐藏
}
};
/**
* 强制子类实现特定的效果
*
* @return
*/
@Override
public
View initView() {
LogUtil.e(
"本地视频被初始化了"
);
View view=View.inflate(context, R.layout.video_pager,
null
);
listview= (ListView) view.findViewById(R.id.listview);
nomedia= (TextView) view.findViewById(R.id.tv_nomedia);
pb_loding= (ProgressBar) view.findViewById(R.id.pb_loading);
//设置listview的item的点击事件
listview.setOnItemClickListener(
new
MyOnItemClickListener());
return
view;
}
@Override
public
void
initData() {
super
.initData();
LogUtil.e(
"本地视频页面的数据被初始化了"
);
//加载本地数据
getDataFromLocal();
}
class
MyOnItemClickListener
implements
AdapterView.OnItemClickListener {
@Override
public
void
onItemClick(AdapterView<?> parent, View view,
int
position,
long
id) {
//根据position获取list中的结果
MediaItem item = mediaList.get(position);
//Toast.makeText(context,"当前视频名称"+item.getName(),Toast.LENGTH_SHORT).show();
// //调取系统播放器 ---隐式意图
// Intent intent=new Intent(Intent.ACTION_VIEW);
// Uri uri=Uri.parse("file://"+item.getData());
// intent.setDataAndType(uri,"video/mp4"); //所有格式
// context.startActivity(intent);
//调用自己写的播放器 ---显示意图
Intent intent=
new
Intent(context,SystemVideoPlayer.
class
);
Uri uri=Uri.parse(
"file://"
+item.getData());
intent.setDataAndType(uri,
"video/mp4"
);
//所有格式
context.startActivity(intent);
}
}
/**
* 从本地sd卡获取数据,有2中办法
* 1、遍历sd卡,根据后缀名
* 2、从内容提供者中获取,系统有自己会去扫描所有media信息。
* 3/6.0后的系统,需要加上动态权限
*/
private
void
getDataFromLocal() {
mediaList=
new
ArrayList<>();
new
Thread(){
@Override
public
void
run() {
super
.run();
SystemClock.sleep(
2000
);
//根据上下文,去获取内容解析者
ContentResolver resolver = context.getContentResolver();
Uri uri= MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
String[] objs={
MediaStore.Video.Media.DISPLAY_NAME,
//视频文件名称
MediaStore.Video.Media.DURATION,
//视频时长
MediaStore.Video.Media.SIZE,
//文件大小
MediaStore.Video.Media.DATA,
//视频的绝对地址
MediaStore.Video.Media.ARTIST,
//歌曲的演唱者,艺术家(音频可能会有该字段)
};
Cursor cursor = resolver.query(uri, objs,
null
,
null
,
null
);
if
(cursor!=
null
){
while
(cursor.moveToNext()){
MediaItem item=
new
MediaItem();
String name=cursor.getString(
0
);
//名称
item.setName(name);
long
duration=cursor.getLong(
1
);
//时长
item.setDuration(duration);
long
size=cursor.getLong(
2
);
//视频大小
item.setSize(size);
String data=cursor.getString(
3
);
//视频的绝对地址
item.setData(data);
String artist=cursor.getString(
4
);
//艺术家
item.setArtist(artist);
mediaList.add(item);
//把每个item数据放到集合中
}
cursor.close();
}
//发消息,提示加载完media
handler.sendEmptyMessage(
0
);
}
}.start();
}
}
|
4、SystemVideoPlayer 自定义播放器类的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
package
com.yuanlp.mobileplayer.activity;
import
android.app.Activity;
import
android.media.MediaPlayer;
import
android.net.Uri;
import
android.os.Bundle;
import
android.support.annotation.Nullable;
import
android.widget.MediaController;
import
android.widget.Toast;
import
android.widget.VideoView;
import
com.yuanlp.mobileplayer.R;
/**
* Created by 原立鹏 on 2017/7/16.
* 系统播放器
* 注意去Manifext.xml里注册
*/
public
class
SystemVideoPlayer
extends
Activity{
private
VideoView videoview;
private
Uri uri;
@Override
protected
void
onCreate(
@Nullable
Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.system_video_player);
videoview= (VideoView) findViewById(R.id.videoview);
//得到播放地址,从intent中获取
uri = getIntent().getData();
if
(uri!=
null
){
videoview.setVideoURI(uri);
}
//准备好的监听,监听是否视频准备好
videoview.setOnPreparedListener(
new
MyOnPreparedListener());
//播放出错了的监听
videoview.setOnErrorListener(
new
MyOnErrorListener());
//播放完成的监听
videoview.setOnCompletionListener(
new
MyOnCompletionListener());
//设置控制面板,系统自带的
videoview.setMediaController(
new
MediaController(
this
));
}
/**
* 准备好播放时的监听
*/
class
MyOnPreparedListener
implements
MediaPlayer.OnPreparedListener {
@Override
public
void
onPrepared(MediaPlayer mp) {
videoview.start();
//开始播放
}
}
/**
* 播放出错
*/
class
MyOnErrorListener
implements
MediaPlayer.OnErrorListener {
@Override
public
boolean
onError(MediaPlayer mp,
int
what,
int
extra) {
//出错后,系统会自动提示播放出错,同时自己也弹一个吐司
Toast.makeText(SystemVideoPlayer.
this
,
"播放出错"
,Toast.LENGTH_SHORT).show();
return
false
;
}
}
/**
* 播放完成的监听
*/
class
MyOnCompletionListener
implements
MediaPlayer.OnCompletionListener {
@Override
public
void
onCompletion(MediaPlayer mp) {
Toast.makeText(SystemVideoPlayer.
this
,
"播放完成"
, Toast.LENGTH_SHORT).show();
}
}
}
|
本文转自老婆的宝宝51CTO博客,原文链接:http://blog.51cto.com/cm0425/1948069 ,如需转载请自行联系原作者