我正在尝试使用“旧”相机api(不是相机2)实现视频录制,最近我遇到了一个我无法解决的错误( 问题是当我调用stop()方法停止记录应用程序崩溃时。 Start()工作正常,我无法弄清楚问题是什么。该应用拥有所有权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera.front" android:required="true"/>
<uses-feature android:name="android.hardware.camera" android:required="true"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="true"/>
CameraPreview类如下所示:
public class CameraHelperOld extends SurfaceView implements SurfaceHolder.Callback {
private final String mVideoPath;
Camera mCamera;
private MediaRecorder mMediaRecorder;
public CameraHelperOld(Context context, String videoPath) {
super(context);
try {
mCamera = Camera.open(0);
} catch (Exception e) {
e.printStackTrace();
}
mVideoPath = videoPath;
this.getHolder().addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
mMediaRecorder = new MediaRecorder();
CamcorderProfile profile = CamcorderProfile.get(0, CamcorderProfile.QUALITY_HIGH);
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setProfile(profile);
mMediaRecorder.setOutputFile(mVideoPath);
mMediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {
@Override
public void onError(MediaRecorder mr, int what, int extra) {
Log.d("Error","error");
}
});
mMediaRecorder.setPreviewDisplay(this.getHolder().getSurface());
try {
mMediaRecorder.prepare();
mMediaRecorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
try {
mMediaRecorder.stop();
} catch (RuntimeException e) {
e.printStackTrace();
}
mMediaRecorder.reset();
mMediaRecorder.release();
mCamera.stopPreview();
mCamera.release();
}
}
我在surfaceDestroyed()中调用了Stop()方法 - 这绝对不是问题,因为我是从不同的地方调用它。
现在,我已经尝试了我找到的所有解决方案建议,但没有一个有效。谁能解释一下这种行为的原因是什么?
BTW,我正在使用Nexus 5 LG。
我成功地使用Camera2 API实现了视频录制,但我需要该应用程序才能使用旧的Camera API,因为我需要支持KitKat和较旧的Android设备。
提前致谢!