iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 29
0
Software Development

英國研究顯示,連續30天用Kotlin開發Android將有益於身心健康系列 第 29

Android Kotlin 實作 Day 19:LittleBirdSound(上)(MediaPlayer)

使用語言

  • Kotlin

使用元件

  • ImageView
  • TextView
  • Button
  • ProgressBar

Method


MediaPlayer

音樂撥放器

  • 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 實例

  • prepare

    準備 MediaPlayer(在播放前須先準備 MediaPlayer)

    prepare ()

  • start

    播放音樂

    start ()

    mediaPlayer.start()
    
  • pause

    暫停播放

    pause ()

    mediaPlayer.pause()
    
  • stop

    結束播放

    stop ()

    mediaPlayer.stop()
    
    
  • reset

    將 MediaPlayer 重置為未初始化的狀態

    reset()

    # reset 後若要再次使用該 MediaPlayer 實例,需重新設定音檔資源
      並調用 prepare 方法以再次初始化及準備該 MediaPlayer。

  • release

    釋放該 MediaPlayer 實例中的所有資源

    release ()

    # 釋放後該 MediaPlayer 實例會進入到 End 狀態,並且沒有任何方法
      可以從 End 狀態變回其他狀態,也就表示該實例無法再被使用。

    # 當確定 MediaPlayer 實例不會在被使用後,就應該要用 release 方法
      釋放資源,否則可能導致設備持續耗電或其他應用無法正常播放。

  • getDuration

    取得 MediaPlayer 中音源的時間長度

    getDuration (): Int

    • 回傳為音源的時間長度,單位為毫秒。
    //  progressSeekBar 為用來顯示播放進度的進度條的 id
    // 此步驟為將進度條的最大值設為音源的時長
    progressSeekBar.max = mediaPlayer.duration
    
  • getCurrentPosition

    取得目前已播放的時間長度,也就是播放進度。

    getCurrentPosition (): Int

    • 回傳為播放進度的時間位置,也就是已播放的時長,單位為毫秒。
    // 設置進度條的進度為播放進度
    progressSeekBar.progress = mediaPlayer.currentPosition
    
  • seekTo

    將播放器的播放位置設定至指定的時間位置,也就是指定播放進度。

    seekTo (msec: Int)

    • msec:指定想要的播放時間位置,單位為毫秒。
    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?) {...}
    }
    
  • setVolume

    設定播放器的音量

    此方法設定為改變 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

    播放器是否正在播放

    isPlaying (): Boolean

    • 回傳為 Boolean 值,播放中為 true,反之為 false。
     if (mediaPlayer.isPlaying) {...}
    
  • setOnCompletionListener

    用來監聽音樂播放器是否已播放完成,並執行播放完成後要執行的事件。

    setOnCompletionListener (listener: MediaPlayer.OnCompletionListener)

    • listener:要設置給該音樂播放器的監聽器。

      MediaPlayer.OnCompletionListener 為一個 Interface,裡面有一個 onCompletion 方法。

      onCompletion (mp: MediaPlayer)

      • mp:設定此監聽器的 MediaPlayer 實例。

      一般寫法:

       mediaPlayer.setOnCompletionListener(mediaPlayerListener)  
      
       val mediaPlayerListener = object: MediaPlayer.OnCompletionListener {
           override fun onCompletion (mp: MediaPlayer){
               // 音樂播完後要執行的事件
           }
      }
      

      Lambda 寫法:

      mediaPlayer.setOnCompletionListener(mediaPlayerListener)  
      
      val mediaPlayerListener = MediaPlayer.OnCompletionListener {
           // 音樂播完後要執行的事件
      }
      

查看詳細 Code > GitHub

tags: Android Kotlin MediaPlayer

接下來關於 MediaRecorder 請參考 下篇 >>


上一篇
Android Kotlin 實作 Day 18: SideMenu(Navigation Drawer Activity)
下一篇
Android Kotlin 實作 Day 19:LittleBirdSound(下)(MediaRecorder)
系列文
英國研究顯示,連續30天用Kotlin開發Android將有益於身心健康30

尚未有邦友留言

立即登入留言