Подтвердить что ты не робот

Android: ориентация экрана/поворот для предварительного просмотра камеры

Я создал приложение для камеры, и я хочу, чтобы мое приложение было повернуто во всех 4 возможных ориентациях, и чтобы обновить предварительный просмотр камеры соответствующим образом. для этого я использовал следующий метод, который я скопировал из: Android - Предварительный просмотр камеры боком

 public void updateCameraDisplay(int w, int h) {
        // set preview size and make any resize, rotate or
        // reformatting changes here

        Log.i("CameraPreviews", "Updating camera orientation with w=" + w
                + " and h=" + h);
        Parameters parameters = camera.getParameters();
        Display display = getActivity().getWindowManager()
                .getDefaultDisplay();

        int rotation = getActivity().getResources().getConfiguration().orientation;
        Log.i("CameraPreviews", "rotation is " + display.getRotation());
        if (display.getRotation() == Surface.ROTATION_0) {

            parameters.setPreviewSize(h, w);
            camera.setDisplayOrientation(0);
        }

        if (display.getRotation() == Surface.ROTATION_90) {
            parameters.setPreviewSize(w, h);
            camera.setDisplayOrientation(270);
        }

        if (display.getRotation() == Surface.ROTATION_180) {
            parameters.setPreviewSize(h, w);
            camera.setDisplayOrientation(180);
        }

        if (display.getRotation() == Surface.ROTATION_270) {
            parameters.setPreviewSize(w, h);
            camera.setDisplayOrientation(90);
        }

        try {
            camera.setParameters(parameters);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Я tweeked значения, тестируя их на галактике samsung sam2, чтобы наконец получить правильные ориентации, и все это работает. Когда я пробовал его на htc one s phone, он вообще не работает!!!!! Все электронные ориентации абсолютно неправильны! Поэтому я пришел к выводу, что это должно быть 2 типа устройств (или больше... пожалуйста, нет!), Потому что вращение показывает, сколько градусов экран был повернут из положения "по умолчанию", тогда некоторые устройства имеют одно положение по умолчанию и другие. Как я могу узнать об этой ротации по умолчанию и действовать соответственно в моем коде? EJ: defaultOrientation = некоторый код if (defaultOrientation == 0)... иначе....

блокировка ориентации экрана не может быть и речи. target api >= 11 большое спасибо

EDIT: Я изменил свой код на:

public void updateCameraDisplay(int w, int h) {
        // set preview size and make any resize, rotate or
        // reformatting changes here

        Log.i("CameraPreviews", "Updating camera orientation with w=" + w
                + " and h=" + h);
        Parameters parameters = camera.getParameters();
        Display display = getActivity().getWindowManager()
                .getDefaultDisplay();

        int rotation = getActivity().getResources().getConfiguration().orientation;
        Log.i("CameraPreviews", "screen rotation is " + rotation);
        Log.i("CameraPreviews", "display rotation is " + display.getRotation());
        if (display.getRotation() == Surface.ROTATION_0) {

            if (rotation == Configuration.ORIENTATION_LANDSCAPE) {
                parameters.setPreviewSize(h, w);
                camera.setDisplayOrientation(0);
            } else {
                parameters.setPreviewSize(h, w);
                camera.setDisplayOrientation(90);
            }
        }

        else if (display.getRotation() == Surface.ROTATION_90) {
            if (rotation == Configuration.ORIENTATION_PORTRAIT) {
                parameters.setPreviewSize(w, h);
                camera.setDisplayOrientation(270);
            } else {
                parameters.setPreviewSize(w, h);
                //camera.setDisplayOrientation(0);
            }
        }

        else if (display.getRotation() == Surface.ROTATION_180) {
            if (rotation == Configuration.ORIENTATION_LANDSCAPE) {
            parameters.setPreviewSize(h, w);
            camera.setDisplayOrientation(180);
            }else {
                parameters.setPreviewSize(h, w);
                camera.setDisplayOrientation(270);
            }
        }

        else if (display.getRotation() == Surface.ROTATION_270) {
            if (rotation == Configuration.ORIENTATION_PORTRAIT) {
                parameters.setPreviewSize(w, h);
                camera.setDisplayOrientation(90);
            } else {
                parameters.setPreviewSize(w, h);
                camera.setDisplayOrientation(180);
            }
        }

        try {
            camera.setParameters(parameters);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

работает лучше на htc one s и вкладке галактики Samsung, если мы не поворачиваем телефон в портретном режиме вверх дном.

4b9b3361

Ответ 1

Факторы, о которых вам нужно подумать, это: ориентация устройства, степень между экраном и камерой, если вы используете заднюю камеру и активируете ли вы активность для изменения ориентации.

И одна важная вещь заключается в том, соответствует ли код камеры HAL, реализованный производителем, протоколу Google.