1. 변수 세팅
private var outputPath: String? = null // 녹화한 파일 저장 경로
private var mediaRecorder : MediaRecorder? = null
private var state : Boolean = false // 녹음 상태
private var hasRecorded : Boolean = false // 녹화되었는지 여부
private var timerHandler: Handler? = null // 초수 증가용 타이머
private var timerRunnable: Runnable? = null
private var secondsElapsed: Int = 0 // 타이머 초
2. 녹음 시작
2-1. 녹음 버튼 클릭
// 녹음 시작 버튼
binding.recordPlayBtn.setOnClickListener {
startRecording()
}
2-1. 녹음 함수 - startRecording()
// 녹음 시작
private fun startRecording(){
if (hasRecorded == false) { // 녹음 시작 (일시정지한 적 없는 경우)
hasRecorded = true // 녹음 된 적 있음 (일시정지 후 재시작 구분하기 위함)
val fileName = Date().getTime().toString() + ".mp3" // 음성 파일 명 설정
outputPath =
Environment.getExternalStorageDirectory().absolutePath + "/Download/" + fileName
mediaRecorder = MediaRecorder()
mediaRecorder?.setAudioSource((MediaRecorder.AudioSource.MIC))
mediaRecorder?.setOutputFormat((MediaRecorder.OutputFormat.MPEG_4))
mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
mediaRecorder?.setOutputFile(outputPath)
mediaRecorder?.prepare() // 준비
mediaRecorder?.start() // 녹음 시작
state = true // 녹음 상태 참
}
else{ // 녹음 시작 (일시정지한 적 있는 경우)
state = true // 녹음 상태 참
mediaRecorder?.resume() // 이어서 녹음
}
startTimer() // 초수 증가용
binding.recordPlayBtn.visibility = View.GONE // 재생 버튼 사라짐
binding.recordPauseBtn.visibility = View.VISIBLE // 일시정지 버튼 보이게
}
3. 녹음 일시 정지
3-1. 일시정지 버튼 클릭
// 녹음 일시정지 버튼
binding.recordPauseBtn.setOnClickListener {
pauseRecording()
binding.recordPlayBtn.visibility = View.VISIBLE // 일시정지 버튼 사라짐
binding.recordPauseBtn.visibility = View.GONE // 재생 버튼 보이게
}
3-2. 일시정지 함수 - pauseRecording()
// 일시정지
private fun pauseRecording(){
if(state){ // 녹음 상태 참일 때
mediaRecorder?.pause()
binding.restartBtn.visibility = View.VISIBLE // 재생 버튼 보이게
} else {
}
timerRunnable?.let { timerHandler?.removeCallbacks(it) } // 초수 (타이머 용)
}
4. 녹음 정지
4-1. 녹음 정지 버튼 클릭
binding.okBtn.setOnClickListener {
stopRecording()
}
4-2. 녹음 정지 함수 - stopRecording()
// 정지
private fun stopRecording(){
if(state){ // 녹음 상태 참일 때
state = false // 이제 녹음 상태 거짓
hasRecorded = false // 녹음된 적 없음 - 일시정지 못하게
mediaRecorder?.stop() // 녹음 정지
mediaRecorder?.reset()
mediaRecorder?.release()
binding.restartBtn.visibility = View.VISIBLE // 초기화 버튼 보이게
} else {
}
timerRunnable?.let { timerHandler?.removeCallbacks(it) } // 초수 (타이머 용)
}
5. 초기화
초기화 함수 - resetRecording()
fun resetRecording() {
if (state) { // 녹음 상태 참일 때
mediaRecorder?.stop()
mediaRecorder?.reset()
mediaRecorder?.release()
state = false // 녹음 상태 거짓
hasRecorded = false // 녹음된 적 거짓
outputPath = null // 파일 경로 없음
binding.restartBtn.visibility = View.GONE // 초기화 버튼 사라짐
} else {
}
timerRunnable?.let { timerHandler?.removeCallbacks(it) } // 초수 (타이머 용)
secondsElapsed = 0 // 카운트 초 초기화
binding.timerTv.text = "00:00" // 카운트 초 텍스트 초기화
}
6. 타이머 (초 증가하는거 보이게)
startTimer()
private fun startTimer() {
timerHandler = Handler()
timerRunnable = object : Runnable {
override fun run() {
if (secondsElapsed < 10) {
binding.timerTv.text = "00:0" + secondsElapsed++.toString()
} else {
binding.timerTv.text = "00:" + secondsElapsed++.toString()
}
timerHandler?.postDelayed(this, 1000) // 1초씩 증가
}
}
}
timerHandler?.postDelayed(timerRunnable!!, 0)
}
'공부 > 안드로이드' 카테고리의 다른 글
[Android/Kotlin] 복사하기 기능 (0) | 2024.02.21 |
---|---|
[Android/Kotlin] API 연결 (0) | 2024.02.21 |
[Android/Kotlin] 음성 재생/일시정지 (0) | 2024.02.21 |
[Android/Kotlin] 카카오 로그인/회원가입 (0) | 2024.02.21 |
[Android/Kotlin] Custom Dialog (팝업) (0) | 2024.02.21 |