今天嘗試來做做看 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 的部分我們直接指向了,我們所創造的路徑。
這樣就可以讀取到囉,明天就是重頭戲,錄音的部分囉~~