播放音频

在 Android 中播放音频文件一般使用 MediaPlayer 类实现,下表列出 MediaPlayer 类中一些常用的 API

方法名 功能描述
setDataSource 设置要播放的音频文件的位置
prepare 在调用之前,完成准备工作
start 开始播放
pause 暂停
reset 重置 MediaPlayer 为刚刚创建的状态
seekTo 从指定位置播放音频
stop 停止播放
release 释放 MediaPlayer 相关的资源
isPlaying 判断当前 MediaPlayer 是否正在播放音频
getDuration 获取文件的时长

AndroidStudio 允许我们在项目工程创建一个 assets 目录,并在这个目录下存放任意文件和子目录,这些文件和子目录在项目打包时会一并打包到安装文件中,然后我们在程序中就可以借助 AssetManager 类提供的接口读取 assets 目录下的文件。assets 目录必须创建在 app/src/main 下

修改 MainActivity 中的代码

class MainActivity : AppCompatActivity() {

    private val mediaPlayer = MediaPlayer()

    private fun initMediaPlayer() {
        val assetManager = assets
        val fd = assetManager.openFd("music.mp3")
        mediaPlayer.setDataSource(fd.fileDescriptor, fd.startOffset, fd.length)
        mediaPlayer.prepare()
    }

    override fun onDestroy() {
        super.onDestroy()
        mediaPlayer.stop()
        mediaPlayer.release()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initMediaPlayer()
        play.setOnClickListener {
            if (!mediaPlayer.isPlaying) {
                // 开始播放
                mediaPlayer.start()
            }
        }
        pause.setOnClickListener {
            if (mediaPlayer.isPlaying) {
                // 暂停播放
                mediaPlayer.pause()
            }
        }
        stop.setOnClickListener {
            if (mediaPlayer.isPlaying) {
                // 停止播放
                mediaPlayer.reset()
                initMediaPlayer()
            }
        }
    }
}

播放视频

播放视频文件并不比播放音频复杂,主要使用 VideoView 类实现

方法名 功能描述
setVideoPath 设置要播放的视频文件的位置
start 开始播放
pause 暂停
resume 将视频从头开始播放
seekTo 从指定位置播放视频
stop 停止播放
suspend 释放 VideoView 相关的资源
isPlaying 判断当前是否正在播放视频
getDuration 获取文件的时长

VideoView 不支持直接播放 assets 目录下的视频资源,所以要寻找其他解决办法。res 目录下允许我们再创建一个 raw 目录,像诸如音频、视频之类的资源文件也可以放在这里,并且 VideooView 是可以直接播放该目录下的视频资源的

修改 activity_main.xml 中的代码

<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">

    ...

    <VideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

修改 MainActivity 中的代码

class MainActivity : AppCompatActivity() {

    override fun onDestroy() {
        super.onDestroy()
        videoView.suspend()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val uri = Uri.parse("android.resource://$packageName/${R.raw.video}")
        videoView.setVideoURI(uri)
        play.setOnClickListener {
            if (!videoView.isPlaying) {
                // 开始播放
                videoView.start()
            }
        }
        pause.setOnClickListener {
            if (videoView.isPlaying) {
                // 暂停播放
                videoView.pause()
            }
        }
        stop.setOnClickListener {
            if (videoView.isPlaying) {
                // 停止播放
                videoView.resume()
            }
        }
    }
}

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐