iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 29
0

MediaRecorder

Recorder

今天嘗試來做做看 MediaRecorder 原理跟 MediaPlayer 類似。
這個 Project 同時有錄音跟撥放的功能。
同時我們也希望他能夠把錄音檔給存在手機 Local 端。

實作流程

這次需要用到的東西很多,我們先來看看我們會需要的元件跟變數有哪些吧!

MainActivity.kt

    lateinit var soundFile: File
    lateinit var mediaRecorder: MediaRecorder
    lateinit var mediaPlayer: MediaPlayer
    lateinit var animator: ObjectAnimator
    lateinit var file: File
    val permission = arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE,android.Manifest.permission.RECORD_AUDIO)
    var recordBtnStatus = "RECORD"
    var playingBtnStatus = "PLAY"
    var recordingStatus = true

建立檔案

因為我們希望可以把錄音下來的資料存在 Local 端我們所指定的資料夾。
那我們就來看看該如何做吧。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

如何取到使用者的 Permission 這邊就不再多敘述囉~~

private fun createFile() {
        file = File(Environment.getExternalStorageDirectory(),"Record")
        if (!file.exists()) {
            file.mkdirs()
            Toast.makeText(this, "folder is create", Toast.LENGTH_SHORT).show()
        }
        soundFile = File.createTempFile ("birdRecording", ".3gp", file)
    }

我們建立了一個 file 他使用了 File 這個 class 。 將資料夾命名為 Record 。
並在後面判斷,如果資料夾還沒被建立,就建立資料夾。
在來我們嘗試建立一個暫時的檔案,使用的是 createTempFile 這個 method 他需要提供檔名(前綴)、副檔名(後綴),再把存取的路徑放進去。就可以有囉。

private fun playOrStopCheck() {
        when (playingBtnStatus) {
            "PLAY" -> {
                if (soundFile == null) {
                    Toast.makeText(this, "no file", Toast.LENGTH_SHORT).show()
                }
                mediaPlayer.setDataSource(soundFile.absolutePath)
                mediaPlayer.prepare()
                mediaPlayer.start()
                
                animator.start()

                mediaPlayer.setOnCompletionListener {
                    animator.end()
                    playingBtnStatus = "PLAY"
                    playStopBtn.text = "PLAY"
                    playStopBtn.isEnabled = false
                    recordStopBtn.isEnabled = true
                }
                playingBtnStatus = "STOP"
                playStopBtn.text = "STOP"
            }

            "STOP" -> {
                mediaPlayer.stop()
                mediaPlayer.reset()
                animator.end()

                playingBtnStatus = "PLAY"
                playStopBtn.text = "PLAY"
                recordStopBtn.isEnabled = true
                playStopBtn.isEnabled = false

            }
        }
    }

我們這裡看到我們使用了與之前 MediaPlayer 時用過類似的判斷。
我們這裡要特別注意的是 setDataSource 的部分我們直接指向了,我們所創造的路徑。

這樣就可以讀取到囉,明天就是重頭戲,錄音的部分囉~~


上一篇
Day28_TransitionActivity
下一篇
Day30_MediaRecorder
系列文
發現新大陸-Android Kotlin 開發之路30

尚未有邦友留言

立即登入留言