0

在 API 级别 9 中,Android 添加了 CameraInfo 类,其中包含设备中每个物理摄像头的信息。特别是,它包含一个方向属性,即“相机图像需要顺时针旋转的角度,以便它以自然方向正确显示在显示器上”。这与设备的实际旋转不同,后者是从 中找到的getContext().getWindowManager().getDefaultDisplay().getRotation()

Android 的示例代码从后置摄像头的摄像头方向中减去设备的旋转(前置摄像头稍微复杂一些),并将摄像头预览旋转这个量。这允许预览以屏幕的纵向和横向方向正确显示。

在没有 CameraInfo 类的 API 级别小于 9 的情况下,如何获得相机的内在方向?

4

1 回答 1

1

有一些特定于平台的解决方案。但是没有简单的通用解决方案。

Android 有一个硬件抽象层(HAL),不同的厂商会以不同的方式实现 HAL。例如,不同的相机设备可能有不同的驱动程序,所以他们有不同的方式来获取他们的数据,包括你的 cameraInfo。当 Android 将 API 添加到 HAL 中时,它要求其供应商基于其硬件实现该 API。然后 Android 框架和 Android 应用程序可以以统一的方式使用该功能。

但是,正如您所说,getCameraInfo 不在 Froyo 之前的 HAL 中。因此,一种直接的方法是自己从驱动程序或特定于平台的库中获取这些信息。

对于 MSM 相机,mm_camera_get_camera_infoliboemcamera.so. 您可以使用它来获取 camera_info_t 结构的列表。

typedef struct {
  int  modes_supported;
  int8_t camera_id;
  cam_position_t position;
  uint32_t sensor_mount_angle;
}camera_info_t;

该函数封装了对目标相机设备的实际系统调用。ioctl(controlfd, MSM_CAM_IOCTL_GET_CAMERA_INFO, &cameraInfo). 喜欢的可以直接调用。

所以不幸的是,您需要根据您正在使用的设备获取该信息。但也许你期待一个通用的方法。那么我认为实现这一目标的唯一方法是自己实现 HAL。许多 if-else 来决定您需要使用哪个设备或哪个 ioctl 命令。祝你好运。

于 2013-03-18T07:51:40.060 回答