Android портрет заблокирован Предварительный просмотр камеры

Я реализовал предварительный просмотр камеры так же, как и в приложении ApiDemos на Android. Дело в том, что я хочу, чтобы моя деятельность, где показывается предварительный просмотр, была привязана к портрету. Так что я установил screenOrientation в портрет в манифесте.

Метод 'getOptimalPreviewSize' возвращает противоположные значения для предварительного просмотра, то есть, когда необходимо вернуть 480x720, метод возвращает 720x480, и у меня небольшой предварительный просмотр по центру в моем FrameLayout действия (что не является тем, что я хочу, я хочу, чтобы сопоставить родительский (да, макет определен с "match_parent").

Я старался:

  • setDisplayOrientation (90);
  • parameters.set ("ориентация", "портрет");
  • parameters.set ("вращение", "90");

Кажется, ничто не поможет.

Почему я не могу показать предварительный просмотр камеры в портретном режиме? Locked.

Спасибо

2 ответа

Вот рабочий пример предварительного просмотра портрета камеры на SurfaceView:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surface);
    surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {

        private Camera camera;

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                camera = Camera.open();
                camera.setPreviewDisplay(holder);
                camera.setDisplayOrientation(90);
                camera.startPreview();
            } catch (IOException e) {
                Log.e(TAG, "Error", e);
            }
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) { 
            camera.stopPreview();
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        }
    });
}

Со следующим файлом макета:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <SurfaceView
        android:id="@+id/surface"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

Пытаться setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);

Это закрепит активность в этой ориентации.

Следующий код из Документов Google:

public static void setCameraDisplayOrientation(Activity activity,
     int cameraId, android.hardware.Camera camera) {
 android.hardware.Camera.CameraInfo info =
         new android.hardware.Camera.CameraInfo();
 android.hardware.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;
 }
 camera.setDisplayOrientation(result);
}

Который будет устанавливать ориентацию камеры и правильно просматривать.

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