前面我们讲解了如何从SD卡中获取MP3文件的列表,并将文件列表放置到一个ListView里。后来发现还少提一个内容就是权限问题,我们需要在Android Application的AndroidManifest.xml文件中添加如下一行内容:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
网上找的。然后思考下这里给的是WRITE的权限,但是我们并没有写啊,所以估计这个WRITE是向下兼容的(毕竟写要比读高级一点点)。再进行搜索,得到如下的说明:
http://blog.csdn.net/stephen255/article/details/9142923
上面的blog中列出了大量的权限说明,应该足够用了!
下面回到正题,开始播放器设定。
首先我们设定一个全局的播放器对象:private MediaPlayer mp=null;
通过搜索引擎的查询我们获知对于MediaPlayer主要需要设置一下几个方法来进行播放:
1、setDataSource——设置播放器的播放源(本地文件或者网络地址文件)
2、prepare——相当于开始装载播放源,准备播放
【如果是利用MediaPlayer的create方法来创建的播放对象以上两步是可以省略的,因为在create的时候已经完成了】
3、start——开始播放(其他辅助方法有:pause、stop、seekTo等)
其他还有些事件监听:setOnCompletionListener、setOnSeekCompleteListener等
有兴趣的同学可以查看API文档:http://www.android-doc.com/reference/android/media/MediaPlayer.html
我们这里就简单的使用下setDataSource、prepare和start先。
那么我们该什么时候去NEW一个MediaPlayer的实例,当然是选择列表中的某一项的时候。那么当我们选择列表中的某一项时会激发什么事件呢?这就需要看看ListView有哪些事件监听,通过查询API,我们找到了setOnItemClickListener事件监听(不过这个不是属于ListView类的,而是继承自AdapterView类。
所以我们修改前一篇中的代码:
lvMP3List.setAdapter(ladapter);
lvMP3List.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
// TODO Auto-generated method stub
}
});
这里我们就对lvMP3List这个ListView设置了ItemClick的事件监听,并重写了onItemClick方法。该方法有四个参数分别表示了适配器、适配器里的项、位置、行号。这时我们需要取得我们所点的那行中的MP3个歌曲的地址,所以我们在onItemClick方法里添加代码如下:
// TODO Auto-generated method stub
TextView tv=(TextView)arg1.findViewById(R.id.ItemText);
String currentMP3=(String) tv.getText();
通过表示适配器里的项的那个参数arg1来找到ID为ItemText的文本框。还记得前面设置适配器的时候的relative.xml文件中有两个TextView,一个叫ItemText,一个叫ItemTitle,前者表示完整路径,后者表示文件名。我们这里需要完整路径,所以就获取ItemText的值。
然后我们就可以播放了:
// TODO Auto-generated method stub
TextView tv=(TextView)arg1.findViewById(R.id.ItemText);
String currentMP3=(String) tv.getText();
mp=new MediaPlayer();
mp.setDataSource(currentMP3);
mp.prepare();
mp.start();
但是写了上面的代码后系统会提示你setDataSource和prepare两个方法可能会有异常,所以推荐使用try/catch来捕获,使用系统推荐的处理方法:surround with try/catch。完整代码如下:
// TODO Auto-generated method stub
TextView tv=(TextView)arg1.findViewById(R.id.ItemText);
String currentMP3=(String) tv.getText();
mp=new MediaPlayer();
try {
mp.setDataSource(currentMP3);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
mp.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mp.start();
好了。现在我们可以run as android application了。
不过运行了之后我们发现点了某行之后的确能播放该MP3音乐,但是也出现了一个问题,点了一行,播放了,然后再点另外一行,又播放了,然后两个音乐就混在一起了。
OK,思考题出来了。
思考题一:同一时间只能播放一首音乐
思考题二:在界面上添加播放进度条,并且能够拖动播放
思考题三:当我们点了返回按钮或者主界面按钮后,音乐播放并没有停止,这个该如何实现。
以上思考题第一题是必须要实现的,思考题二可以尝试,思考题三请先看后面一篇“android生命周期”文章后再实现,或者自己百度android生命周期。从而也能比较容易的实现。