在API级别9中,Android添加了CameraInfo类,其中包含有关设备中每个物理摄像头的信息。特别是,它包含orientation属性,即“相机图像需要顺时针旋转的角度,以便在显示器上以其自然方向正确显示”。这与设备的实际旋转不同,可从getContext().getWindowManager().getDefaultDisplay().getRotation()
找到。
Android sample code从后置摄像头的摄像头方向中减去设备的旋转(对于前置摄像头稍微复杂一点),并将摄像头预览旋转此量。这样可以在屏幕的纵向和横向方向上正确显示预览。
如何在没有CameraInfo类的API级别中获得相机的内在方向?
答案 0 :(得分:1)
有一些特定于平台的解决方案。但是没有简单的通用解决方案。
Android有一个硬件抽象层(HAL),不同的供应商会以不同的方式实现HAL。例如,不同的相机设备可能具有不同的驱动程序,因此它们有不同的方式来获取数据,包括您的cameraInfo。当Android向HAL添加API时,它要求其供应商基于其硬件实现该API。然后Android框架和Android应用程序可以统一使用该功能。但是,正如你所说,getCameraInfo不在HAL Before Froyo中。因此,直接的方法是从驱动程序或特定于平台的库中获取这些信息。
对于MSM Camera,mm_camera_get_camera_info
中有liboemcamera.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命令。祝你好运。