Камера зависает при изменении ориентации

Я пытаюсь создать предварительный просмотр камеры с помощью 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);

Когда я запускаю приложение на своем устройстве, предварительный просмотр начинается, как и ожидалось, но когда я меняю ориентацию с книжной на альбомную и наоборот, предварительный просмотр зависает на несколько секунд, и новый предварительный просмотр отображается с измененной ориентацией.

Согласно журналу поверхность разрушается и создается снова при изменении ориентации, и, следовательно, камера переинициализируется каждый раз, когда изменяется ориентация. Как я могу преодолеть это? Я что-то здесь не так делаю?

0 ответов

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