개발모음집

AudioRecode 에러 본문

Android

AudioRecode 에러

void 2017. 6. 8. 13:43


06-08 13:25:44.260 1683-1683/ AudioFlinger could not create record track, status: -1
06-08 13:25:44.260 1683-1683/ Error creating AudioRecord instance: initialization check failed with status -1.
06-08 13:25:44.260 1683-1683/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
06-08 13:25:44.265 1683-1683/AndroidRuntime: Shutting down VM
06-08 13:25:44.265 1683-1683/AndroidRuntime: FATAL EXCEPTION: main
Process: com.blank.android.crafter, PID: 1683
java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
at android.media.AudioRecord.startRecording(AudioRecord.java:943)
at be.tarsos.dsp.io.android.AudioDispatcherFactory.fromDefaultMicrophone(Unknown Source)
at com.blank.android.crafter.fragment.TunerFragment.onCreateView(TunerFragment.java:158)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7225)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)


AudioRecode객체를 이용하는데 퍼미션이 허용한 상태에서 앱을 켠다면 문제가 없지만, 퍼미션을 허용하지않은 상태에서 켠다면 위와 같은 에러가 뜨며 앱이 꺼진다. 


에러나는 이유 두 가지를 추측할 수 있다.


1. 퍼미션 문제 


AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

자바 코드

// 음을 입력받을 수 있도록 퍼미션 허용
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 1);
}

이미 다른 앱을 만들며 쓴 코드라 퍼미션 문제가 아닌 것 같다.


2. AudioRecord 객체 생성쪽에 문제가 있는 것 같다.


그래서 처음에는 아래에 적힌 코드로 변경하여 에러를 해결했다.


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

AudioRecord 객체 생성

}



하지만 AudioRecord: start() status -38라는 에러가 발생했다.

구글에 검색해보니 이 에러에 대해 자세히 기술된 게 없고, stackoverflow에도 글이 거의 없었다.


그래서 다른 방식으로 해결하려 했다.



if (audioInputStream.getState() == AudioRecord.STATE_INITIALIZED) { audioInputStream.startRecording(); }

참고: https://stackoverflow.com/questions/27878458/android-audiorecord-troubles

이렇게 하니까 앱이 꺼지는 에러는 잡았다. 하지만  "AudioRecord: start() status -38"  에러는 계속해서 발생했다.



06-08 15:04:56.562 25360-25360 E/AudioRecord: AudioFlinger could not create record track, status: -1
06-08 15:04:56.562 25360-25360 E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -1.
06-08 15:04:56.562 25360-25360 E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.


액티비티에서 퍼미션허용을 해주고 다시 켰을 때는 에러없이 된다.


'Android' 카테고리의 다른 글

Unable to retrieve AudioTrack pointer for write() 에러  (0) 2017.06.10
asnktask cancle시 ui 멈춤  (0) 2017.06.09
TarsosDsp 공부  (0) 2017.06.06
오디오와 오디오트랙에 대해  (0) 2017.06.02
Fragment already active 에러  (0) 2017.05.29