Android在播放音频和视频方面做了相当不错的支持,它提供了一套较为完整的API。
一、播放音频
Android中播放音频文件一般使用MediaPlayer类来实现,它对多种格式音频文件提供了非常全面的控制方法,下表列出MediaPlayer类一些常用控制方法。
首先要创建一个MediaPlayer对象,然后调用setDataSource()设置音频文件的路径,再调用prepare()方法使MediaPlayer进入准备状态,接下来调用start()方法就可以开始播放音频,调用pause()方法就会暂停播放,调用reset()方法就会停止播放。
在activity_main.xml新增三个按钮,分别对应播放、暂停、停止:
<LinearLayout ...>
<Button
android:id="@+id/play"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Play" />
<Button
android:id="@+id/pause"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Pause" />
<Button
android:id="@+id/stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Stop" />
</LinearLayout>
提前准备好一个MP3音频放入main/assets目录。
class MainActivity : AppCompatActivity() {
private val mediaPlayer = MediaPlayer()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 初始化MediaPlayer对象
initMediaPlayer()
play.setOnClickListener {
if(!mediaPlayer.isPlaying) {
// 开始播放
mediaPlayer.start()
}
}
pause.setOnClickListener {
if(mediaPlayer.isPlaying) {
// 暂停播放
mediaPlayer.pause()
}
}
stop.setOnClickListener {
if(mediaPlayer.isPlaying) {
// 停止播放
mediaPlayer.reset()
initMediaPlayer()
}
}
}
private fun initMediaPlayer() {
// 获取AssetManager实例,用于读取assets目录下任何资源
val assetManager = assets
// 将音频文件句柄打开
val fd = assetManager.openFd("music.mp3")
// 给MediaPlayer设置要播放的文件
mediaPlayer.setDataSource(fd.fileDescriptor,
fd.startOffset, fd.length)
// 播放前准备工作
mediaPlayer.prepare()
}
override fun onDestroy() {
super.onDestroy()
// onDestroy中释放MediaPlayer资源
mediaPlayer.stop()
mediaPlayer.release()
}
}
二、播放视频
播放视频主要使用VideoView类来实现,这个类将视频显示和控制集于一身,仅仅借助它 就可以完成一个简易视频播放器,VideoView和MediaPlayer用法也比较类似,常用方法如下表所示。
VideoView并不是一个万能的视频播放工具类,它在视频格式的支持以及播放效率方面都存在着较大的不足,所以如果仅仅使用VideoView就写出一个强大的视频播放器是不太现实的,但如果只是用于播放一些游戏的片头动画,或者某个应用的视频宣传,使用VideoView还是绰绰有余的。
给activity_main.xml也设置三个按钮,分别对应播放、暂停、重新播放。另外在按钮下面又放置一个VideoView,稍后的视频就显示在这里。这里就不展示layout代码。
VideoView不支持直接播放assets目录下的视频资源,所以我们只能寻找其他的解决方案,res目录下允许我们再创建一个raw目录,诸如音频、视频之类的资源文件也可以放在这里,并且VideoView是可以直接播放这个目录下的视频资源。
class MainAcivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 将video文件解析成Uri对象,Android固定写法
val uri = Uri.parse("android.resource://$packageName/${R.raw.vide}")
// 给VideoView指定视频Uri
videoView.setVideoURI(uri)
play.setOnClickListener {
if(!videoView.isPlaying) {
// 开始播放
videoView.start()
}
}
pause.setOnClickListener {
if(videoView.isPlaying) {
// 暂停播放
videoView.pause()
}
}
replay.setOnClickListener {
if(!videoView.isPlaying) {
// 重新播放
videoView.resume()
}
}
}
override fun onDestroy() {
super.onDestroy()
// 释放VideoView资源
videoView.suspend()
}
}