2013-03-17 40 views
0

在API級別9中,Android添加了CameraInfo類,其中包含設備中每個物理相機的信息。特別是,它包含orientation屬性,即「相機圖像需要順時針旋轉以便在其自然方向上正確顯示在顯示屏上的角度」。這與從getContext().getWindowManager().getDefaultDisplay().getRotation()發現的設備的實際旋轉不同。在API中獲取相機的內在方向<9

Android的sample code從後置攝像頭的攝像頭方向中減去設備的旋轉(對於前置攝像頭,它稍微複雜一些),並將相機預覽旋轉此量。這允許預覽在屏幕的縱向和橫向兩個方向上正確顯示。

在沒有CameraInfo類的情況下,如何在API級別小於9的情況下獲取相機的內在方位?

回答

1

有一些平臺特定的解決方案。但是沒有簡單的通用解決方案。

Android有一個硬件抽象層(HAL),不同的供應商會以不同的方式實現HAL。例如,不同的相機設備可能有不同的驅動程序,所以他們有不同的方式來獲取他們的數據,包括您的cameraInfo。當Android將API添加到HAL中時,它要求供應商根據其硬件實施該API。然後,Android框架和Android應用程序可以統一使用該功能。

但是,正如您所說,getCameraInfo不在HAL Before Froyo之前。所以一個簡單的方法就是自己從驅動程序或平臺特定的庫中獲取這些信息。

對於MSM相機,liboemcamera.so中有mm_camera_get_camera_info函數。您可以使用它來獲取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命令。祝你好運。

+0

Ouch。我只能假設後向攝像機的方位角爲90度,前方的方位角爲270度,僅適用於Froyo?我記得在某個地方聽到這些是通常的價值。 – 2013-03-18 14:04:40

+0

是的,你可以。實際上,在API 9之後,90和270是Android中CameraHardwareInterface中定義的默認值。@ 1'' – StarPinkER 2013-03-19 00:31:23

+0

呵呵。那麼,這似乎解決了這個問題:) – 2013-03-19 00:34:14