CameraX 供應商擴展

設備製造商可以實現 CameraX OEM 供應商庫,以通過 CameraX 擴展接口向第三方開發人員公開設備特定的效果。 CameraX 為在運行時加載的供應商實現的類定義了 CameraX 擴展接口。本頁介紹如何實現 OEM 供應商庫並在設備上啟用它。

在實施供應商庫之前,請確保您了解 CameraX Jetpack 支持庫的工作原理。要了解更多關於CameraX,見CameraX概述。有關供應商擴展的更多信息,請參閱供應商擴展

建築學

建築學

圖1.廠商擴展架構圖

此圖描述了 CameraX 供應商擴展的體系結構。第三方應用程序是針對CameraX擴展庫(攝像機擴展)建成並使用的相機擴展公共API相機的擴展API)。相機擴展 API 由 CameraX 定義,並在相機擴展庫的新版本發佈時更新。相機擴展公共 API 和相機擴展庫的版本控制是相同的。

擴展接口(擴展接口)由CameraX定義,並且允許照相機的擴展文庫進行通話的OEM商庫(相機的擴展-存根)。 OEM 庫必須具有與擴展接口版本匹配的實現。相機擴展庫的單個實現可以支持擴展接口的多個版本。

實施 OEM 供應商庫

這些實施說明以散景(人像)供應商擴展為例,但您可以將它們應用於其他擴展,例如 HDR、美顏和夜間模式擴展。要做到這一點,複製和粘貼用於擴展背景虛化的代碼,並與所需的擴展替換擴展名(例如,替換BokehImageCaptureExtenderImplHdrImageCaptureExtenderImpl )。

您不需要為每個效果提供實現。沒有供應商實現的效果默認為 CameraX 實現。如果某個效果不可用,則默認實現不會啟用該效果,並向第三方開發者報告該效果不可用。

版本驗證

當裝載OEM庫,CameraX驗證的OEM庫包含一個版本與擴展接口版本兼容(被稱為擴展版本本文檔中)。為了確定版本兼容性,CameraX 僅檢查主要和次要版本(例如 1.0),但不檢查補丁版本,因為它僅用於錯誤修復,而不是接口更改。本文檔中註明了特定 API 所需的擴展版本。沒有指定擴展版本的 API 與擴展版本 1.0 兼容。

要驗證版本,CameraX查詢ExtensionVersionImpl接口。然後,CameraX 使用 OEM 庫報告的版本來確定可以調用的功能。

初始化

CameraX 在確定 OEM 庫實現的擴展接口的版本後開始初始化過程。該InitializerImpl.init方法信號到OEM庫的應用程序要使用擴展。到OEM庫(除了版本檢查),直至由任何其他電話OnExtensionsInitializedCallback被稱為一個成功的狀態。

此方法必須從擴展版本 1.1 開始實施。有關詳細信息,請參閱源InitializerImpl

ExtenderStateListener 接口

CameraX提供掛鉤插入其管道允許OEM庫組相關的幾個地方SessionParametersCaptureRequest值。為了讓OEM庫在指定的時間設置這些值,實現ExtenderStateListener接口。此接口必須作為任何擴展器的一部分來實現,無論是預覽、圖像捕獲、散景還是 HDR 擴展器。

圖像捕捉

為了支持擴展圖像捕獲,執行相應的ImageCaptureExtender接口(例如, BokehImageCaptureExtenderHdrImageCaptureExtender )。

ImageCaptureExtender包括涉及圖像採集擴展所需的接口。

CaptureProcessor接口必須在應用層進行後處理來實現。作為擴展接口1.1版本中,只有YUV_420_888輸入圖像格式必須得到支持。該CaptureProcessor如果處理是在相機HAL完成的接口不是必需的。

下圖說明了圖像捕獲處理流程。

圖像採集流程

圖2.圖像捕獲流程圖

示例:BokehImageCaptureExtenderImpl

為了支持拍攝背景虛化擴展,實現BokehImageCaptureExtenderImpl在類androidx.camera.extensions.impl包。

預覽

為了支持擴展預覽,執行相應的PreviewExtender接口(例如, BokehPreviewExtenderHdrPreviewExtender )。該PreviewExtender接口包括預覽相關的擴展所需的接口。

有關詳細信息,請參閱源PreviewExtender

預覽擴展的圖像處理可以在相機 HAL 或應用層中執行。這是通過的值確定ProcessorType ,其通過返回PreviewExtenderImpl

如果PROCESSOR_TYPE_REQUEST_UPDATE_ONLY返回類型,在通過HAL執行處理CaptureRequest密鑰。如果PROCESSOR_TYPE_IMAGE_PROCESSOR返回類型,在通過該應用層執行處理PreviewImageProcessorImpl接口。此界面上的動作Image以及TotalCaptureResult對。作為擴展接口1.1版本中,只有YUV_420_888輸入圖像格式必須得到支持。

下圖說明了預覽供應商擴展的流程。

預覽流程圖

圖3.預覽流程圖

示例:BokehPreviewExtenderImpl

為了支持背景虛化預覽,實現BokehPreviewExtenderImpl在類androidx.camera.extensions.impl包。

參考實現

對於參考OEM供應商庫的實現,見/平台/框架/支架/攝像頭/集成的測試/ extensionstestlib / 。請注意,此實現執行直通而不實際實現效果。

在設備上設置供應商庫

OEM 供應商庫未內置到應用程序中,而是由 CameraX 在運行時從設備加載。所述<uses-library>標籤聲明, androidx.camera.extensions.impl庫,這是在所定義AndroidManifest.xml文件,是CameraX的依賴性和必須在運行時被加載。這允許使用供應商擴展的第三方應用程序自動嘗試加載 OEM 供應商庫。 OEM 庫被標記為可選,因此應用可以在沒有該庫的設備上運行。

只要設備製造商將 OEM 庫放置在設備上,以便應用可以發現它,CameraX 就會在應用嘗試使用供應商擴展時自動處理此行為。

要在設備上設置 OEM 庫,請執行以下操作:

  1. 添加權限文件,這是由所要求的<uses-library>標籤,使用以下格式: /etc/permissions/ ANY_FILENAME .xml 。例如, /etc/permissions/camera_extensions.xml 。此目錄中的文件提供了在指定的庫的映射<uses-library>到設備上的實際文件路徑。
  2. 使用以下示例將所需信息添加到文件中。

    • name必須androidx.camera.extensions.impl因為這是該庫CameraX搜索。
    • file是包含擴展實現(例如,文件的絕對路徑/system/framework/androidx.camera.extensions.impl.jar )。
    <?xml version="1.0" encoding="utf-8"?>
    <permissions>
        <library name="androidx.camera.extensions.impl"
                 file="OEM_IMPLEMENTED_JAR" />
    </permissions>
    

在Android中12或更高,支撐CameraX擴展設備必須具有ro.camerax.extensions.enabled屬性設置為true ,這允許用於詢問是否一個設備支持擴展。為此,請在設備 make 文件中添加以下行:

PRODUCT_VENDOR_PROPERTIES += \
    ro.camerax.extensions.enabled=true \

驗證

要在開發階段測試的OEM供應商庫的實現,使用的示例應用程序在androidx-main/camera/integration-tests/extensionstestapp/ ,它通過各種供應商擴展運行。

您完成實施後,使用CameraX供應商擴展驗證工具來運行自動和手動測試,以驗證供應商庫的正確實施。

常見問題 (FAQ)

API 級別是否有任何限制?

是的。這取決於 OEM 供應商庫實現所需的 Android API 功能集。例如, ExtenderStateListener.onPresetSession()使用SessionConfiguration.setSessionParameters()調用以設置一個基線組標籤。此調用僅適用於 API 級別 28 及更高級別。有關特定接口方法的詳細信息,請參閱API參考文檔