常用监听器
开发者可以设置一些监听器,监听MediaPlayer的状态,错误事件等等。开发者应在同一个线程中创建MediaPlayer与设置的监听器。
setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener)
监听MediaPlayer准备完成。一般与prepareAsync配合使用。
setOnVideoSizeChangedListener(android.media.MediaPlayer.OnVideoSizeChangedListener)
获知video大小或video大小改变时的监听。
setOnSeekCompleteListener(android.media.MediaPlayer.OnSeekCompleteListener)
监听调整位置完成。
setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener)
播放完成。
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { // 当前播放完毕 } });
setOnBufferingUpdateListener(android.media.MediaPlayer.OnBufferingUpdateListener)
监听缓冲进度。在播放网络音频时常用。
缓冲监听器OnBufferingUpdateListener
mMediaPlayer.prepareAsync(); mMediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { // 例如在这里更新UI } });
setOnInfoListener(android.media.MediaPlayer.OnInfoListener)
监听普通信息或者警告信息。
setOnErrorListener(android.media.MediaPlayer.OnErrorListener)
监听错误信息。错误发生时,可以在这里处理错误。
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mediaPlayer, int i, int i1) { LogUtil.e(TAG_PREFIX + " onERR i = " + i + " i1 = " + i1); return true; // 返回true表示在此处理错误,不会回调onCompletion } });
注意onError的返回值。可以选择自己处理error。 * @return True if the method handled the error, false if it didn't. * Returning false, or not having an OnErrorListener at all, will * cause the OnCompletionListener to be called. */ boolean onError(MediaPlayer mp, int what, int extra);
倍速播放
从Android API 23 (Android M)开始,MediaPlayer支持调整播放速度。
使用的方法是setPlaybackParams,传入一个代表播放属性的类PlaybackParams。
MediaPlayer.setPlaybackParams 说明
播放速度设置在PlaybackParams对象中,再将此对象传入setPlaybackParams。
setPlaybackParams是一个native方法。
如果MediaPlayer没有准备(在prepared之前),调用此方法并不会改变MediaPlayer的状态。
在MediaPlayer成功prepare之后,如果设置的速度为0,相当于调用了pause方法;如果设置速度不为0,相当于调用了start方法。
异常情况
如果MediaPlayer没有初始化或者已经被释放,即处于Idle或End状态,调用setPlaybackParams方法会抛出IllegalStateException异常。
如果传入的PlaybackParams不被支持,则抛出IllegalArgumentException异常。
如果设置速度小于0,则抛出java.lang.IllegalArgumentException异常。
MediaPlayer.setPlaybackParams 示例
设置播放速度。先判断当前系统版本。
private fun setPlaySpeed(speed: Float): Boolean { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { val params: PlaybackParams = mediaPlayer.getPlaybackParams() params.speed = speed mediaPlayer.setPlaybackParams(params) return true } return false }
getPlaybackParams可以获取到MediaPlayer当前的PlaybackParams对象。
也可以给这个方法加上try catch,结合返回的boolean值判断设置速度是否成功。
private fun setPlaySpeed(speed: Float): Boolean { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { try { val params: PlaybackParams = mediaPlayer.getPlaybackParams() params.speed = speed mediaPlayer.setPlaybackParams(params) true } catch (e: java.lang.Exception) { Log.e(TAG, "setPlaySpeed: ", e) false } } else false }
PlaybackParams 包含的速度值
调整MediaPlayer播放速度时,我们使用了PlaybackParams对象。AudioTrack也会用到这个类。
PlaybackParams包含着播放时候的一些属性。例如speed就是播放速度。
PlaybackParams.setSpeed(float speed)#
传入速度倍率值。会标记当前设置过了速度。
fun setSpeed(speed: Float): PlaybackParams? { mSpeed = speed mSet = mSet or SET_SPEED return this
PlaybackParams.getSpeed()
获取已设置的速度值。如果之前没设置过速度,则抛出IllegalStateException异常。
fun getSpeed(): Float { check(!(mSet and SET_SPEED === 0)) { "speed not set" } return mSpeed }