Android:使用MediaPlayer播放本地音乐

标签(空格分隔): android


  • Android使用MediaPlayer播放本地音乐
  • 一装载音频
    • 1 静态方法
    • 2 动态加载
    • 3 两种方式对比
  • 二MediaPlayer的控制方法
  • 三事件监听
    • 1 准备监听事件
    • 2 完成监听事件
    • 3 错误监听事件
    • 4 定位监听事件
  • 四进度控制
    • 1 添加SeekBar控件
    • 2 给SeekBar设置监听
    • 3 在启动播放之前初始化SeekBar和开启更新进度的线程
  • 五部分代码演示

MediaPlayer是安卓提供的一套多媒体解决方案,提供了音视频处理等一系列强大的功能,现在我们来学习一下如何使用MediaPlayer控件播放本地音频1。演示语言Kotlin


一、装载音频

MediaPlayer有两种加载音频的方式,我们可以根据需要自行选择

1.1 静态方法

MediaPlayer提供了如下的静态方法装载文件

public static MediaPlayer create(Context context, int resid);public static MediaPlayer create(Context context, Uri uri);

第一种方法中的参数resid一般是我们在资源文件夹res/raw(该文件夹需要自己创建)存放的媒体文件id,第二种Uri的用处很多,常用的有使用Uri指向网络资源,也可指向本地文件。

1.2 动态加载

动态加载需要提前创建MediaPlayer对象,通过对象调用如下方法:

public void setDataSource(Context context, Uri uri);public void setDataSource(String path);

同样第一种可以用来加载本地或者网络文件,而第二种传递了资源文件在文件系统中的地址来播放本地文件。需要注意的是使用动态加载之后一定要调用prepare()方法去预装文件

1.3 两种方式对比

静态加载加载方式简单,但每一次调用都会创建一个MediaPlayer对象,适合一次性播放的任务场景。当我们需要使用MediaPlayer进行循环播放的时候,就不适合使用静态方式了,这是就需要使用动态加载的方式,使用一个MediaPlayer对象去循环加载资源文件。


二、MediaPlayer的控制方法

MediaPlayer有三个主要的方法进行播放控制

  • start():开始或者恢复播放
  • stop():停止播放
  • pause():暂停播放

三、事件监听

在MediaPlayer中常用的监听方法主要有四个

3.1 准备监听事件

该监听在MediaPlayer调用prepare()方法时回调
接口原型:

public interface OnPreparedListener{    void onPrepared(MediaPlayer mp);}

使用方式

mediaPlayer.setOnPreparedListener { mp ->    Log.e("---cccxm---", "正在准备")}

3.2 完成监听事件

该方法在媒体文件播放完毕时回调。
接口原型:

public interface OnCompletionListener{    void onCompletion(MediaPlayer mp);}

使用方式:

mediaPlayer!!.setOnCompletionListener { mp ->    Log.e("---cccxm---", "播放完毕")}

3.3 错误监听事件

当播放过程中发生错误时回调此方法。
接口原型:

public interface OnErrorListener{    boolean onError(MediaPlayer mp, int what, int extra);}

使用方式:

mediaPlayer!!.setOnErrorListener { mp, what, extra ->    Log.e("---mp---", "播放错误")    true}

3.4 定位监听事件

当我们对MediaPlayer的播放位置进行修改,也就是调用seekTo(Int)方法时回调。
接口原型:

public interface OnSeekCompleteListener{    public void onSeekComplete(MediaPlayer mp);}

使用方式:

mediaPlayer!!.setOnSeekCompleteListener { mp ->    Log.e("---mp---", "定位完毕")}

四、进度控制

当我们播放音频的时候需要查看当前播放进度和通过滑动SeekBar来快速定位。接下来我们逐步详解:

4.1 添加SeekBar控件

我们需要在布局文件中添加一个SeekBar控件,接下来在代码中查到到该控件

val seekBar = findViewById(R.id.seekBar) as SeekBar

4.2 给SeekBar设置监听

var isSeek = falseseekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {        override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {        }        override fun onStartTrackingTouch(seekBar: SeekBar) {            isSeek = true        }        override fun onStopTrackingTouch(seekBar: SeekBar) {            mediaPlayer!!.seekTo(seekBar.progress)            isSeek = false        }})

说明一下这里isSeek标记的作用:我们需要在一个线程中去更新当前SeekBar的进度,但是当我们手动拖动SeekBar定位的时候需要暂停线程更新。

4.3 在启动播放之前初始化SeekBar和开启更新进度的线程

val thread = Thread(Runnable {        while (true) {            Thread.sleep(500)            if (!isSeek) {                seekBar.progress = mediaPlayer.currentPosition            }        }    })

这个线程用来更新SeekBar进度(SeekBar和ProgressBar允许直接在线程中操作UI),我们设置每500毫秒更新一次进度,进度值为MediaPlayer当前播放位置。


五、部分代码演示

布局文件没有代码,看图

部分业务逻辑代码

class MainActivity : BaseActivity() {    val holder = MainHolder()    var mediaPlayer: MediaPlayer? = null    var isSeek = false    val thread = "progress"    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)        holder.bind(this)        initSeekBar()        register()        ThreadUtils.build("progress", Runnable {            while (ThreadUtils.isAlive("progress")) {                Thread.sleep(500)                if (isSeek) {                    holder.seekBar!!.progress = mediaPlayer!!.currentPosition                }            }        })    }    fun register() {        holder.resBtn!!.setOnClickListener { v ->            mediaPlayer = createResPlayer()            start()        }        holder.storageBtn!!.setOnClickListener { v ->            mediaPlayer = createStoragePlayer()            start()        }        holder.pause!!.setOnClickListener { v ->            if (mediaPlayer!!.isPlaying) {                pause()            } else {                start()            }        }        holder.stop!!.setOnClickListener { v ->            stop()        }    }    fun initSeekBar() {        holder.seekBar!!.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {            override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {            }            override fun onStartTrackingTouch(seekBar: SeekBar) {                isSeek = false            }            override fun onStopTrackingTouch(seekBar: SeekBar) {                mediaPlayer!!.seekTo(seekBar.progress)                isSeek = true            }        })    }    fun start() {        mediaPlayer!!.start()        holder.seekBar!!.max = mediaPlayer!!.duration        ThreadUtils.start(thread)    }    fun pause() {        mediaPlayer!!.pause()    }    fun stop() {        holder.seekBar!!.progress = mediaPlayer!!.duration        mediaPlayer!!.stop()        ThreadUtils.stop(thread)    }    fun createResPlayer(): MediaPlayer = MediaPlayer.create(this, R.raw.jay_qingtian)    fun createStoragePlayer(): MediaPlayer {        val player = MediaPlayer()        val path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).absolutePath        player.setDataSource(path + "/jay_qingtian.mp3")        player.prepare()        return player    }}

友情提示:对于目前各种开发培训机构的夸大其词,还请大家慎重,不要盲目跟风


  1. 李刚.疯狂安卓讲义 2th.电子工业出版社.525~528 ↩

更多相关文章

  1. [Android初级]关于Android使用Proguard混淆打包的那些事
  2. Android本地存储目录研究
  3. Android最新面试题汇总
  4. Android(安卓)贝塞尔曲线
  5. Android(安卓)开发之多线程处理——Handler 详解
  6. Android(安卓)Studio自带数据库SQLite的用法部分总结
  7. android的hashmap 原理以及源码探究
  8. Android(安卓)音乐播放器的实现(一)自定义按钮的实现
  9. Android音乐播放器【安卓进化二十】

随机推荐

  1. Android对话框图片全屏
  2. Android之解析JSON数据示例(android原生态
  3. android 创建动态View
  4. Android 实现文件(图片)上传
  5. android bugly使用
  6. android 使用DataBinding问题总结
  7. android打电话和发短信
  8. 2013.6.18 Android SDK和最新ADT下载地址
  9. Android 之开机启动Service
  10. android判断软件是否第一次运行的方法