портретная ориентация камеры на Galaxy tab

#android #camera #rotation #preview #android-camera

#Android #камера #поворот #Предварительный просмотр #android-камера

Вопрос:

Я разрабатываю Samsung Galaxy Tab (7 дюймов) на / для него. Мое приложение должно работать только в портретном режиме, т. е. я заблокировал его в портретном режиме в своем приложении и в настройках устройства. Проблема в том, что когда я пытаюсь повернуть предварительный просмотр камеры, в данный момент она повернута на 90 градусов в неправильном направлении.

Прямо сейчас это мой созданный surfaceCreated

     public void surfaceCreated(SurfaceHolder holder) {
    camera = Camera.open();
    try {
        camera.setPreviewDisplay(holder);
        Camera.Parameters parameters = camera.getParameters();
        parameters.setPictureFormat(PixelFormat.JPEG);
        parameters.set("orientation", "portrait");
        //camera.setDisplayOrientation(90); 
        parameters.setRotation(90);
        camera.setParameters(parameters);
    }
    catch (IOException exception) {
        camera.release();
    }
}
  

Похоже, что camera.setDisplayOrientation (90) не работает (он ничего не делает, поэтому я откомментировал это). Однако parameters.setRotation(90) НА самом деле ВЫПОЛНЯЕТ СВОЮ работу! но это создает уродливую «полосу» «мерцающих цветов» вдоль боковой панели приложения. setDisplayOrientation () должен работать для меня, поскольку я использую Android api 8 (Froyo 2.2)!!

В Google есть ветка о проблемах, связанных с поворотомhttp://code.google.com/p/android/issues/detail?id=1193#c26, но, насколько мне известно, это ничего не говорит о моей проблеме.

Любые решения, относящиеся к этой проблеме, будут высоко оценены! Спасибо!

Ответ №1:

Это сработало для меня в Samsung Galaxy tab:

 public void surfaceCreated(SurfaceHolder holder)
    {
    // The Surface has been created, acquire the camera and tell it where to draw.
    mCamera = Camera.open();

    Parameters params = mCamera.getParameters();

    if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
    {
    params.set("orientation", "portrait");
    mCamera.setDisplayOrientation(90);
    }

    try
    {
    mCamera.setPreviewDisplay(holder);
    }
    catch (IOException exception)
    {
    mCamera.release();
    mCamera = null;
    }

    }
  

Ответ №2:

Если ваше приложение предназначено только для портретной съемки, то самое простое, что можно сделать, это просто повернуть данные изображения после того, как вы сделали снимок, и не беспокоиться о настройках камеры. Я не уверен, что вкладка глючит (я никогда не пытался повернуть предварительный просмотр камеры), но повернуть изображение после того, как вы сделали снимок, очень просто… проблема заключается только в том, что вам нужно знать, в какую сторону держалось устройство, когда был сделан снимок. Если это вас не беспокоит, то не беспокойтесь об этом 🙂

Комментарии:

1. Поворот сделанного снимка не имеет большого значения, но я бы хотел, чтобы предварительный просмотр был таким же, как на сделанном снимке. Удобство использования и все такое 😉 Проблема не в том, чтобы сделать снимок, а в повороте предварительного просмотра.

Ответ №3:

попробуйте это. Я создаю этот код и тестирую на Galaxy Tab. Код работает хорошо

 public void surfaceCreated(SurfaceHolder holder) {

    camera = Camera.open();

    try {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO)
        {                       
         camera.setDisplayOrientation(90);
        } else {
          Parameters parameters = camera.getParameters();
          parameters.setRotation(90);       
          camera.setParameters(parameters); 
        }

        camera.setPreviewDisplay(holder);
    } catch (IOException exception) {
        camera.release();
    }
}
  

Комментарии:

1. К сожалению, этот код у меня не работает. = (. Это очень похоже на код, который у меня уже был, но мне нравится необычное выражение IF! Я чувствую, что этот код должен работать (не имеет смысла, что setDisplayOrientation ничего не делает для моей камеры!), и все же это не так. Большое спасибо за ответ.