谷歌致力於推進種族平等的黑人社區。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

相機

Android相機HAL圖標

Android的攝像頭硬件抽象層(HAL)在更高級別的相機框架API連接相機2到您的基礎攝像頭驅動程序和硬件。相機子系統包括照相機管道組件的實現,同時相機HAL為實現您的這些組件的版本使用提供接口。

建築

下圖和列表說明了HAL組件。

Android攝像頭架構

圖1.攝像機架構

應用程序框架
在應用程序框架層是應用程序的代碼,它使用相機2 API與攝像頭硬件交互。在內部,與此代碼調用粘結劑接口來訪問本地代碼,與攝像頭共同作用。
AIDL
相關聯的粘合劑界面CameraService可以被發現在框架/ AV /相機/ AIDL /機器人/硬件 。所生成的代碼調用低級別的本機代碼,以獲得訪問權,則用於創建物理照相機和返回數據CameraDevice並最終CameraCaptureSession在框架級對象。
本地框架
該框架居住在frameworks/av/提供本機相當於CameraDeviceCameraCaptureSession類。又見NDK camera2參考
粘合劑IPC接口
所述IPC接口粘合劑便於在進程邊界通信。有位於幾個相機粘合劑類frameworks/av/camera/camera/aidl/android/hardware目錄調用到攝像機的服務。 ICameraService是接口至照相機服務; ICameraDeviceUser是接口到一個特定的打開攝像機裝置;和ICameraServiceListenerICameraDeviceCallbacks是各自CameraServiceCameraDevice回調應用程序框架。
相機維修
相機服務,位於frameworks/av/services/camera/libcameraservice/CameraService.cpp ,是實際的代碼與HAL交互。
HAL
硬件抽象層定義了標準接口,攝像機服務調用到,並且必須實現正確你的相機硬件功能。

實施HAL

該HAL坐在攝像頭驅動程序和更高級別的Android框架之間並定義,必須實現這樣的應用程序能夠正確地操作相機硬件的接口。該HIDL為相機HAL接口中所定義的硬件/接口/相機

一個典型的binderized HAL必須實現以下HIDL接口:

參考HIDL實現可用於CameraProvider.cppCameraDevice.cppCameraDeviceSession.cpp 。實現包裝仍然使用舊的HAL 遺留API 。與Android 8.0開始,相機HAL實現必須使用HIDL API;不支持使用傳統界面。

傳統HAL組件

本節介紹了傳統HAL組件的體系結構以及如何實現的HAL。在Android 8.0相機HAL實現和更高必須使用代替,以上描述的HIDL API。

架構(傳統)

下圖和列表說明傳統相機HAL組件。

Android攝像頭架構

圖2.傳統相機架構

應用程序框架
在應用程序框架層是應用程序的代碼,它使用android.hardware.Camera API交互與攝像頭硬件。在內部,這個代碼調用相應的JNI膠類來訪問本地代碼,與攝像頭共同作用。
JNI
與相關聯的JNI代碼android.hardware.Camera位於frameworks/base/core/jni/android_hardware_Camera.cpp 。此代碼調用低級別的本機代碼,以獲得訪問權,則用於創建物理照相機和返回數據android.hardware.Camera在框架級對象。
本地框架
在定義的本機框架frameworks/av/camera/Camera.cpp提供本機相當於android.hardware.Camera類。這個類調用IPC粘結劑代理獲得訪問攝像機的服務。
粘合劑IPC代理
該IPC粘結劑代理有助於通過進程邊界通信。有跡象表明,分佈在三個相機粘合劑類frameworks/av/camera目錄在調用攝像頭的服務。 ICameraService是接口的攝像頭服務, ICamera是接口到一個特定的打開攝像裝置,並ICameraClient是設備的接口回到應用程序框架。
相機維修
相機服務,位於frameworks/av/services/camera/libcameraservice/CameraService.cpp ,是實際的代碼與HAL交互。
HAL
硬件抽象層定義了標準接口,攝像機服務調用到,並且必須實現正確你的相機硬件功能。
內核驅動程序
攝像頭的驅動程序與實際的攝像頭硬件交互和你的HAL的實現。相機和驅動程序必須支持YV12和NV21圖像格式,以用於在顯示和視頻記錄預覽照相機圖像提供支持。

實施HAL(傳統)

該HAL坐在攝像頭驅動程序和更高級別的Android框架之間並定義,必須實現這樣的應用程序能夠正確地操作相機硬件的接口。的HAL接口在定義hardware/libhardware/include/hardware/camera.hhardware/libhardware/include/hardware/camera_common.h頭文件。

camera_common.h定義camera_module ,一個標準的結構,以獲得關於照相機,一般信息如攝像機ID和屬性共同所有攝像機(即,是否它是一個前置式或背置攝像頭)。

camera.h包含的代碼對應於android.hardware.Camera 。這個頭文件聲明了一個camera_device結構,裡面包含一個camera_device_ops結構的指針來實現的HAL接口功能。關於相機參數開發人員可以設置文檔,請參閱frameworks/av/include/camera/CameraParameters.h 。這些參數設置與指向的函數int (*set_parameters)(struct camera_device *, const char *parms)在HAL。

對於HAL實施方案的實例,請參見在銀河的Nexus HAL執行hardware/ti/omap4xxx/camera

配置共享庫

設置Android構建系統正確地打包HAL落實到一個共享庫,並通過創建一個將其複製到適當的位置Android.mk文件:

  1. 創建一個device/<company_name>/<device_name>/camera目錄來包含庫的源文件。
  2. 創建一個Android.mk文件,以建立共享庫。確保makefile文件包含以下幾行:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    您的庫必須命名為camera.<device_name>.so自動附加),因此Android可以正確地加載所述程序庫。對於一個示例,請參見對位於Galaxy Nexus的相機生成文件hardware/ti/omap4xxx/Android.mk

  3. 通過在複製所需具備的XML文件指定您的設備已相機功能frameworks/native/data/etc與設備的Makefile目錄。例如,為了指定設備具有相機閃光燈,並且可以自動對焦,添加下列行位於裝置的<device>/<company_name>/<device_name>/device.mk生成文件:
    PRODUCT_COPY_FILES := \ ...
    
    PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
    

    對於設備生成文件的一個例子,請參閱device/samsung/tuna/device.mk

  4. 聲明相機的媒體編解碼器,格式,分辨率功能device/<company_name>/<device_name>/media_profiles.xmldevice/<company_name>/<device_name>/media_codecs.xml XML文件。有關詳細信息,請參閱暴露的編解碼器的框架
  5. 添加以下行的設備的device/<company_name>/<device_name>/device.mk makefile文件複製media_profiles.xmlmedia_codecs.xml文件到合適的位置:
    # media config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml
    
    # media codec config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml
    
  6. 要在設備的系統映像的攝像頭應用程序,在其指定PRODUCT_PACKAGES在設備的可變device/<company>/<device>/device.mk生成文件:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...