wanna be dev 🧑‍💻

Cool 하고 Sick한 개발자가 되고 싶은 uzun입니다

A.K.A. Kick-snare, hyjhyj0901, h_uz99 solvedac-logo

Android/Challenge

패스트캠퍼스 챌린지 43일차

Kick_snare 2022. 3. 7. 17:40
728x90

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()
        }
		}
}

참 간단하쥬? 실행해보면 녹음이 되는걸 알 수 있습니다. 다음 시간엔 흘러가는 시간을 나타내보면 되겠다 그죠?


본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

수강인증샷

링크

https://bit.ly/37BpXiC

 

 

 

728x90