Camera2 API中与setDisplayOrientation()等效的是什么?

32

使用 android.hardware.Camera 时,为了使相机输出能够适应设备移动,我们需要将一个 OrientationEventListener 连接到 CamerasetDisplayOrientation() 方法上。这样,当用户扭转设备时,相机预览中的 "上" 可以与现实世界中的 "上" 同步。这对于绕 Y 轴旋转设备(即从横向到反向横向或反之亦然)尤其如此。

对于大多数方向更改,android.hardware.camera2 API 似乎都可以 "自动适应"。但是,对于该 Y 轴旋转(横向 -> 反向横向或反之亦然),相机预览会被倒置。

在 Camera2 API 中,调用哪个方法类似于对 Camera 调用 setDisplayOrientation(),以便处理这种情况?


似乎对于camera2和android 6.0(在模拟器上测试),characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)始终返回270,这就是为什么预览被倒置的原因,当它返回90时,预览正常,所以我猜如果相机传感器方向为270,则应该对SurfaceView进行手动转换以修复预览。 - user924
@user924:“在模拟器上测试过了”-- 在我看来,依赖模拟器来评估相机API的行为是不明智的。 - CommonsWare
是的,可能是这样。我没有像Nexus 5X这样的真实设备,它返回相机传感器方向的270度,但我认为模拟器和类似设备的行为是相同的,当使用SurfaceView时,两者都会有倒置的预览。你找到任何解决方案了吗?我们可以使用TextureView并根据相机方向值应用矩阵,但我想使用SurfaceView,并且我没有找到任何解决方案。我希望TextureView不是唯一的解决方案。 - user924
4个回答

8

正如您所注意到的,这应该对相机2 API上的SurfaceView起作用。

因此,没有等效的setDisplayOrientation()

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

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

1
Y翻转问题源于Android上的方向处理。通常,我们可以简单地遵循方向更改事件。但不幸的是,当设备从横向快速旋转到反向横向(而不经过纵向)时,没有识别到任何方向更改。我认为这是系统中的一个大问题。我们可以使用OrientationEventListener解决此问题,但这种解决方法在camera2中无用。 - Alex Cohn
1
请查看 快速将手机旋转180度,相机预览会颠倒 和相关问题。 - Alex Cohn
  1. 允许方向更改
  2. 原始Android配置更改行为(活动销毁/重新创建)
  3. 我们不能准确地告诉180度旋转发生了什么,所以不,我不会为那种情况做任何事情。请参阅Alex Cohn的评论。您可以通过运行CWAC-Cam2库的“演示”或“演示游乐场”应用程序之一来自行尝试。我的CWAC-Cam2库的存储库
- CommonsWare
1
谢谢,我们会尽快查看并找出问题所在。 - Eddy Talvala
1
@EddyTalvala:如果我为此提交正式问题,是否有帮助?使用Google的示例应用程序的当前版本,在运行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上重现该问题。 - CommonsWare
显示剩余10条评论

0

你知道是否可以在不重新创建的情况下更改已创建的CaptureRequest的方向吗? - Kostanos
1
it's not for preview - user924

0

没有。

如果显示方向与传感器方向相反(在大多数设备上,这是纵向模式的情况),它不会“只是工作”,因为您必须设置一个小于1的纵横比以用于预览表面,而camera2无法映射到适合的输出大小。解决方案:

  • 在第一个API中,您可以使用{{link1:camera.setDisplayOrientation()}}。
  • 在camera2中,我找不到使用SurfaceHolder的方法,但只能在纵向模式下使用SurfaceTexture,并使用{{link2:surfaceTexture.setTransform(android.graphics.Matrix)}}调用。

那么,使用SurfaceView和它的SurfaceHolder是不可能实现的吗? - user924

-1
使用下面的公式来获取设备旋转。
private int getOrientation(int rotation) {
    return (ORIENTATIONS.get(rotation) + mSensorOrientation + 270) % 360;
}

SensorOrientation 是从

characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION) 

谷歌工程师提出的解决方案:yaraki

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


4
这并没有回答问题。问题是如何替换setDeviceOrientation(),而不是如何计算设备方向。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接