Android Studio允许我们在项目工程中创建一个assets目录,并在这个目录下存放任意文件和子目录,这些文件和子目录在项目打包时会一并被打包到安装文件中,然后我们在程序中就可以借助AssetManager这个类提供的接口对assets目录下的文件进行读取。
那么首先来创建assets目录吧,它必须创建在app/src/main这个目录下面,也就是和java、res这两个目录是平级的。右击app/src/main→New→Directory,在弹出的对话框中选择assets,目录就创建完成了。
18.1 播放音频
MediaPlayer可以用于播放网络、本地以及应用程序安装包中的音频。
播放本地音频,先添加资源文件到assets下。
AssetManager可用于读取assets目录下的任何资源。
最后在onDestroy()方法中,我们还需要分别调用stop()方法和release()方法,将与MediaPlayer相关的资源释放掉。
| 方法名 | 功能描述 |
|---|---|
| setDataSource() | 设置要播放的音频文件的位置 |
| prepare() | 在开始播放之前调用,以完成准备工作 |
| start() | 开始或继续播放音频 |
| pause() | 暂停播放音频 |
| reset() | 将MediaPlayer对象重置到刚刚创建的状态 |
| seekTo() | 从指定的位置开始播放音频 |
| stop() | 停止播放音频。调用后的MediaPlayer对象无法再播放音频 |
| release() | 释放与MediaPlayer对象相关的资源 |
| isPlaying() | 判断当前MediaPlayer是否正在播放音频 |
| getDuration() | 获取载入的音频文件的时长 |
class MainActivity : AppCompatActivity() {
private lateinit var viewBinding: ActivityMainBinding
private val mediaPlayer = MediaPlayer()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
initMediaPlayer()
viewBinding.play.setOnClickListener {
if (!mediaPlayer.isPlaying) {
mediaPlayer.start()
}
}
viewBinding.pause.setOnClickListener {
if (mediaPlayer.isPlaying) {
mediaPlayer.pause()
}
}
viewBinding.stop.setOnClickListener {
if (mediaPlayer.isPlaying) {
mediaPlayer.reset()
initMediaPlayer()
}
}
}
fun initMediaPlayer() {
val assetManager = assets
val fd = assetManager.openFd("actor.mp3")
mediaPlayer.setDataSource(fd.fileDescriptor, fd.startOffset, fd.length)
mediaPlayer.prepare()
}
override fun onDestroy() {
super.onDestroy()
mediaPlayer.stop()
mediaPlayer.release()
}
}
18.2 播放视频
VideoView不支持直接播放assets目录下的视频资源,所以我们只能寻找其他的解决方案。res目录下允许我们再创建一个raw目录,像诸如音频、视频之类的资源文件也可以放在这里,并且VideoView是可以直接播放这个目录下的视频资源的。
| 方法名 | 功能描述 |
|---|---|
| setVideoPath() | 设置要播放的视频文件的位置方法名 |
| start() | 开始或继续播放视频 |
| pause() | 暂停播放视频 |
| resume() | 将视频从头开始播放 |
| seekTo() | 从指定的位置开始播放视频 |
| isPlaying() | 判断当前是否正在播放视频 |
| getDuration() | 获取载入的视频文件的时长 |
val uri = Uri.parse("android.resource://$packageName/${R.raw.video}")
viewBinding.videoView.setVideoURI(uri)
val videoView = viewBinding.videoView
viewBinding.playVideo.setOnClickListener {
if (!videoView.isPlaying) {
videoView.start()
}
}
viewBinding.pauseVideo.setOnClickListener {
if (videoView.isPlaying) {
videoView.pause()
}
}
viewBinding.replayVideo.setOnClickListener {
if (videoView.isPlaying) {
videoView.resume()
}
}