6

我想在按住按鈕時開始錄製帶有MediaRecorder的語音郵件。試圖在onLongClickListener中開始錄製時,我收到了IllegalStateException在onLongClickListener中調用MediaRecorder.start時android.media.MediaRecorder.start中的java.lang.IllegalStateException

如堆棧跟蹤注意到我收到的錯誤是219線:recorder.start()

這究竟是爲什麼?

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) 

回答

2

你忘了添加<uses-permission android:name="android.permission.RECORD_AUDIO" />權限來記錄你的Manifest.xml文件中的音頻。

編輯:您onTouchListeneronLongClickListener干擾,並且可以阻止你的MediaRecorder它被初始化之後,它開始之前,甚至停止它時,記錄爲空。這源於你的Exception

請注意,如果您對行view.onTouchEvent(event);發表評論,它會開始記錄,但根據用戶操作,此時它具有不可預知的行爲。

請注意,Event.ACTION_CANCEL可能會發生在您的方案中,並且必須將其考慮在內以便讓您的recorder停止。

請確保在致電stop()之前檢查您的recorder是否爲空。

+0

我已經把它放在那裏。我有記錄,當我使用常規按鈕時,停止並播放早期工作的功能。當我將記錄函數放入'onLongClickListener'時出現這個問題。 –

+0

第一次或第二次長時間點擊時是否崩潰? – joao2fast4u

+0

第一次長時間點擊時會崩潰。 –

相關問題