final Button button3 = (Button) findViewById(R.id.button3); //获取“停止”按钮
hint = (TextView) findViewById(R.id.hint); //获取用于显示提示信息的文本框
file = new File("/sdcard/ninan.mp3"); //获取要播放的文件
if (file.exists()) { //如果文件存在
player = MediaPlayer
.create(this, Uri.parse(file.getAbsolutePath())); //创建MediaPlayer对象
} else {
hint.setText("要播放的音频文件不存在!");
button1.setEnabled(false);
return;
}
(5)编写用于播放音乐的play()方法,该方法没有入口参数的返回值。在该方法中,首先调用MediaPlayer对象的reset()方法重置MediaPlayer对象,然后重新为其设置要播放的音频文件,并预加载该音频,最后调用 start()方法开始播放音频,并修改显示提示信息的文本框中的内容,具体代码如下:
private void play() {
try {
player.reset();
player.setDataSource(file.getAbsolutePath()); //重新设置要播放的音频
player.prepare(); //预加载音频
player.start(); //开始播放
hint.setText("正在播放音频...");
} catch (Exception e) {
e.printStackTrace(); //输出异常信息
}
}
(6)为MediaPlayer对象添加完成事件监听器,用于当音乐播放完毕后,重新开始播放音乐,具体代码如下:
player.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
play(); //重新开始播放
}
});
(7)为“播放”按钮添加单击事件监听器,在重写的onClick()方法中,首先调用play()方法开始播放音乐,然后对代表是否暂停的标记变量isPause进行设置,最后设置各按钮的可用状态,关键代码如下:
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
play(); //开始播放音乐
if (isPause) {
button2.setText("暂停");
isPause = false; //设置暂停标记变量的值为false
}
button2.setEnabled(true); //“暂停/继续”按钮可用
button3.setEnabled(true); //“停止”按钮可用
button1.setEnabled(false); //“播放”按钮不可用
}
});
(8)为“暂停/继续”按钮添加单击事件监听器,在重写的onClick()方法中,如果MediaPlayer处于播放状态并且标记变量isPause的值为false,则暂停播放音频,并设置相关信息;否则,调用MediaPlayer对象的start()方法继续播放音乐,并设置相关信息,关键代码如下:
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (player.isPlaying() && !isPause) {
player.pause(); //暂停播放
isPause = true;
((Button) v).setText("继续");
hint.setText("暂停播放音频...");
button1.setEnabled(true); //“播放”按钮可用
} else {
player.start(); //继续播放
((Button) v).setText("暂停");
hint.setText("继续播放音频...");
isPause = false;
button1.setEnabled(false); //“播放”按钮不可用
}
}
});
(9)为“停止”按钮添加单击事件监听器,在重写的onClick()方法中,首先调用MediaPlayer对象的stop()方法停止播放音频,然后设置提示信息及各按钮的可用状态,具体代码如下:
button3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
player.stop(); //停止播放
hint.setText("停止播放音频...");
button2.setEnabled(false); //“暂停/继续”按钮不可用
button3.setEnabled(false); //“停止”按钮不可用
button1.setEnabled(true); //“播放”按钮可用
}
});
(10)重写Activity的onDestroy()方法,用于在当前Activity销毁时,停止正在播放的视频,并释放MediaPlayer所占用的资源,具体代码如下:
@Override
protected void onDestroy() {
if(player.isPlaying()){
player.stop(); //停止音频的播放
}
player.release(); //释放资源
super.onDestroy();
}
运行本实例,将显示一个简易音乐播放器,单击“播放”按钮,将开始播放音乐,同时“播放”按钮变为不可用状态,而“暂停”和“停止”按钮变为可用状态,如图10.1所示;单击“暂停”按钮,将暂停音乐的播放,同时“播放”按钮变为可用;单击“继续”按钮,将继续音乐的播放,同时“继续”按钮变为“暂停”按钮;单击“停止”按钮,将停止音乐的播放,同时“暂停/继续”和“停止”按钮将变为不可用,“播放”按钮可用。
图10.1 简易音乐播放器
10.1.2 使用SoundPool播放音频
由于MediaPlayer占用资源较多,且不支持同时播放多个音频,所以Android还提供了另一个播放音频的类——SoundPool。SoundPool即音频池,可以同时播放多个短小的音频,而且占用的资源较少。SoundPool适合在应用程序中播放按键音或者消息提示音等,在游戏中播放密集而短暂的声音,如多个飞机的爆炸声等。使用SoundPool播放音频,首先需要创建SoundPool对象,然后加载所要播放的音频,最后调用play()方法播放音频,下面进行详细介绍。