您的位置 首页 > 德语词汇

private media是什么意思、读音,Android MediaPlayer音频播放器详解

大家好,今天来为大家解答private media是什么意思、读音这个问题的一些问题点,包括Android MediaPlayer音频播放器详解也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

音频播放,是比较常见或常用的功能,比如音乐播放器、新闻播报、听书等等,而恰巧如果你想自定义一个音频播放器的话,本文一定对你有帮助!

private media是什么意思、读音,Android MediaPlayer音频播放器详解

具体的xml代码就不贴了,看一下组件树

/**\n*初始化及资源准备\n*/\nprivatefunaudioPrepare(path:String){\nmMediaPlayer=MediaPlayer().apply{\nsetDataSource(path)//支持文件、网络地址、uri\nprepareAsync()//异步准备,不阻塞UI线程\nisLooping=false//循环播放\n}\n\ninitMediaPlayerListener()\n}\n

setDataSource,设置数据源,支持本地文件、网络请求的地址、uri等,看一下源码:

如果是本地文件,注意读写权限。

prepareAsync()异步准备,不阻塞UI线程

然后看一下调用的initMediaPlayerListener方法

/**\n*播放器监听事件\n*/\nprivatefuninitMediaPlayerListener(){\n\nmMediaPlayer?.setOnBufferingUpdateListener{mp,percent->\nLogUtil.i("缓冲进度$percent%")\n}\n\nmMediaPlayer?.setOnPreparedListener{\nLogUtil.i("准备完成")\n//在准备完成之后获取信息,否则会有异常\nvalduration=mMediaPlayer?.duration//时长\nvalcurrentPosition=mMediaPlayer?.currentPosition//当前位置\nLogUtil.i("当前位置$currentPosition/时长$duration")\n\ntv_currentPosition.text=formatDuration(currentPosition!!)\ntv_duration.text=formatDuration(duration!!)\n\nseek_bar.max=duration\n}\n\nmMediaPlayer?.setOnCompletionListener{\nLogUtil.i("播放完毕")\n}\n\nmMediaPlayer?.setOnErrorListener{mp,what,extra->\nLogUtil.i("播放错误")\nreturn@setOnErrorListenertrue\n}\n\nmMediaPlayer?.setOnSeekCompleteListener{\nLogUtil.i("定位完成")\n}\n\nseek_bar.setOnSeekBarChangeListener(object:SeekBar.OnSeekBarChangeListener{\noverridefunonProgressChanged(seekBar:SeekBar?,progress:Int,fromUser:Boolean){\ntv_currentPosition.text=formatDuration(seekBar!!.progress)\n}\n\noverridefunonStartTrackingTouch(seekBar:SeekBar?){\n}\n\noverridefunonStopTrackingTouch(seekBar:SeekBar?){\n//拖动结束之后再设置,如果在onProgressChanged中设置会有杂音\nmMediaPlayer?.seekTo(seekBar!!.progress)\ntv_currentPosition.text=formatDuration(seekBar!!.progress)\n}\n})\n\nbtn_start.setOnClickListener{\naudioStart()\n}\nbtn_pause.setOnClickListener{\naudioPause()\n}\nbtn_seek.setOnClickListener{\nseek_bar.progress=(seek_bar.max*0.8).roundToInt()\nmMediaPlayer?.seekTo(seek_bar!!.progress)\ntv_currentPosition.text=formatDuration(seek_bar!!.progress)\naudioStart()\n}\nbtn_restart.setOnClickListener{\naudioRestart()\n}\n}\n

主要是一些播放器的监听事件和按钮操作事件。

注意,在获取资源时长的时候,需要在播放器准备完成之后获取,否则会有异常:

AttempttocallgetDurationinwrongstate:mPlayer=0x7244676280,mCurrentState=4\nerror(-38,0)\n

并会回调OnErrorListener。

然后设置显示,并把时长赋值给seek_bar的最大值。

我们需要在改变中和改变后对当前播放时长进行更新,并在最后的位置进行播放操作。

如果程序上没有定位到指定播放位置这种操作的话,不要在onProgressChanged中执行播放操作,因为频繁的进度改变,频繁的调用播放,会有杂音。

所以建议用户手动拖动来触发播放。

如果非要程序可以跳到指定位置播放的话,建议如下操作:

btn_seek.setOnClickListener{\nseek_bar.progress=(seek_bar.max*0.8).roundToInt()\nmMediaPlayer?.seekTo(seek_bar!!.progress)\ntv_currentPosition.text=formatDuration(seek_bar!!.progress)\naudioStart()\n}\n

手动赋值progress,并调用播放。

这个获取时长返回的是毫秒,所以我们还需要对其格式化操作。

/**\n*格式化播放时间\n*/\nprivatefunformatDuration(duration:Int):String{\nvald=duration/1000\nvalminute=d/60\nvalsecond=d%60\nvalm:String=if(minute<10)"0$minute"else"$minute"\nvals:String=if(second<10)"0$second"else"$second"\nreturn"$m:$s"\n}\n

做了一个判断,不足两位数则前位补0。

/**\n*开始播放\n*/\nprivatefunaudioStart(){\nmMediaPlayer?.run{\nif(!this.isPlaying){\nstart()\nstartTimer()\n}\n}\n}\n

因为没有播放中的回调接口,所以这里启动一个Timer获取当前位置并更新UI

/**\n*每隔一秒执行一次,更新当前播放时间\n*/\nprivatefunstartTimer(){\nmTimer=Timer().apply{\nschedule(object:TimerTask(){\noverridefunrun(){\n//非ui线程不能更新view,所以这里赋值给seek_bar,在seek_bar的事件中去更新\nseek_bar.progress=mMediaPlayer!!.currentPosition\n//tv_currentPosition.text=formatDuration(mMediaPlayer!!.currentPosition)\n}\n},0,1000)\n}\n}\n

这里要注意,非ui线程不能更新view,所以这里赋值给seek_bar,在seek_bar的onProgressChanged回调中去更新。

/**\n*暂停播放\n*/\nprivatefunaudioPause(){\nmMediaPlayer?.run{\nif(this.isPlaying){\npause()\ncancelTimer()\n}\n}\n}\n

同样,暂停的时候取消Timer,做到资源及时回收。

privatefuncancelTimer(){\nmTimer?.run{\ncancel()\nmTimer=null\n}\n}\n暂停/继续播放

/**\n*暂停/继续播放\n*/\nprivatefunaudioToggle(){\nmMediaPlayer?.run{\nif(this.isPlaying){\naudioPause()\n}else{\naudioStart()\n}\n}\n}\n

如果只有一个事件触发的话,可以这么来写。

播放器并没有自带restart()方法,不过我们可以手动把播放位置改到初始值,并调用播放。

/**\n*重新播放\n*/\nprivatefunaudioRestart(){\nmMediaPlayer?.run{\n//定位到指定位置,单位毫秒\nseekTo(0)\naudioStart()\n\nseek_bar.progress=0\ntv_currentPosition.text=formatDuration(seek_bar!!.progress)\n\n//如果是下一首,可以调用reset()重置,然后set新的数据源\n}\n}\n

如果是下一首,可以调用reset()重置,然后set新的数据源。

及时的回收,有利于更好的性能。

overridefunonDestroy(){\nmAgentWeb.webLifeCycle.onDestroy()\nsuper.onDestroy()\n\ncancelTimer()\n\nmMediaPlayer?.run{\nstop()\nrelease()\nmMediaPlayer=null\n}\n}\n

ok,到此就讲解完了。

写作不易,如果对你有用,点个赞吧^-^

文章分享结束,private media是什么意思、读音和Android MediaPlayer音频播放器详解的答案你都知道了吗?欢迎再次光临本站哦!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023