wanna be dev 🧑‍💻

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

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

Android/Challenge

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

Kick_snare 2022. 3. 12. 23:00
728x90

48일차

30개 프로젝트로 배우는 Android 앱 개발 with Kotlin 초격차 패키지 Online

강의 목표


  • 프로젝트를 따라해보며 앱개발에 필요한 기술을 학습할 수 있습니다.
  • 프로젝트를 따라해보며 앱개발에 필요한 기술을 학습할 수 있습니다.
  • 앱 개발시 원하는 기능을 구현하기 위해 어떤 기술이 필요한 지 알 수 있습니다.
  • 디자인 아키텍처 패턴, 비동기 처리 등 효율적인 앱 개발 방법을 익힐 수 있습니다.

목차 02 Basic - Ch07. 녹음기


  • 기본 UI 구성
  • 권한 요청하기
  • 녹음 기능 구현하기 - 1
  • 녹음 기능 구현하기 - 2
  • 오디오 시각화
  • 마무리

오디오 시각화

이번에는 마지막으로 남은 녹음시간 / 재생 시간을 표시 해줄 것이다.

SoundVisulizer와 마찬가지로 customView class를 만들어 상태를 업데이트 해줄 것이다.

class CountUpTextView(
    context: Context,
    attrs: AttributeSet? = null
) : AppCompatTextView(context, attrs) {
	
}

context와 attr set를 인자로 받아 넘겨주고 이전과 마찬가지로 자기자신을 반복 호출하는 runnable를 객체를 만들자. 그리고 그에 관한 핸들어 함수를 만들면 ez합니다

private var startTimeStamp: Long = 0L;

private val countUpAction: Runnable = object : Runnable {
    override fun run() {
        val currentTimeStamp = SystemClock.elapsedRealtime()
        val countTimeSeconds = ((currentTimeStamp - startTimeStamp)/1000L).toInt()
        updateCountTime(countTimeSeconds)
        handler?.postDelayed(this, 1000L)
    }
}

fun startCountUp() {
    startTimeStamp = SystemClock.elapsedRealtime()
    handler?.post(countUpAction)
}

fun stopCountUp() {
    handler?.removeCallbacks(countUpAction)
}

private fun updateCountTime(countTimeSeconds: Int) {
    val minutes = countTimeSeconds / 60
    val seconds = countTimeSeconds % 60

    this.text = "%02d:%02d".format(minutes, seconds)
}

이전에 했던 내용과 거의 비슷하기에 바로 모두 올렸다.

start할때 시작 timestamp를 찍어 runnable 객체가 호출 될때마다 (1초) 현재 timestamp 값을 빼서 녹음 또는 재생 시간을 구한다.

soundVisulizerView보다 간단하게 모두 시작과 끝에 핸들러를 붙여주면 정말로 끝

private fun startRecord() {
    recorder = MediaRecorder().apply {
        setAudioSource(MediaRecorder.AudioSource.MIC)
        setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP) // 컨테이너
        setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB) // 코덱 지정
        setOutputFile(recordingFilePath)
        prepare()
    }
    recorder?.start()
    soundVisualizerView.startVisualizing(false)
    recordTimeTextView.startCountUp()
    state = State.ON_RECORDING
}

private fun stopRecording() {
    recorder?.run {
        stop()
        release()
    }
    recorder = null
    soundVisualizerView.stopVisualizing()
    recordTimeTextView.stopCountUp()
    state = State.AFTER_RECORDING
}

private fun startPlaying() {
    player = MediaPlayer().apply {
        setDataSource(recordingFilePath)
        prepare()
        // prepare Async 는 비동기적으로.. 지금은 금방 되니까 걍
    }
    player?.start()
    soundVisualizerView.startVisualizing(true)
    recordTimeTextView.startCountUp()
    state = State.ON_PLAYING
}

private fun stopPlaying() {
    player?.release()
    player = null
    soundVisualizerView.stopVisualizing()
    recordTimeTextView.stopCountUp()
    state = State.BEFORE_RECORDING
}

참 쉽다 그죠???


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

수강인증샷

링크

https://bit.ly/37BpXiC

 

728x90