2013-01-09 310 views
4

我想用麥克風錄製音頻並保存音頻文件。開始錄製工作正常,但是當我嘗試停止錄製時,模擬器會發出強制關閉錯誤。堆棧跟蹤:停止錄製音頻時出錯

01-09 18:16:59.075: E/AndroidRuntime(831): FATAL EXCEPTION: main 
01-09 18:16:59.075: E/AndroidRuntime(831): java.lang.IllegalStateException 
01-09 18:16:59.075: E/AndroidRuntime(831): at android.media.MediaRecorder.stop(Native Method) 
01-09 18:16:59.075: E/AndroidRuntime(831): at com.example.voice.recorder.MainActivity.StopRecording(MainActivity.java:45) 
01-09 18:16:59.075: E/AndroidRuntime(831): at com.example.voice.recorder.MainActivity$1.onClick(MainActivity.java:76) 
01-09 18:16:59.075: E/AndroidRuntime(831): at android.view.View.performClick(View.java:3511) 
01-09 18:16:59.075: E/AndroidRuntime(831): at android.view.View$PerformClick.run(View.java:14105) 
01-09 18:16:59.075: E/AndroidRuntime(831): at android.os.Handler.handleCallback(Handler.java:605) 
01-09 18:16:59.075: E/AndroidRuntime(831): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-09 18:16:59.075: E/AndroidRuntime(831): at android.os.Looper.loop(Looper.java:137) 
01-09 18:16:59.075: E/AndroidRuntime(831): at android.app.ActivityThread.main(ActivityThread.java:4424) 
01-09 18:16:59.075: E/AndroidRuntime(831): at java.lang.reflect.Method.invokeNative(Native Method) 
01-09 18:16:59.075: E/AndroidRuntime(831): at java.lang.reflect.Method.invoke(Method.java:511) 
01-09 18:16:59.075: E/AndroidRuntime(831): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
01-09 18:16:59.075: E/AndroidRuntime(831): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
01-09 18:16:59.075: E/AndroidRuntime(831): at dalvik.system.NativeStart.main(Native Method) 

它在MediaRecorder.stop()上給出錯誤; 這是我試圖阻止拍攝:

public void StopRecording() throws IOException{ 
    recorder.stop(); 
    recorder.reset(); 
    recorder.release(); 
    recorder = null; 
} 

我如何開始錄音:

public class MainActivity extends Activity { 
    MediaRecorder recorder; 
public void StartRecording(){ 
    recorder = new MediaRecorder(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    recorder.setOutputFile("/sdcard/sample.3gp"); 
    try { 
     recorder.prepare(); 
     recorder.start(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

我如何調用該方法:

  if (!tv.getText().equals("Recording...")){ 
       tv.setText("Recording..."); 
       tv.setTextColor(Color.RED); 
       record.setImageResource(R.drawable.microphone_icon_pressed); 
       StartRecording(); 

      }else{ 
       tv.setText("Click the button to start recording"); 
       record.setImageResource(R.drawable.microphone_icon); 
       tv.setTextColor(Color.BLACK); 
       try { 
        StopRecording(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

我在這2個權限我清單:

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

因此,開始錄製工作正常,但停止錄製不會。有人知道代碼有什麼問題嗎?

由於提前, 西蒙

+0

請不要重複標籤的問題。我編輯了它。 – Simon

+0

你能爲你的代碼添加更多的上下文嗎?你如何/在哪裏宣佈'錄音機'? (例如,如果它是'BroadcastReceiver'的非靜態成員,則可能會遇到這類問題)。 – Michael

+0

您是否完成了[音頻捕捉指南](http://developer.android.com/guide/topics/media/audio-capture.html)中的步驟3,4,5,6? – Stan

回答

0

您的刻錄機顯然不是處於記錄狀態。你應該確保它是否成功啓動。因爲在start()之前調用stop()時發生IllegalStateException。如果它被拋出,則在stop()塊中添加RuntimeException,然後刪除輸出文件。

MediaRecorder.java

/** 
    * Stops recording. Call this after start(). Once recording is stopped, 
    * you will have to configure it again as if it has just been constructed. 
    * Note that a RuntimeException is intentionally thrown to the 
    * application, if no valid audio/video data has been received when stop() 
    * is called. This happens if stop() is called immediately after 
    * start(). The failure lets the application take action accordingly to 
    * clean up the output file (delete the output file, for instance), since 
    * the output file is not properly constructed when this happens. 
    * 
    * @throws IllegalStateException if it is called before start() 
    */ 
    public native void stop() throws IllegalStateException; 

我還建議不要放錄音的對象,直到你需要啓動和停止連續您的應用程序被關閉。根據以下流程,創建記錄器onCreate()/ onResume()並釋放onPause/onDestroy()。

enter image description here