音樂撥放器
MediaPlayer 的 狀態圖(圖片來源為官方文件)
建立 MediaPlayer 實例
create (context: Context, resid: Int): MediaPlayer
利用給定的 Resource 建立 MediaPlayer 實例
成功建立後會自動執行 prepare 方法
context:MediaPlayer 要使用的 Context
resid:放在 res/raw/ 資料夾下的音檔的 Resource id
回傳為一個 MediaPlayer 實例
val mediaPlayer = MediaPlayer.create(this, R.raw.country_cue_1)
create (context: Context, uri: Uri)
利用給定的 Uri 建立 MediaPlayer 實例
成功建立後會自動執行 prepare 方法
context:MediaPlayer 要使用的 Context
uri:指定音檔的 uri
回傳為一個 MediaPlayer 實例
準備 MediaPlayer(在播放前須先準備 MediaPlayer)
prepare ()
播放音樂
start ()
mediaPlayer.start()
暫停播放
pause ()
mediaPlayer.pause()
結束播放
stop ()
mediaPlayer.stop()
將 MediaPlayer 重置為未初始化的狀態
reset()
# reset 後若要再次使用該 MediaPlayer 實例,需重新設定音檔資源
並調用 prepare 方法以再次初始化及準備該 MediaPlayer。
釋放該 MediaPlayer 實例中的所有資源
release ()
# 釋放後該 MediaPlayer 實例會進入到 End 狀態,並且沒有任何方法
可以從 End 狀態變回其他狀態,也就表示該實例無法再被使用。
# 當確定 MediaPlayer 實例不會在被使用後,就應該要用 release 方法
釋放資源,否則可能導致設備持續耗電或其他應用無法正常播放。
取得 MediaPlayer 中音源的時間長度
getDuration (): Int
// progressSeekBar 為用來顯示播放進度的進度條的 id
// 此步驟為將進度條的最大值設為音源的時長
progressSeekBar.max = mediaPlayer.duration
取得目前已播放的時間長度,也就是播放進度。
getCurrentPosition (): Int
// 設置進度條的進度為播放進度
progressSeekBar.progress = mediaPlayer.currentPosition
將播放器的播放位置設定至指定的時間位置,也就是指定播放進度。
seekTo (msec: Int)
val progressSeekBarListener = object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
if (fromUser) mediaPlayer.seekTo(progress)
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {...}
override fun onStopTrackingTouch(seekBar: SeekBar?) {...}
}
設定播放器的音量
此方法設定為改變 APP 播放的音量,不會改變手機系統設定的音量
setVolume (leftVolume: Float, rightVolume: Float)
leftVolume:左聲道音量,值的範圍為 0.0~1.0 之間。
rightVolume:右聲道音量,值的範圍為 0.0~1.0 之間。
// 設置此監聽器的 SeekBar 為讓用者拖曳決定音量的進度條
val seekBarListener = object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
mediaPlayer.setVolume(progress / 100f, progress / 100f)
textView.text = "Volume : $progress %"
}
override fun onStartTrackingTouch(seekBar: SeekBar?) { }
override fun onStopTrackingTouch(seekBar: SeekBar?) { }
}
播放器是否正在播放
isPlaying (): Boolean
if (mediaPlayer.isPlaying) {...}
用來監聽音樂播放器是否已播放完成,並執行播放完成後要執行的事件。
setOnCompletionListener (listener: MediaPlayer.OnCompletionListener)
listener:要設置給該音樂播放器的監聽器。
MediaPlayer.OnCompletionListener 為一個 Interface,裡面有一個 onCompletion 方法。
onCompletion (mp: MediaPlayer)
一般寫法:
mediaPlayer.setOnCompletionListener(mediaPlayerListener)
val mediaPlayerListener = object: MediaPlayer.OnCompletionListener {
override fun onCompletion (mp: MediaPlayer){
// 音樂播完後要執行的事件
}
}
Lambda 寫法:
mediaPlayer.setOnCompletionListener(mediaPlayerListener)
val mediaPlayerListener = MediaPlayer.OnCompletionListener {
// 音樂播完後要執行的事件
}
Android
Kotlin
MediaPlayer