43일차
30개 프로젝트로 배우는 Android 앱 개발 with Kotlin 초격차 패키지 Online
강의 목표
- 프로젝트를 따라해보며 앱개발에 필요한 기술을 학습할 수 있습니다.
- 프로젝트를 따라해보며 앱개발에 필요한 기술을 학습할 수 있습니다.
- 앱 개발시 원하는 기능을 구현하기 위해 어떤 기술이 필요한 지 알 수 있습니다.
- 디자인 아키텍처 패턴, 비동기 처리 등 효율적인 앱 개발 방법을 익힐 수 있습니다.
목차 02 Basic - Ch07. 녹음기
기본 UI 구성권한 요청하기- 녹음 기능 구현하기 - 1
- 녹음 기능 구현하기 - 2
- 오디오 시각화
- 마무리
녹음 기능 구현하기 - 1
MediaPlayer
녹음을 위한 MediaRecorder 객체를 사용하였으니 이번에는 재생을 위한 MediaPlayer 객체를 사용할 것이다. 마찬가지로 여러가지 상태를 가지며 재생을 위해 준비가 필요하다.
우리는 setDataSource, prepare, start, stop 정도의 과정을 거치면 되겠다.
다시 사용하지 않을 것이기 때문에 prepare로 돌아가지 않고 stopped 후 메모리 해제 해줄 것임
시작과 정지
마찬가지로 객체 생성 후 함수를 짜주도록하자
private var player: MediaPlayer? = null
private fun startPlaying() {
player = MediaPlayer().apply {
setDataSource(recordingFilePath)
prepare()
// prepare Async 는 비동기적으로.. 지금은 금방 되니까 걍
}
player?.start()
state = State.ON_PLAYING
}
private fun stopPlaying() {
player?.release()
player = null
state = State.BEFORE_RECORDING
}
저번 mediaRecorder 때 안적었는데 상태 변화를 위한 상태 지정문을 넣어주었다.
그리고 위에 주석에도 적었지만 prepare 대신 로드하기 큰경우 async 하게 쓸 수 있다고 하는데 어짜피 로컬에서 가져와 쓸 것임으로 그냥 prepare() 하였다.
뷰바인딩
상태는 함수들로 매번 바뀌겠지만 상태와 묶긴 뷰(아이콘) 은 그렇지 않죠? 뷰바인딩이 필요합니다.
private var state = State.BEFORE_RECORDING
set(value) {
field = value
recordButton.updateIconWithState(value)
}
짜잔~ 충격 이런방법이!!
그렇다고 합니다. 그리고 클릭 리스너를 달아줍니다.
private fun bindViews() {
recordButton.setOnClickListener{
when(state) {
State.BEFORE_RECORDING-> startRecord()
State.ON_RECORDING-> stopRecording()
State.AFTER_RECORDING-> startPlaying()
State.ON_PLAYING-> stopPlaying()
}
}
}
참 간단하쥬? 실행해보면 녹음이 되는걸 알 수 있습니다. 다음 시간엔 흘러가는 시간을 나타내보면 되겠다 그죠?
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
수강인증샷
링크
'Android > Challenge' 카테고리의 다른 글
패스트캠퍼스 챌린지 45일차 (0) | 2022.03.09 |
---|---|
패스트캠퍼스 챌린지 44일차 (0) | 2022.03.09 |
패스트캠퍼스 챌린지 42일차 (0) | 2022.03.06 |
패스트캠퍼스 챌린지 41일차 (0) | 2022.03.05 |
패스트캠퍼스 챌린지 40일차 (0) | 2022.03.04 |