}
btn_restart.setOnClickListener {
audioRestart()
}
}
主要 是一些播放器的监听事件和按钮操作事件。
着重介绍两个:
1、setOnPreparedListener
注意,在获取资源时长
的时候,需要在播放器准备完成
之后获取,否则会有异常
:
Attempt to call getDuration in wrong state: mPlayer=0x7244676280, mCurrentState=4
error (-38, 0)
并会回调OnErrorListener
。
然后设置显示,并把时长赋值给seek_bar
的最大值。
2、setOnSeekBarChangeListener
3个方法:
-
onProgressChanged 进度改变
-
onStartTrackingTouch 开始拖动
-
onStopTrackingTouch 停止拖动
我们需要在改变中
和改变后
对当前播放时长
进行更新,并在最后的位置进行播放操作。
如果程序上没有定位到指定播放位置
这种操作的话,不要在onProgressChanged
中执行播放操作,因为频繁的进度改变,频繁的调用播放,会有杂音
。
所以建议用户手动拖动来触发播放。
如果非要程序可以跳到指定位置播放的话,建议如下操作:
btn_seek.setOnClickListener {
seek_bar.progress = (seek_bar.max * 0.8).roundToInt()
mMediaPlayer?.seekTo(seek_bar!!.progress)
tv_currentPosition.text = formatDuration(seek_bar!!.progress)
audioStart()
}
手动赋值progress
,并调用播放。
格式化播放时间
这个获取时长返回的是毫秒
,所以我们还需要对其格式化
操作。
/**
- 格式化播放时间
*/
private fun formatDuration(duration: Int): String {
val d = duration / 1000
val minute = d / 60
val second = d % 60
val m: String = if (minute < 10) “0 m i n u t e " e l s e