6

Voglio avviare la registrazione di un messaggio vocale con MediaRecorder quando si tiene premuto un pulsante. Ricevo un IllegalStateException quando provo ad avviare la registrazione in un onLongClickListener.java.lang.IllegalStateException su android.media.MediaRecorder.start quando si chiama MediaRecorder.start in onLongClickListener

L'errore che sto ricevendo come indicato nel stacktrace è sulla linea 219: recorder.start()

Perché succede questo?

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) 

risposta

2

si è dimenticato di aggiungere <uses-permission android:name="android.permission.RECORD_AUDIO" /> il permesso di registrare l'audio sul vostro file Manifest.xml.

Edit: Il tuo onTouchListener interferisce con onLongClickListener e potrebbe interrompere la vostra MediaRecorder subito dopo l'inizializzazione e prima del suo inizio o addirittura fermarlo quando il registratore è nullo. Ciò dà origine al tuo Exception.

Si noti che se si commenta la riga view.onTouchEvent(event);, inizia la registrazione, ma ha un comportamento imprevedibile da quel momento in poi, in base all'azione dell'utente.

Si noti che è possibile che lo Event.ACTION_CANCEL si verifichi nello scenario e che sia necessario tenerlo in considerazione per interrompere lo recorder.

Assicurarsi di verificare se recorder non è nullo prima di chiamare stop().

+0

L'ho già messo lì. Avevo le funzioni di registrazione, interruzione e riproduzione che funzionavano in precedenza quando usavo i pulsanti normali. Questo problema è sorto quando ho inserito la funzione di registrazione in un 'onLongClickListener'. –

+0

Arresta in modo anomalo quando si fa un clic prolungato la prima volta o la seconda volta? – joao2fast4u

+0

Si sta bloccando con un clic lungo la prima volta. –