制作简易的音乐播放器和视频播放器
播放多媒体文件
- Android在播放音频和视频方面做了非常不错的支持,它提供了一套非常完整的API,使得开发者可以轻松编写出一个简易的音频或者视频播放器
播放音频
- 在Android中播放音频文件一般使用MediaPlayer类来进行实现,他对多种格式的音频文件提供了非常全面的控制方法,从而使播放音乐的工作变得十分简单,下表列出了MediaPlayer类中一些较为常用的方法
MediaPlayer的工作流程
- 首先需要创建一个MediaPlayer对象,然后调用setDataSource()方法设置音频文件的播放路径,再调用prepare()方式使MediaPlayer进入准备状态.
- 接下来调用start()方法就可以开始播放音频了,再调用pause()方法就会暂停,调用reset()方法就会停止播放.
项目示例
- 新建一个PlayAudioTest项目,然后修改activity_main.xml当中的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<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>
- 定义了三个按钮分别表示播放,暂停,停止
- MediaPlayer可以用于播放网络,本地以及应用程序安装包当中的音频,下面的例子来播放程序安装包中的音频.
- AS允许我们再项目工程中创建一个assets目录,并在这个目录下面存放任意文件和子目录,这些文件和子目录在项目打包的时候会一并被打包到安装文件中,然后我们在程序中就可以借助AssetManager这个类提供的接口对assets目录下的文件进行读取.
- 下面创建一个assets目录,这个目录必须创建在app/src/main这个目录下面,也就是和java,res这两个目录是平级的,右击app/src/main->new->Directory,再弹出的对话框中输入"assets",目录即可创建完成.
- 然后准备一份音频资源放在这个目录下面即可
- 接着修改MainActivity当中的代码逻辑
package com.zb.playaudiotest
import android.media.MediaPlayer
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private val mediaPlayer = MediaPlayer()
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()
}
}
}
override fun onDestroy() {
super.onDestroy()
mediaPlayer.stop()
mediaPlayer.release()
}
private fun initMediaPlayer() {
val assetManager = assets
val fd = assetManager.openFd("music.mp3")
mediaPlayer.setDataSource(fd)
mediaPlayer.prepare()
}
}
- 再类初始化的时候,创建一个MediaPlayer的实例,然后在onCreat()方法中调用initMediaPlayer()方法,为MediaPlayer对象进行初始化
- 在initMediaPlayer()方法当中首先通过getAssets()方法得到一个AssetManager的实例,Assmanager可以用于读取assets目录下的任何资源,然后调用opedFd()方法将音频文件句柄打开,后面又依次调用了setDataSource()方法和prepare()方法,为mediaPlayer做好了播放前的准备.
- 然后就是各个按钮的点击事件了,分别对应简单的开始,暂停,停止逻辑
- 最后在onDestroy()方法中,我们还需要分别调用stop()方法和release()方法,将于MediaPlayer相关的资源释放掉.
- 这样一个简易的音乐播放器就完成了.
播放视频
- 播放视频主要使用VideoView类来实现,这个类将视频的显示和控制集于一身,我们仅仅借助它就可以完成一个简单的视频播放器.VideoView的用法和MediaPlayer也比较类似,常用方法如下表所示
项目示例
- 新建一个PlayVideoTest项目,然后修改activity_main.xml文件中的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/play"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="play" />
<Button
android:id="@+id/pause"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="pause" />
<Button
android:id="@+id/replay"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="replay" />
</LinearLayout>
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
- 在这个布局文件当中同样放置了三个按钮,分别用于控制视频的播放,暂停,重新播放,另外在按钮的下面还放置了一个VideoView,稍后的视频就会放在这个地方进行显示.
- 接下来就是存放视频资源的问题了,很可惜的是在VideoView当中是不支持直接播放assets目录下的视屏资源的,所以只能寻找其他的解决方案了.
- res目录下面允许我们再创建一个raw目录,像诸如视频,音频之类的文件也可以存放在这里,并且VideoView是可以直接播放这个目录下的视频资源的.
- 右击app/src/main/res->New->Directory,在弹出的对话框当中输入"raw",完成raw目录的创建,并把要播放的视频资源放在里面即可,需要注意的是在raw下面存放的文件命名中不能有大写字母,否者会爆红.
- 然后修改MainActivity当中的代码
package com.zb.playvideotest
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
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()
}
}
replay.setOnClickListener {
if (videoView.isPlaying) {
videoView.resume()
}
}
}
override fun onDestroy() {
super.onDestroy()
videoView.suspend()
}
}
- 在onCreat()方法当中,调用了Uri.parse()方法,将raw目录下的video.map文件解析成了Uri对象,这里使用的写法是Android要求的固定写法
- 然后调用VideoView的setVideoURI()方法将刚才解析出来的Uri对象传入,这样VideoView就初始化完成了.
- 之后就是各个按钮的点击事件了,最后还要子啊onDestory()方法当中调用一个videoView的suspend()方法,将VideoView所占用的资源释放掉.
- 这样一个简易的视频播放器就制作完毕了