Приложение Android Record видео рухнуло на паузе, вызвав недопустимое исключение

Я работаю над приложением камеры. Я написал код, который может записывать и сохранять видео в SDCard. Я использовал CountDownTimer для записи видео. Программа работает отлично, но когда я нажимаю кнопку "Домой" на устройстве (то есть вызывается метод onPause), программа вылетает. У меня есть незаконное исключение. Это мой источник:

public class CameraPreview extends Activity implements SurfaceHolder.Callback {
private Button upload_btn, start_record, reset;
private Camera prCamera;
private SurfaceHolder prSurfaceHolder;
private SurfaceView prSurfaceView;
private int cMaxRecordDurationInMs = 8000;

private TextView video_start_timer;
private MediaRecorder prMediaRecorder;

final String mVideoFilename = Environment.getExternalStorageDirectory()
        + "/video.mp4";

String strFile = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.camera_preview);
    start_record = (Button) findViewById(R.id.play_video);
    upload_btn = (Button) findViewById(R.id.upload_btn);
    reset = (Button) findViewById(R.id.reset_btn);
    reset.setEnabled(false);

    prSurfaceView = (SurfaceView) findViewById(R.id.surfaceView1);

    video_start_timer = (TextView) findViewById(R.id.timeElapsed);

    prSurfaceHolder = prSurfaceView.getHolder();
    prSurfaceHolder.addCallback(this);
    prSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    prMediaRecorder = new MediaRecorder();


    start_record.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            StartRecordVideo();

        }
    });


}

@Override
protected void onPause() {
    super.onPause();
    if (prCamera != null) {
        prCamera.stopPreview();
        prCamera.release();
        prCamera = null;
    }
}

@Override
public void surfaceChanged(SurfaceHolder _holder, int _format, int _width,
        int _height) {
    try {
        if (prCamera == null)
            return;

        prCamera.setPreviewDisplay(_holder);
        prCamera.startPreview();
    } catch (IOException e) {

        e.printStackTrace();
    }
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    CameraInfo cameraInfo = new CameraInfo();
    int cameraCount = Camera.getNumberOfCameras();
    if (cameraCount > 1)
        for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); camIdx++) {
            Camera.getCameraInfo(camIdx, cameraInfo);
            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
                try {
                    prCamera = Camera.open(camIdx);
                } catch (RuntimeException e) {
                    Log.i("Camera failed to open: ",
                            e.getLocalizedMessage());
                }
            }
        }
    else
        prCamera = Camera.open();

    if (prCamera == null) {
        Toast.makeText(this, "Camera is not available!", Toast.LENGTH_SHORT)
                .show();
        finish();
    }

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {


        stopRecording();

}

protected void startRecording() throws IOException {
    prMediaRecorder = new MediaRecorder(); // Works well
    prCamera.unlock();

    prMediaRecorder.setCamera(prCamera);

    prMediaRecorder.setPreviewDisplay(prSurfaceHolder.getSurface());
    prMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    prMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

    prMediaRecorder.setProfile(CamcorderProfile
            .get(CamcorderProfile.QUALITY_HIGH));
    prMediaRecorder.setPreviewDisplay(prSurfaceHolder.getSurface());
    prMediaRecorder.setOutputFile(mVideoFilename);

    prMediaRecorder.prepare();
    prMediaRecorder.start();

}

private void stopRecording() {
    if (prMediaRecorder != null) {

        prMediaRecorder.stop();

        prMediaRecorder.reset();
        prMediaRecorder.release();
        video_start_timer.setText("--:--");

    }

}

private CountDownTimer timer = new CountDownTimer(cMaxRecordDurationInMs,
        1000) {

    @Override
    public void onTick(long millisUntilFinished) {

        video_start_timer.setText(countTime(millisUntilFinished));

        start_record.setEnabled(false);
    }

    @Override
    public void onFinish() {

        stopRecording();
        timer.cancel();

        start_record.setEnabled(true);
        reset.setEnabled(true);

    }
};

private String countTime(long miliseconds) {
    String timeInMinutes = new String();
    long minutes = miliseconds / 60000;
    long seconds = (miliseconds % 60000) / 1000;
    timeInMinutes = minutes + ":"
            + (seconds < 10 ? "0" + seconds : seconds);
    return timeInMinutes;
}

public void StartRecordVideo() {
    start_record.setEnabled(false);
    reset.setEnabled(false);

    try {
        timer.start();
        startRecording();

    } catch (IOException e) {

        e.printStackTrace();
    }
}

}

Если кто-нибудь знает решение, помогите мне. Спасибо

1 ответ

Это потому, что Вы вызываете prMediaRecorder.reset () перед prMediaRecorder.release () в вашем методе stopRecording (). Если вы нажмете кнопку "Домой", будет вызвано onSurfaceDestroyed, поэтому вы остановите prMediaRecorder. Если вы вызываете reset (), MediaRecorder находится в состоянии ожидания и должен быть настроен заново, поэтому я думаю, что вызов release () вызовет ошибку.

Другие вопросы по тегам