Я пытаюсь реализовать запись видео со "старой" камерой api (не camera2), и недавно я столкнулся с ошибкой, которую не могу исправить (
Проблема в том, что когда я вызываю метод 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();
}
}
Я вызываю метод Stop () в surfaceDestroyed () - и это определенно не проблема, потому что я вызывал его из разных мест.
Теперь я перепробовал все найденные решения, но ни одно из них не сработало. Может ли кто-нибудь объяснить мне, в чем причина такого поведения?
Кстати, я использую Nexus 5 LG.
Я успешно реализовал запись видео с помощью Camera2 API, но мне нужно приложение для работы со старым Camera API, поскольку мне нужна поддержка KitKat и более старых устройств Android.
Заранее спасибо!