16 public class MainActivity extends Activity {
17 private EditText et_path;
18 private Button btn_play, btn_pause, btn_replay, btn_stop;
19 private MediaPlayer mediaPlayer;
20
21 @Override
22 protected void onCreate(Bundle savedInstanceState) {
23 super.onCreate(savedInstanceState);
24 setContentView(R.layout.activity_main);
25
26 et_path = (EditText) findViewById(R.
id
.et_path);
27 btn_play = (Button) findViewById(R.
id
.btn_play);
28 btn_pause = (Button) findViewById(R.
id
.btn_pause);
29 btn_replay = (Button) findViewById(R.
id
.btn_replay);
30 btn_stop = (Button) findViewById(R.
id
.btn_stop);
31
32 btn_play.setOnClickListener(click);
33 btn_pause.setOnClickListener(click);
34 btn_replay.setOnClickListener(click);
35 btn_stop.setOnClickListener(click);
36 }
37
38 private View.OnClickListener click = new View.OnClickListener() {
39
40 @Override
41 public void onClick(View
v
) {
42
43 switch (
v
.getId()) {
44
case
R.
id
.btn_play:
45 play();
46
break
;
47
case
R.
id
.btn_pause:
48 pause();
49
break
;
50
case
R.
id
.btn_replay:
51 replay();
52
break
;
53
case
R.
id
.btn_stop:
54 stop();
55
break
;
56 default:
57
break
;
58 }
59 }
60 };
61 /**
62 * 播放音乐
63 */
64 protected void play() {
65 String path = et_path.getText().toString().trim();
66 File
file
= new File(path);
67
if
(
file
.exists() &&
file
.length() &
gt
; 0) {
68 try {
69 mediaPlayer = new MediaPlayer();
70 // 设置指定的流媒体地址
71 mediaPlayer.setDataSource(path);
72 // 设置音频流的类型
73 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
74
75 // 通过异步的方式装载媒体资源
76 mediaPlayer.prepareAsync();
77 mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
78 @Override
79 public void onPrepared(MediaPlayer mp) {
80 // 装载完毕 开始播放流媒体
81 mediaPlayer.start();
82 Toast.makeText(MainActivity.this,
"开始播放"
, 0).show();
83 // 避免重复播放,把播放按钮设置为不可用
84 btn_play.setEnabled(
false
);
85 }
86 });
87 // 设置循环播放
88 // mediaPlayer.setLooping(
true
);
89 mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
90
91 @Override
92 public void onCompletion(MediaPlayer mp) {
93 // 在播放完毕被回调
94 btn_play.setEnabled(
true
);
95 }
96 });
97
98 mediaPlayer.setOnErrorListener(new OnErrorListener() {
99
100 @Override
101 public boolean onError(MediaPlayer mp, int what, int extra) {
102 // 如果发生错误,重新播放
103 replay();
104
return
false
;
105 }
106 });
107 } catch (Exception e) {
108 e.printStackTrace();
109 Toast.makeText(this,
"播放失败"
, 0).show();
110 }
111 }
else
{
112 Toast.makeText(this,
"文件不存在"
, 0).show();
113 }
114
115 }
116 /**
117 * 暂停
118 */
119 protected void pause() {
120
if
(btn_pause.getText().toString().trim().equals(
"继续"
)) {
121 btn_pause.setText(
"暂停"
);
122 mediaPlayer.start();
123 Toast.makeText(this,
"继续播放"
, 0).show();
124
return
;
125 }
126
if
(mediaPlayer != null && mediaPlayer.isPlaying()) {
127 mediaPlayer.pause();
128 btn_pause.setText(
"继续"
);
129 Toast.makeText(this,
"暂停播放"
, 0).show();
130 }
131
132 }
133
134 /**
135 * 重新播放
136 */
137 protected void replay() {
138
if
(mediaPlayer != null && mediaPlayer.isPlaying()) {
139 mediaPlayer.seekTo(0);
140 Toast.makeText(this,
"重新播放"
, 0).show();
141 btn_pause.setText(
"暂停"
);
142
return
;
143 }
144 play();
145 }
146
147 /**
148 * 停止播放
149 */
150 protected void stop() {
151
if
(mediaPlayer != null && mediaPlayer.isPlaying()) {
152 mediaPlayer.stop();
153 mediaPlayer.release();
154 mediaPlayer = null;
155 btn_play.setEnabled(
true
);
156 Toast.makeText(this,
"停止播放"
, 0).show();
157 }
158
159 }
160
161 @Override
162 protected void onDestroy() {
163 // 在activity结束的时候回收资源
164
if
(mediaPlayer != null && mediaPlayer.isPlaying()) {
165 mediaPlayer.stop();
166 mediaPlayer.release();
167 mediaPlayer = null;
168 }
169 super.onDestroy();
170 }
171 }
通过各种方法创建MediaPlayer:
MediaPlayer主要用来控制Android下播放文件或流的类。MediaPlayer处于Android多媒体包下"android.media.MediaPlayer",仅有一个无参的构造函数,虽然仅为我们提供了一个无参的构造函数,为了方便我们初始化,还为我们提供了几个静态的create()方法用于完成MediaPlayer初始化的工作。
-
static MediaPlayer create(Context context,int resid):通过音频资源的Id来创建一个MediaPlayer实例。
-
static MediaPlayer create(Context context,Uri uri):通过一个音频资源的Uri地址来创建一个MediaPlayer实例。
MediaPlayer除了通过上面两个create()方法在初始化的时候指定媒体资源,还可以通过MediaPlayer.setDataSource()方法为初始化后的MediaPlayer设置媒体资源,setDataSource()具有多个重载函数,适用于不同的媒体资源来源,以下讲解几个常用的,其他的可以查阅官方文档。
-
void setDataSource(String path):通过一个媒体资源的地址指定MediaPlayer的数据源,这里的path可以是一个本地路径,也可以是网络路径。
-
void setDataSource(Context context,Uri uri):通过一个Uri指定MediaPlayer的数据源,这里的Uri可以是网络路径或这一个内容提供者的Uri。
-
void setDataSource(FileDescriptor fd):通过一个FileDescriptor指定一个MediaPlayer的数据源。