2017-08-04 80 views
1

我在camera2 API中预览的方向有问题。即使设备处于肖像模式,我所获得的预览仍然处于横向模式。更准确地说,我得到的传感器旋转角度是90°,因此传感器数据也被映射到90°。观察结果在仿真器(Nexus 5)上。相机预览方向在风景中,但设备在potrait

private void startPreview() { 
    SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture(); 
    surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 
    Surface previewSurface = new Surface(surfaceTexture); 

    try { 
     mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
     mCaptureRequestBuilder.addTarget(previewSurface); 

     mCameraDevice.createCaptureSession(Arrays.asList(previewSurface), 
       new CameraCaptureSession.StateCallback() { 
      @Override 
      public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { 
       try { 
        cameraCaptureSession.setRepeatingRequest(mCaptureRequestBuilder.build(), 
          null, mBackgroundHanlder); 
       } catch (CameraAccessException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { 

      } 
     }, null); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 

} 

private void setupCamera(int width, int height) { 
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
    try { 
     for(String cameraId: cameraManager.getCameraIdList()) { 
      CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId); 
      if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) 
        == CameraCharacteristics.LENS_FACING_FRONT) { 
       continue; 
      } 
      StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 

      int deviceOrientation = getWindowManager().getDefaultDisplay().getRotation(); 
      mTotalRotation = sensorToDeviceRotation(cameraCharacteristics, deviceOrientation); 
      boolean swapRotation = mTotalRotation == 90 || mTotalRotation == 270; 
      int rotatedWidth = width; 
      int rotatedHeight = height; 

      if (swapRotation) { 
       rotatedHeight = width; 
       rotatedWidth = height; 
      } 
      mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class), rotatedWidth, rotatedHeight); 
      mVideoSize = chooseOptimalSize(map.getOutputSizes(MediaRecorder.class), rotatedWidth, rotatedHeight); 

      mcameraId = cameraId; 
      return; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 


private static int sensorToDeviceRotation(CameraCharacteristics cameraCharacteristics, int deviceOrientation) { 
    int sensorOrientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); 
    deviceOrientation = ORIENTATIONS.get(deviceOrientation); 
    return (sensorOrientation+deviceOrientation+360)%360; 
} 

回答

0

它看起来并不像实际上将旋转变换应用到输出帧。只是交换宽度/高度不会做任何事情,因为一般情况下相机只支持风景分辨率。

您需要使用TextureView的getTransform和setTransform函数来添加必要的旋转。

具体做法是:

  1. 读取当前与getTransform
  2. 乘上必要的旋转变换变换你变换计算基于您的UI方向
  3. 设置为TextureView用的setTransform
  4. 变换

Camera2Basic示例应用程序的代码可能对此有所帮助,但我不确定它是否设置为纵向:https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java