2015-12-10 339 views
0

我正在使用camera2并遇到旋转问题。 在某些设备中,切换到前置摄像头时,预览正在旋转180度。 正在为camera2寻找这样的“setDefaultOrientation()”方法,但无法找到它。Camera2前置摄像头预览旋转

感谢

+0

你用什么来显示你的预览?一个SurfaceView或一个TextureView,或其他东西? –

+0

我正在使用GLSurfaceView。方向在我的应用程序中是固定的,它是横向的,相机切换到前端时的旋转问题不在所有设备上。 – user0770

回答

1

对于GLSurfaceView,您大概会使用SurfaceTexture将相机预览流映射到GL纹理,然后进行渲染。

纹理中的图像数据不会自动旋转为“直立” - 一方面,操作系统无法知道您将如何渲染纹理。

然而,表面纹理具有getTransformMatrix调用,当连接到camera2 API,会给你必要从相机的定向设备的本地方向(一般人像的电话,景观为平板电脑,但不改变总是)。然后,您必须将原生方向转换为您的应用程序的方向转换为此矩阵,然后应用组合矩阵转换来调整预览图像。

+0

谢谢埃迪,我这样做,问题解决,但它会导致旧相机预览错误旋转(API 21以下)。有没有额外的解决方案? – user0770

+0

对于旧相机API,您需要使用setDisplayOrientation调用(http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation%28int%29);在文档中有示例代码来设置完整转换(不需要另外考虑应用程序方向)。 –

+0

@ user0770你能分享一段代码吗?我也遇到同样的问题。 – scsiva1991

-2

你可以尝试打开你的相机这个代码

我希望这将有助于

public void startPreview() { 
    try { 
     Log.i(TAG, "starting preview: " + started); 

     // .... 
     Camera.CameraInfo camInfo = new Camera.CameraInfo(); 
     Camera.getCameraInfo(cameraIndex, camInfo); 
     int cameraRotationOffset = camInfo.orientation; 
     // ... 

     Camera.Parameters parameters = camera.getParameters(); 
     List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); 
     Camera.Size previewSize = null; 
     float closestRatio = Float.MAX_VALUE; 

     int targetPreviewWidth = isLandscape() ? getWidth() : getHeight(); 
     int targetPreviewHeight = isLandscape() ? getHeight() : getWidth(); 
     float targetRatio = targetPreviewWidth/(float) targetPreviewHeight; 

     Log.v(TAG, "target size: " + targetPreviewWidth + "/" + targetPreviewHeight + " ratio:" + targetRatio); 
     for (Camera.Size candidateSize : previewSizes) { 
      float whRatio = candidateSize.width/(float) candidateSize.height; 
      if (previewSize == null || Math.abs(targetRatio - whRatio) < Math.abs(targetRatio - closestRatio)) { 
       closestRatio = whRatio; 
       previewSize = candidateSize; 
      } 
     } 

     int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
     int degrees = 0; 
     switch (rotation) { 
     case Surface.ROTATION_0: 
      degrees = 0; 
      break; // Natural orientation 
     case Surface.ROTATION_90: 
      degrees = 90; 
      break; // Landscape left 
     case Surface.ROTATION_180: 
      degrees = 180; 
      break;// Upside down 
     case Surface.ROTATION_270: 
      degrees = 270; 
      break;// Landscape right 
     } 
     int displayRotation; 
     if (isFrontFacingCam) { 
      displayRotation = (cameraRotationOffset + degrees) % 360; 
      displayRotation = (360 - displayRotation) % 360; // compensate 
                   // the 
                   // mirror 
     } else { // back-facing 
      displayRotation = (cameraRotationOffset - degrees + 360) % 360; 
     } 

     Log.v(TAG, "rotation cam/phone = displayRotation: " + cameraRotationOffset + "/" + degrees + " = " 
       + displayRotation); 

     this.camera.setDisplayOrientation(displayRotation); 

     int rotate; 
     if (isFrontFacingCam) { 
      rotate = (360 + cameraRotationOffset + degrees) % 360; 
     } else { 
      rotate = (360 + cameraRotationOffset - degrees) % 360; 
     } 

     Log.v(TAG, "screenshot rotation: " + cameraRotationOffset + "/" + degrees + " = " + rotate); 

     Log.v(TAG, "preview size: " + previewSize.width + "/" + previewSize.height); 
     parameters.setPreviewSize(previewSize.width, previewSize.height); 
     parameters.setRotation(rotate); 
     camera.setParameters(parameters); 
     camera.setPreviewDisplay(mHolder); 
     camera.startPreview(); 

     Log.d(TAG, "preview started"); 

     started = true; 
    } catch (IOException e) { 
     Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
    } 
} 
+1

这是android.hardware.camera,我的问题是android.hardware.camera2。 – user0770

+0

尝试帮助您 https://android.googlesource.com/platform/cts/+/7b6aac1a749c6b2b0a5710e0fd5866ea3c24e12f/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java ,和本代码演示 https://github.com/googlesamples/android-Camera2Raw 和 https://github.com/MrTillis/Camera2Basic – Saif

-1

你可以设置正确的图像旋转CaptureRequest对象,而在CameraCaptureSession.StateCallback拍摄图像使用CameraCharacterisitics

CameraCharacterisitics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId); 

这样子。

private CameraCaptureSession.StateCallback sessionStateCallback = new CameraCaptureSession.StateCallback() { 
@Override 
public void onConfigured(@NonNull CameraCaptureSession session) { 
    captureSession = session; 
    try { 
    CaptureRequest.Builder builder = session.getDevice().createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
    builder.addTarget(imageReader.getSurface()); 
    builder.set(CaptureRequest.JPEG_ORIENTATION, cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)); 
    session.capture(builder.build(), null, backgroundHandler); 
    } catch (CameraAccessException e) { 
    Log.d("tag", e.getMessage()); 
    } 
} 

@Override 
public void onConfigureFailed(@NonNull CameraCaptureSession session) { 
} 
}; 
+0

这是拍摄的图像,我需要预览 – user0770