일단 권한먼저 넣어놓자.
API지원은 21부터로 설정했고 실습을 위해 갤럭시 노트3를 준비해뒀다. api 26 부터 하고 싶었으나 놀고있는 공기계가 없었다. 구해볼 예정이다.
minSdk 변경은 gradle에서 적용한다.
build.gradle 중 app 수준 파일에서 minSdk값을 21로 바꿔주면 실제 기기인 노트3를 연결해 디버깅을 할 수 있다.
https://developer.android.com/guide/topics/media/mediarecorder?hl=ko#kotlin
여기 올라와 있는 샘플코드를 자세히 분석해 볼 예정이다.
작동원리에 대한 다이어그램이다. 오디오소스를 정할때가 초기화가 끝나는 시점, 인코더를 정하고나서 mediarecorder를 사용할 준비가 완료되는 것으로 보인다.
동작 전에 사용할 버튼을 하나 만들었다.
녹음시작, 정지, 릴리즈 버튼 이렇게 세 개를 준비했다.
예제를 보니 Common Case라고 나온게 있다. 코드 생긴걸 보니 전혀 코틀린이 아니지만 일단 넣어서 수정하면 될 것이다.
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(PATH_NAME);
recorder.prepare();
recorder.start(); // Recording is now started
...
recorder.stop();
recorder.reset(); // You can reuse the object by going back to setAudioSource() step
recorder.release(); // Now the object cannot be reused
recorder 객체를 만들어 확장함수를 이용하는 방식이다. 일단 그대로 따라해 보았다.
PATH는 앱 내부저장소에 저장하는 것으로 했다. 절대경로를 file객체로 가져오려고했는데 코틀린에서 filesDir로 너무 쉽게 가져왔다.
위에 있던 샘플 예제가 너무 오류를 뿜어서 처음에 조금 당황했다. 보기에는 잘 정리된 것 같으니 실행해보도록 하자.
사진에서는 안나왔지만 release되고 log로 절대경로가 잘 찍히는 지 확인하는 코드를 추가했다.
앱이 실행도 제대로 안되고 바로 죽어버렸다...
stop과 release를 stop버튼에 넣고, <- 이렇게 하니 실행은 일단 성공했다.
record 시작부분을 모두 btnRecord에 넣어줬다.
recorder를 사용하던 확장함수들을 apply로 한 데 몰아주었다. stop, release부분에서 null이 될 수도 있어서 recorder?.apply{ }로 바꿔주었다.
잘 켜지긴 하지만 recording 버튼을 두번 누르거나, stop을 누르는 경우 앱이 죽는다. 아마 null exception이 아닐까...
도저히 감이 안잡혀 샘플 코드를 액티비티로 만들어 보았다.
샘플코드는 너무 잘된다... 다음 게시글로는 샘플코드를 분석하는 시간을 갖도록 하겠다.
아래 코드는 내가 최종적으로 짠 코드이다. 물론 동작 하지않는 코드이다..
샘플 코드를 분석할때 한줄한줄 주석을 달아가며 진행할 예정이다.
일명 투머치토커 전략을 이용해보겠다.
"댓글, 공감 버튼 한 번씩 누르고 가주시면 큰 힘이 됩니다"