permission 문제로 Audio Record 시 무한 에러 발생

houndify 를 이용해서 audio record 하는 코드를 작성하는데, 언젠가부터 audio record 에서 무한히 에러가 발생했다 :

03-20 11:11:45.209 27421-27525/com.alticast.mmux V/AudioByteStreamSource: manufacturer = samsung, model = SM-G920S
03-20 11:11:45.219 27421-27525/com.alticast.mmux E/AudioRecord: AudioFlinger could not create record track, status: -1
03-20 11:11:45.229 27421-27525/com.alticast.mmux E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -1.
03-20 11:11:45.229 27421-27525/com.alticast.mmux E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
03-20 11:11:45.229 27421-27525/com.alticast.mmux E/audio_debug: AudioRecordFactory failed to create new instance


하루를 날려가며 삽질한 끝에 원인을 알았는데, Android 6.0 (API level 23) 부터는 런타임에 dangerous permission 을 사용하려면 사용자 UI 를 통한 명시적 허가를 받아야 하는데 이에 대한 처리가 되어있지 않아서였다.

(1) 안드로이드에 익숙치 않고, (2) 오디오 레코드 처리를 JNI 코드에서 수행하기 때문에 IDE에서도 별다른 warning 을 주지 않았기 때문에 이런 삽질을 하게 된 것.

Main Activity 에 다음과 같이 처리하는 코드를 넣어두니 당장 동작은 하게 되었다. 사실 코드가 Service 에 있어 처리 방법을 좀더 고민해 봐야 하는데 진도가 급하므로 일단 이정도로 만족.

if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.RECORD_AUDIO},
                    100);
}

댓글

이 블로그의 인기 게시물

Confluence 에서 Export PDF 로 내보낼 때 Code Block 에서 한글 깨짐

pandas.read_csv() 에서 왠만하면 컬럼타입을 지정하자

스프링 컨텍스트 설정파일과 URI 경로를 제대로 못찾는 삽질