实现要求连续播放音频的功能
开发需要做一个连续播放准备好的音频的功能。Android 提供的MediaPlayer 和SoundPool 都很方便来播放音频的选择,不过MediaPlayer 本身提供了对于音频播放终止的监听,因此感觉更为方便一些。SoundPool 一般用来做5s以下的短音频,比如功能提示音、按键音等,还是选择MediaPlayer 。
思路很简单 1) 将要播放的音频添加到一个List 中,应该包括播放开始前添加、播放中添加、播放结束后添加; 2) 初始化音频播放器; 3) 开始播放,播放完成之后,播放下一首,直到全部播放完毕;
感觉听着就很简单,也没有用最开始想到的线程池,OK,来试一下。
简单的摆两个按钮用来播放和随时在列表里添加音乐
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/play"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Play" />
<Button
android:id="@+id/addVideo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="AddVideo" />
</LinearLayout>
准备4个较短的音频文件,放在新建assets 文件夹里
准备一下必要的东西,先在List中添加三个音频,留一个在播放过程中添加。
private val mediaPlayer = MediaPlayer()
private var list = ArrayList<String>()
private var index = 0
var assetManager : AssetManager ? = null
private fun initList() {
list.add("music1.mp3")
list.add("music2.mp3")
list.add("music3.mp3")
}
这没有什么需要解释的,之后就可以写播放音频的主要方法了。
private fun play() {
if (list.size > 0 && index<list.size) {
val videoIndex = list[index]
mediaPlayer.reset()
val fd = assetManager!!.openFd(videoIndex)
mediaPlayer.setDataSource(fd.fileDescriptor, fd.startOffset, fd.length)
mediaPlayer.prepare()
mediaPlayer.start()
Log.d(TAG, "播放音频: 正在播放music${index+1}")
}
}
private fun next() {
index++
play()
}
在使用前要先调用assetManager 的getAssets() 方法。 这样播放设置就可以,接着是开始播放和添加音频。
play.setOnClickListener {
initList()
play()
}
mediaPlayer.setOnCompletionListener {
if (list.size > 0 && index+1 < list.size){
Log.d(TAG, "播放音频: music${index+1} 播放结束")
next()
} else {
Toast.makeText(this, "播放完了", Toast.LENGTH_SHORT).show()
list.clear()
}
}
addVideo.setOnClickListener {
list.add("music4.mp3")
Log.d(TAG, "播放音频: music4 被添加到播放列表末尾")
if (!mediaPlayer.isPlaying) {
play()
}
}
测试一下,连续播放是没有问题的,再试一下播放中随时插入music4.mp3的效果。 可以看到,我在music2正在播放的时候,添加了music4,并最后正常播放。 当然在播放结束之后应该要一步资源释放的,也就是mediaPlayer 的stop() release() 方法。 以上基本实现功能需求。
|