【问题标题】:What is the Camera2 API Equivalent of setDisplayOrientation()?什么是 setDisplayOrientation() 的 Camera2 API 等效项?
【发布时间】:2016-02-02 10:02:08
【问题描述】:

使用android.hardware.Camera,为了让相机输出正确地跟踪设备移动,我们需要将OrientationEventListener 连接到Camera 上的setDisplayOrientation() 方法。这样,当用户转动设备时,我们可以使相机预览中的“向上”与现实世界中的“向上”保持同步。绕 Y 轴旋转设备时尤其如此(即从横向翻转到反向横向或向后翻转)。

对于大多数方向更改,android.hardware.camera2 API 似乎“正常工作”。但是,对于 Y 轴旋转(横向 -> 反向横向,反之亦然),相机预览最终会被反转。

对于 Camera2 API,在 Camera 上调用 setDisplayOrientation() 等效于什么,以便我们可以处理这种情况?

【问题讨论】:

  • 对于 camera2 和 android 6.0(在模拟器上测试)characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION) 似乎总是返回 270,这就是为什么当预览返回 90 那么预览就可以了,所以我想如果相机传感器方向是 270 来修复预览,我们应该对 SurfaceView 进行手动转换
  • @user924:“在模拟器上测试”——依赖模拟器来评估相机 API 的行为是不明智的,恕我直言。
  • 是的,mb。我只是没有真正的设备,比如 Nexus 5X,它返回 270 度的相机传感器方向,但我认为模拟器和此类设备的行为相同,在使用 SurfaceView 时都有倒置预览。你找到任何解决方案了吗?我们可以使用 TextureView 并根据相机方向值应用矩阵,但我想使用 SurfaceView,但我没有找到任何解决方案。我希望 TextureView 不是唯一的解决方案

标签: android android-camera


【解决方案1】:

正如您所注意到的,这应该对 camera2 API 上的 SurfaceView“正常工作”。

因此,没有 setDisplayOrientation() 的等价物。

我们之前没有听说过这个问题,所以有几个问题:

  1. 您是否将应用程序锁定为横向,或者您是否允许更改方向?
  2. 您自己处理方向更改,还是让框架在方向更改时拆除并重新启动您的应用?
  3. 当发生 180 度旋转时,是否会触发任何类型的重新布局,例如调整快门按钮的位置?

【讨论】:

  • Y翻转问题的根源在于Android上的方向处理。通常,我们可以简单地跟踪方向变化事件。但不幸的是,当设备从横向快速旋转到反向横向(不经过纵向)时,不会识别出方向变化。我相信这在系统中很重要。我们可以使用 OrientationEventListener 解决这个问题,但是这个解决方法对 camera2 没有用
  • 1) 允许方向更改 2) 库存 Android 配置更改行为(活动销毁/重新创建) 3) 我们无法准确判断发生 180 度旋转,所以不,我没有这样做这种情况下的任何东西。参见 Alex Cohn 的 cmets。您可以通过运行来自my CWAC-Cam2 library's repositorydemodemo-playground 应用程序自行尝试。
  • 谢谢,我们会尽快查看,看看问题出在哪里。
  • @EddyTalvala:如果我为此提交正式问题会有所帮助吗?使用当前版本的Google's sample app,这可以在运行 Android 6.0 的 Google Nexus 5、Google Nexus 5X、Google Nexus 6P、Google Nexus 7 (2013) 和 Google Nexus 9 上重现。如果您将示例修复为不在旧设备上尝试使用 checkSelfPermission(),则可以在运行 Android 5.1 的 Google Nexus 4 上重现该问题。
【解决方案2】:

没有。

如果显示方向与传感器方向(在大多数设备上是纵向模式下的情况)相比,它不会“正常工作”,因为您必须为 camera2 无法映射到的预览表面设置纵横比

【讨论】:

  • 真的,SurfaceView 是不可能的,它是 SurfaceHolder
【解决方案3】:

使用此CaptureRequest JPEG_ORIENTATION 设置您的显示方向

captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, 90)

【讨论】:

  • 你知道是否可以改变已经创建的 CaptureRequest 的方向而不重新创建它?
  • 不是预览版
【解决方案4】:

使用下面的公式来获得设备旋转。

private int getOrientation(int rotation) {
    return (ORIENTATIONS.get(rotation) + mSensorOrientation + 270) % 360;
}

SensorOrientation 是从

分配的字段
characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION) 

google工程师建议的解决方案:yaraki

https://github.com/googlesamples/android-Camera2Basic/issues/24

【讨论】:

  • 这没有回答问题。问题是如何替换setDeviceOrientation(),而不是如何计算设备方向。
猜你喜欢
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2018-11-12
  • 2012-10-16
  • 2010-10-01
  • 2016-03-20
相关资源
最近更新 更多