Android-камера в портретном на SurfaceView - PullRequest
38 голосов
/ 30 марта 2010

Я попытался сделать несколько вещей, чтобы предварительный просмотр камеры отображался в портретном режиме на SurfaceView. Ничего не получалось. Я тестирую на Droid, который имеет 2.0.1. Я попробовал:

1) принуждение макета к портретному: this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2) с использованием

Camera.Parameters parameters = camera.getParameters();
parameters.set("orientation", "portrait");
parameters.setRotation(90);
camera.setParameters(parameters);

Есть что-то еще, что я могу попробовать? Если это ошибка в Android или телефоне, как я могу убедиться, что это так, чтобы у меня было доказательство сообщить клиенту?

Спасибо, Prasanna

Ответы [ 6 ]

64 голосов
/ 20 июля 2011

Начиная с API 8 уровня, это доступно:

публичный финал void setDisplayOrientation (int градусов)

т.е. с указанием в манифесте:

public void surfaceCreated(SurfaceHolder holder) {
    mCamera = Camera.open();
    mCamera.setDisplayOrientation(90);
11 голосов
/ 18 ноября 2010

у меня есть рабочее решение для портретного режима, работающее в 2.1 (проверено на Desire), возможно, меньше.

Ориентация экрана активности установлена ​​на портретную. (Андроид: screenOrientation = "портрет")

Параметры камеры:

Camera.Parameters p = mCamera.getParameters ();

 p.set("jpeg-quality", 100);
 p.set("orientation", "landscape");
 p.set("rotation", 90);
 p.setPictureFormat(PixelFormat.JPEG);
 p.setPreviewSize(h, w);// here w h are reversed
 mCamera.setParameters(p);

и изображение будет портретным.

SurfaceHolder, который вы используете для камеры, должен быть в размере, совместимом с размером предварительного просмотра телефона обычное разрешение экрана.

Прикол на Desire 2.2 не работает ... Вот исправление:

   At surfaceCreated(..) or when you have this line
camera = Camera.open();
       add
camera.setDisplayOrientation(90);//only 2.2>

Camera.Parameters p = camera.getParameters();
    p.set("jpeg-quality", 100);
p.setRotation(90);
p.setPictureFormat(PixelFormat.JPEG);
p.setPreviewSize(h, w);
camera.setParameters(p);
10 голосов
/ 13 июня 2012

Вы можете попробовать это (хорошо для 2.2 или ниже). Здесь я поворачиваю изображение перед сохранением его на SD-карту. Но это только для портретного режима. Если вам нужно было сделать это для обоих режимов, то вы должны проверить ориентацию камеры и поставить некоторые проверки перед захватом изображения.

PictureCallback jpegCallback = new PictureCallback() {
   public void onPictureTaken(byte[] data, Camera camera) {
      FileOutputStream outStream = null;
      try {
        imageFilePath = getFilename();
        InputStream is = new ByteArrayInputStream(data);
        Bitmap bmp = BitmapFactory.decodeStream(is);
        // Getting width & height of the given image.
        if (bmp != null){
           int w = bmp.getWidth();
           int h = bmp.getHeight();
           // Setting post rotate to 90
           Matrix mtx = new Matrix();
           mtx.postRotate(90);
           // Rotating Bitmap
           Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, w, h, mtx, true);
           ByteArrayOutputStream stream = new ByteArrayOutputStream();
           rotatedBMP.compress(Bitmap.CompressFormat.PNG, 100, stream);
           byte[] byteArray = stream.toByteArray(); 
           outStream = new FileOutputStream
                              (String.format(imageFilePath,System.currentTimeMillis()));
           outStream.write(byteArray);
           outStream.close();
        } else {
           outStream = new FileOutputStream
                              (String.format(imageFilePath,System.currentTimeMillis()));
           outStream.write(data);
           outStream.close();           
        }       

        preview.camera.startPreview();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    }
  }
};
2 голосов
/ 30 марта 2010

Нет способа сделать это на многих современных устройствах, включая G1 и Droid. Взгляните на соответствующий отчет об ошибке здесь:

Также см. Комментарий одного из инженеров Android (Дейва) здесь:

0 голосов
/ 25 мая 2011

Нет необходимости устанавливать какие-либо параметры для ориентации, пока вам не потребуется сделать это явно. По умолчанию он поддерживает эту возможность. В моем случае у меня есть Activity, а над этим действием у меня есть вид с камеры, поэтому я не установил ориентацию для свойств камеры, вместо этого я установил ориентацию как портрет в файле Manifest. Теперь приложение выглядит и работает хорошо. Может быть полезным для некоторых ..

Спасибо.

0 голосов
/ 01 марта 2011

Ссылка, которую Роман дал на тему вопроса, имеет работоспособное решение, которое я сейчас использую.

Найдите это здесь: http://code.google.com/p/android/issues/detail?id=1193#c26

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...