Приложение 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 () вызовет ошибку.