Java.lang.IllegalStateException in android.media.MediaRecorder.start when calling MediaRecorder.start in onLongClickListener

I want to start recording a voice message using MediaRecorder when I hold the button. When I try to start writing to onLongClickListener I get an IllegalStateException .

The error I get, as indicated by stacktrace, is on line 219: recorder.start()

Why is this happening?

 btnSendVoice.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View view) { isVoiceButtonHeld = true; startRecording(); return false; } }); btnSendVoice.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { view.onTouchEvent(event); if (event.getAction() == MotionEvent.ACTION_UP) { if (isVoiceButtonHeld) { isVoiceButtonHeld = false; stopRecording(); } } return false; } }); private void startRecording() { Toast.makeText(getActivity(), "Recording Message", Toast.LENGTH_SHORT).show(); filename = Environment.getExternalStorageDirectory().getAbsolutePath() + "/audiotest.3gp"; recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setOutputFile(filename); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { recorder.prepare(); } catch (IOException e) { Log.e("MediaRecorder", "prepare() failed"); } recorder.start(); } private void stopRecording() { Toast.makeText(getActivity(), "Recording Finished", Toast.LENGTH_SHORT).show(); recorder.stop(); recorder.release(); recorder = null; } @Override public void onPause() { super.onPause(); // Free up resources from MediaRecorder when leaving Fragment if (recorder != null) { recorder.release(); recorder = null; } } 

Logcat

 07-15 16:24:32.256: E/MediaRecorder(4227): start failed: -38 07-15 16:24:32.256: D/AndroidRuntime(4227): Shutting down VM 07-15 16:24:32.256: W/dalvikvm(4227): threadid=1: thread exiting with uncaught exception (group=0x41551ba8) 07-15 16:24:32.406: E/AndroidRuntime(4227): FATAL EXCEPTION: main 07-15 16:24:32.406: E/AndroidRuntime(4227): Process: com.walintukai.lfdate, PID: 4227 07-15 16:24:32.406: E/AndroidRuntime(4227): java.lang.IllegalStateException 07-15 16:24:32.406: E/AndroidRuntime(4227): at android.media.MediaRecorder.start(Native Method) 07-15 16:24:32.406: E/AndroidRuntime(4227): at com.walintukai.lfdate.ChatFragment.startRecording(ChatFragment.java:219) 07-15 16:24:32.406: E/AndroidRuntime(4227): at com.walintukai.lfdate.ChatFragment.access$4(ChatFragment.java:206) 07-15 16:24:32.406: E/AndroidRuntime(4227): at com.walintukai.lfdate.ChatFragment$3.onLongClick(ChatFragment.java:132) 07-15 16:24:32.406: E/AndroidRuntime(4227): at android.view.View.performLongClick(View.java:4474) 07-15 16:24:32.406: E/AndroidRuntime(4227): at android.view.View$CheckForLongPress.run(View.java:18418) 07-15 16:24:32.406: E/AndroidRuntime(4227): at android.os.Handler.handleCallback(Handler.java:733) 07-15 16:24:32.406: E/AndroidRuntime(4227): at android.os.Handler.dispatchMessage(Handler.java:95) 07-15 16:24:32.406: E/AndroidRuntime(4227): at android.os.Looper.loop(Looper.java:136) 07-15 16:24:32.406: E/AndroidRuntime(4227): at android.app.ActivityThread.main(ActivityThread.java:5050) 07-15 16:24:32.406: E/AndroidRuntime(4227): at java.lang.reflect.Method.invokeNative(Native Method) 07-15 16:24:32.406: E/AndroidRuntime(4227): at java.lang.reflect.Method.invoke(Method.java:515) 07-15 16:24:32.406: E/AndroidRuntime(4227): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 07-15 16:24:32.406: E/AndroidRuntime(4227): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 07-15 16:24:32.406: E/AndroidRuntime(4227): at dalvik.system.NativeStart.main(Native Method) 
+6
source share
1 answer

You forgot to add <uses-permission android:name="android.permission.RECORD_AUDIO" /> permission to record audio in your Manifest.xml file.

Edit: your onTouchListener interferes with the onLongClickListener and can stop your MediaRecorder immediately after it is initialized and before it starts or even stops it when the recorder is null. This gives rise to your Exception .

Please note that if you comment on the line view.onTouchEvent(event); , she will start recording, but from now on she has unpredictable behavior in accordance with the user's action.

Remember that Event.ACTION_CANCEL can happen in your script and must be taken into account to stop your recorder .

Make sure your recorder not null before calling stop() .

+2
source

Source: https://habr.com/ru/post/972277/


All Articles