2013-01-10 69 views
0

我有這種方法,如何在android中停止錄音?

if(null != recorder){ 
     recorder.stop(); 
     recorder.reset(); 
     recorder.release(); 
     recorder = null; 
    } 

爲什麼會強制關閉應用程序?..

提前感謝!

這是我VoiceRecording2.java。它有沒有按鈕,啓動按鈕和停止按鈕,並選擇格式..

package com.example.voicexml; 

import java.io.File; 
import java.io.IOException; 

import android.app.Activity; 
import android.app.AlertDialog; 
    import android.content.DialogInterface; 
import android.media.MediaRecorder; 
    import android.os.Bundle; 
import android.os.Environment; 
import android.view.View; 
import android.widget.Button; 

public class VoiceRecording2 extends Activity { 
    private static final String AUDIO_RECORDER_FILE_EXT_3GP = ".3gp"; 
    private static final String AUDIO_RECORDER_FILE_EXT_MP4 = ".mp4"; 
    private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder"; 

    private MediaRecorder recorder = null; 
    private int currentFormat = 0; 
    private int output_formats[] = { MediaRecorder.OutputFormat.MPEG_4, MediaRecorder.OutputFormat.THREE_GPP }; 
    private String file_exts[] = { AUDIO_RECORDER_FILE_EXT_MP4, AUDIO_RECORDER_FILE_EXT_3GP }; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.voice); 

    setButtonHandlers(); 
    enableButtons(false); 
    setFormatButtonCaption(); 
} 

    private void setButtonHandlers() { 
      ((Button)findViewById(R.id.btnStart)).setOnClickListener(btnClick); 
    ((Button)findViewById(R.id.btnStop)).setOnClickListener(btnClick); 
    ((Button)findViewById(R.id.btnFormat)).setOnClickListener(btnClick); 
    } 

    private void enableButton(int id,boolean isEnable){ 
      ((Button)findViewById(id)).setEnabled(isEnable); 
    } 

    private void enableButtons(boolean isRecording) { 
      enableButton(R.id.btnStart,!isRecording); 
      enableButton(R.id.btnFormat,!isRecording); 
      enableButton(R.id.btnStop,isRecording); 
    } 

    private void setFormatButtonCaption(){ 
      ((Button)findViewById(R.id.btnFormat)).setText(getString(R.string.audio_format) + " (" + file_exts[currentFormat] + ")"); 
    } 

    private String getFilename(){ 
      String filepath = Environment.getExternalStorageDirectory().getPath(); 
      File file = new File(filepath,AUDIO_RECORDER_FOLDER); 

      if(!file.exists()){ 
        file.mkdirs(); 
      } 

      return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + file_exts[currentFormat]); 
    } 

    private void startRecording(){ 
      recorder = new MediaRecorder(); 

      recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
      recorder.setOutputFormat(output_formats[currentFormat]); 
      recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
      recorder.setOutputFile(getFilename()); 

      recorder.setOnErrorListener(errorListener); 
      recorder.setOnInfoListener(infoListener); 

      try { 
        recorder.prepare(); 
        recorder.start(); 
      } catch (IllegalStateException e) { 
        e.printStackTrace(); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 

    private void stopRecording(){ 

    } 

    private void displayFormatDialog(){ 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      String formats[] = {"MPEG 4", "3GPP"}; 

      builder.setTitle(getString(R.string.choose_format_title)) 
         .setSingleChoiceItems(formats, currentFormat, new DialogInterface.OnClickListener() { 

          public void onClick(DialogInterface dialog, int which) { 
            currentFormat = which; 
            setFormatButtonCaption(); 

            dialog.dismiss(); 
          } 
         }) 
         .show(); 
    } 

    private MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() { 
      public void onError(MediaRecorder mr, int what, int extra) { 
        AppLog.logString("Error: " + what + ", " + extra); 
      } 
    }; 

    private MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() { 
      public void onInfo(MediaRecorder mr, int what, int extra) { 
        AppLog.logString("Warning: " + what + ", " + extra); 
      } 
    }; 

private View.OnClickListener btnClick = new View.OnClickListener() { 
      public void onClick(View v) { 
        switch(v.getId()){ 
          case R.id.btnStart:{ 
            AppLog.logString("Start Recording"); 

            enableButtons(true); 
            startRecording(); 

            break; 
          } 
          case R.id.btnStop:{ 
           if(null != recorder){ 
            //recorder.stop(); 
            //recorder.reset(); 
            //recorder.release(); 
            System.out.println("Churva"); 
            //recorder = null; 
          } 
           AppLog.logString("Start Recording"); 

            enableButtons(false); 

            //stopRecording(); 

            break; 
          } 
          case R.id.btnFormat:{ 
            displayFormatDialog(); 

            break; 
          } 
        } 
      } 
    }; 

}

它簡單porgram,在你的Android錄製語音設備..

+3

請張貼logcat的輸出 –

+0

請分享一些更多的代碼和類的實例是這個記錄嗎? –

+0

我發佈了整個VoiceRecording2.java,它也有AppLog.java,並且佈局.. –

回答

0

檢查記錄的stop()方法的Java的案文說:

{public void stop()由於:API Level 1停止記錄。在start()之後撥打 。一旦錄製停止,您將不得不再次配置 ,就像它剛剛構建一樣。

。請注意, RuntimeException故意扔在應用中,如果當stop()被稱爲沒有接收到 有效的音頻/視頻數據。如果在start()之後立即調用stop(),則會發生此 。失敗 讓應用程序採取相應的行動來清理輸出文件 (例如刪除輸出文件),因爲輸出文件 發生這種情況時沒有正確構建。

拋出IllegalStateException如果start()之前稱爲}由於當stop()方法被調用沒有有效的音頻/視頻數據已收到

所以可能是異常引起的。

+0

它仍然強制關閉應用程序.. –

+0

我相信它的強制關閉,因爲音頻文件中沒有正確處理音頻。請做一些谷歌搜索處理音頻文件,特別是在Android的擴展可能是可以幫助你。這意味着你可以添加try catch來停止記錄器,以便應用程序不會崩潰 –

1

首先,創建MediaRecorder類(android.media.MediaRecorder)

MediaRecorder mr = new MediaRecorder(); 

接下來的一個新實例,設置音頻源或記錄裝置。通常情況下,您需要將其設置爲MIC

mr.setAudioSource(MediaRecorder.AudioSource.MIC); 

現在指定輸出格式。這是音頻格式的錄音文件將被存儲在。

mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 

而且指定AudioEncoder型

mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

最後,指定所記錄的數據將被存儲的文件名。路徑名稱是音頻文件的完整路徑。

mr.setOutputFile(PATH_NAME); 

現在,整個設置完成。您只需撥打prepare()並調用start()stop()函數即可開始/停止錄製。

mr.prepare();mr.start();.......mr.stop(); 

一旦錄音完成後,您可以通過調用

mr.release(); 

您還可以在MediaRecorder實例恢復到初始狀態,通過調用

mr.reset(); 
釋放與特定實例相關聯的資源

(可選)還可以使用mr.setMaxDuration()設置記錄的最大持續時間,並使用mr.setMaxFileSize()設置最大文件數用於記錄的ize。

添加<uses-permission android:name="android.permission.RECORD_AUDIO">在您的清單