6

Bir düğmeyi basılı tuttuğumda MediaRecorder ile bir sesli mesaj kaydetmeye başlamak istiyorum. onLongClickListener'da kayıt yapmaya çalışırken IllegalStateException alıyorum.java.lang.IllegalStateException at android.media.MediaRecorder.start MediaRecorder.start içinde arama yaparken onLongClickListener

stacktrace belirtildiği gibi alıyorum hata Hattı 219 üzerindedir: recorder.start()

neden oluyor?

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) 

cevap

2

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 Eğer Manifest.xml dosya üzerinde ses kayıt <uses-permission android:name="android.permission.RECORD_AUDIO" /> iznini eklemeyi unutmuşum.

Düzenleme: Sizin onTouchListeneronLongClickListener parazit nedeniyle bu başlatılır hemen sonra MediaRecorder durdurma olabilir ve daha başlamadan veya kaydedici boş olduğunda bile onu durduran. Bu, Exception ürününüze kaynaklık ediyor.

Not: view.onTouchEvent(event); numaralı satırı yorumlarsanız, kaydetmeye başlar, ancak kullanıcı eylemine göre o andan itibaren beklenmeyen bir davranışı vardır.

Event.ACTION_CANCEL'un sizin durumunuzda gerçekleşebileceğini unutmayın ve recorder ürününüzün durması için dikkate alınmalıdır.

sizin recorderstop() çağırmadan önce boş değil olup olmadığını kontrol etmek emin olun.

+0

Bunu oraya koydum. Normal düğmeler kullandığımda kayıt, durma ve oynatma işlevlerini daha önce çalıştırdım. Kayıt fonksiyonunu bir 'onLongClickListener' içine koyduğumda bu sorun ortaya çıktı. –

+0

İlk kez veya ikinci kez uzun tıkladığınızda kilitleniyor mu? – joao2fast4u

+0

İlk kez uzun tıklandığında çöküyor. –

İlgili konular