Камера зависает при изменении ориентации
Я пытаюсь создать предварительный просмотр камеры с помощью SurfaceView
и это в основном работает нормально. Я инициализирую камеру на onSurfaceCreated
метод и уничтожить его на onSurfaceDestroyed
, Почему вышеуказанные методы вызываются при изменении ориентации устройства. Ниже приведен код вида поверхности.
@Override
public void surfaceCreated(SurfaceHolder holder) {
// Initialize the camera
initCamera();
Log.d("tags", "Camera Started!");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.stopPreview();
camera.release();
}
Log.d("tags", "Camera destroyed!");
}
public void initCamera() {
if (camera == null) {
camera = Camera.open(); // Get's the first camera
}
try {
camera.setPreviewDisplay(sfHolder);
} catch (IOException err) {
err.printStackTrace();
}
// Set camera orientation
Activity activity = (Activity)this.getContext();
this.setCameraDisplayOrientation(activity);
camera.startPreview();
}
private void setCameraDisplayOrientation(Activity activity) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
Log.d("tag", "Result -- " + result);
boolean camNull = camera == null;
Log.d("tag", String.valueOf(camNull));
camera.setDisplayOrientation(result);
Когда я запускаю приложение на своем устройстве, предварительный просмотр начинается, как и ожидалось, но когда я меняю ориентацию с книжной на альбомную и наоборот, предварительный просмотр зависает на несколько секунд, и новый предварительный просмотр отображается с измененной ориентацией.
Согласно журналу поверхность разрушается и создается снова при изменении ориентации, и, следовательно, камера переинициализируется каждый раз, когда изменяется ориентация. Как я могу преодолеть это? Я что-то здесь не так делаю?