0

我有这个方法,

    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 设备中录制声音。

4

2 回答 2

1

检查记录器方法的 Java 文本,stop()其中显示:

{public void stop () 自:API 级别 1 停止记录。之后调用这个start()。停止录制后,您必须重新配置它,就像它刚刚构建一样。

请注意 RuntimeException,如果在调用时没有接收到有效的音频/视频数据,则故意将 a 扔给应用程序stop()。如果stop()在 之后立即调用,就会发生这种情况start()。失败让应用程序采取相应的行动来清理输出文件(例如,删除输出文件),因为发生这种情况时输出文件的构造不正确。

如果在}IllegalStateException 之前调用,则抛出start()

stop()因此,由于调用方法时没有收到有效的音频/视频数据,可能会出现异常。

于 2013-01-10T07:10:34.897 回答
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()设置用于录制的最大文件大小。

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

于 2013-01-11T11:42:17.360 回答