【问题标题】:recording audio automatically自动录制音频
【发布时间】:2013-03-19 08:09:41
【问题描述】:
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;
import android.widget.Toast;

public class AudioRecordingActivity 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 };
private String file_exts[] = { AUDIO_RECORDER_FILE_EXT_MP4};

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

    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() {
    if (null != recorder) {
        recorder.stop();
        recorder.reset();
        recorder.release();

        recorder = null;
    }
}

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() {

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

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

private MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() {
    @Override
    public void onError(MediaRecorder mr, int what, int extra) {
        Toast.makeText(AudioRecordingActivity.this,
                "Error: " + what + ", " + extra, Toast.LENGTH_SHORT).show();
    }
};

private MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() {
    @Override
    public void onInfo(MediaRecorder mr, int what, int extra) {
        Toast.makeText(AudioRecordingActivity.this,
                "Warning: " + what + ", " + extra, Toast.LENGTH_SHORT)
                .show();
    }
};

private View.OnClickListener btnClick = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btnStart: {
            Toast.makeText(AudioRecordingActivity.this, "Start Recording",
                    Toast.LENGTH_SHORT).show();

            enableButtons(true);
            startRecording();

            break;
        }
        case R.id.btnStop: {
            Toast.makeText(AudioRecordingActivity.this, "Stop Recording",
                    Toast.LENGTH_SHORT).show();
            enableButtons(false);
            stopRecording();

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

            break;
        }*/
        }
    }
};
}

上面的代码录制音频,并在点击按钮开始和停止录制时将其存储在 sd 卡中。

我想制作一个录音机应用程序,它会在启动应用程序时自动开始录制音频约 30 秒。可以这样做吗?如果是那怎么办?

【问题讨论】:

    标签: android mediarecorder


    【解决方案1】:

    您可以在应用程序的 onCreateonResume 方法中发出延迟任务,该任务将在 30 秒后开始录制。

    如果要限制录制时间,请在录制开始后发出延迟任务。

    之前在此处询问有关延迟任务的问题:How to call a method after a delay in Android

    您也可以在这里查看更多信息:Handler vs AsyncTask

    【讨论】:

    • 我在互联网上搜索 setMaxDuration(int millisecs) 时发现了这个。你的建议和这个有什么区别?
    • 我认为差别不大。在某些情况下,运行延迟任务会更好。想到的第一个例子是需要额外的检查(除了记录已经停止)。如果你没有这样的要求,在这种情况下你应该使用setMaxDuration而不是我的解决方案,因为它使代码更具可读性和更易于维护。
    • 上一条评论中对延迟任务情况的补充说明:您可能想检查用户是否在达到 30 秒标记时完成了讲话,如果没有,您可能想继续录制,说,额外的 5 秒,然后重新检查。使用setMaxDuration 时,您将无法轻松做到这一点。
    • 我不想这样做,我真的希望应用程序重新开始并重新录制。有什么办法吗?
    • 嘿,你能检查一下我之前的问题,如果可能的话,请帮助我
    猜你喜欢
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2012-03-18
    • 2012-05-29
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多