Android 媒体录制器摄像头未停止和重新启动

Android 媒体录制器摄像头未停止和重新启动,android,restart,mediarecorder,Android,Restart,Mediarecorder,我的相机预览效果很好,它还没有完全存储视频:( 然而,主要的问题是,当我按下“开始”按钮时,它开始录制,但当我按下“停止”按钮时,它停止预览,当我按下“再次开始”按钮时,它会使程序崩溃。有没有一种方法可以让我停止并开始录制而不使其崩溃?谢谢你的帮助:) package com.example.camera; 导入java.io.IOException; 导入android.app.Activity; 导入android.media.CamcorderProfile; 导入android.medi

我的相机预览效果很好,它还没有完全存储视频:( 然而,主要的问题是,当我按下“开始”按钮时,它开始录制,但当我按下“停止”按钮时,它停止预览,当我按下“再次开始”按钮时,它会使程序崩溃。有没有一种方法可以让我停止并开始录制而不使其崩溃?谢谢你的帮助:)

package com.example.camera;
导入java.io.IOException;
导入android.app.Activity;
导入android.media.CamcorderProfile;
导入android.media.MediaRecorder;
导入android.os.Bundle;
导入android.view.SurfaceHolder;
导入android.view.SurfaceView;
导入android.view.view;
导入android.widget.Button;
导入com.exercise.AndroidVideoCapture.R;
公共类MainActivity扩展活动实现SurfaceHolder.Callback{
按钮myButton;
媒体记录器;
浮雕浮雕;
布尔记录;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
记录=假;
mediaRecorder=新的mediaRecorder();
initMediaRecorder();
setContentView(R.layout.activity_main);
SurfaceView myVideoView=(SurfaceView)findViewById(R.id.videoview);
surfaceHolder=myVideoView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(surfaceHolder.SURFACE\u TYPE\u PUSH\u缓冲区);
myButton=(Button)findViewById(R.id.myButton);
myButton.setOnClickListener(myButtonNonClickListener);
}
private Button.OnClickListener MyButton非ClickListener
=新建按钮。OnClickListener(){
@凌驾
公共void onClick(视图arg0){
//TODO自动生成的方法存根
如果(录音){
mediaRecorder.stop();
myButton.setText(“开始”);
记录=假;
//mediaRecorder.reset();
//mediaRecorder.release();
}否则{
mediaRecorder.start();
记录=真;
myButton.setText(“停止”);
}
}};
@凌驾
公共无效表面更改(表面更改arg0、int arg1、int arg2、int arg3){
//TODO自动生成的方法存根
}
@凌驾
已创建公共空白表面(表面文件夹arg0){
//TODO自动生成的方法存根
prepareMediaRecorder();
}
@凌驾
公共空间表面已覆盖(表面层arg0){
//TODO自动生成的方法存根
}
私有void initMediaRecorder(){
mediaRecorder.setAudioSource(mediaRecorder.AudioSource.DEFAULT);
mediaRecorder.setVideoSource(mediaRecorder.VideoSource.DEFAULT);
CamcorderProfile CamcorderProfile_HQ=CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mediaRecorder.setProfile(摄像机公司总部);
setOutputFile(“/sdcard/myvideo.mp4”);
mediaRecorder.setMaxDuration(60000);//设置最大持续时间60秒。
mediaRecorder.setMaxFileSize(5000000);//设置最大文件大小5M
}
私人无效记录人(){
setPreviewDisplay(surfaceHolder.getSurface());
试一试{
mediaRecorder.prepare();
}捕获(非法状态){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}

将onClick方法更改为:

@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub
    if(recording){
        mediaRecorder.stop();
        myButton.setText("START");
        recording = false;
        initMediaRecorder();
        prepareMediaRecorder();

    }else{
        mediaRecorder.start();
        recording = true;
        myButton.setText("STOP");
    }
}};
也可以使用此方法不覆盖视频文件:

private File getOutputMediaFile() {
    // To be safe, you can check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.

    File mediaStorageDir = new File(Environment.getExternalStorageDirectory().getPath().toString() + "/YourDirectory/");

    // Create the storage directory if it does not exist
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d("CameraApp", "failed to create directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    mediaFile = new File(mediaStorageDir.getPath() + File.separator +
            "VID_" + timeStamp + ".mp4");
    return mediaFile;
}
这样使用它来设置输出文件:

mediaRecorder.setOutputFile(getOutputMediaFile().getPath());
mediaRecorder.setOutputFile(getOutputMediaFile().getPath());