遷移至 Camera2

本頁面說明擴展視野系統 (EVS) 和 Camera2 的差異。並說明如何設定 Camera2 實作。

開啟及關閉攝影機

EVS

openCamera 結合了開啟裝置和設定單一串流的作業。

Camera2

如要使用 Camera2 開啟及關閉裝置,請按照下列步驟操作:

  1. 選取下列其中一個模式:

  2. 如要設定串流,請使用相關輸出介面建立擷取工作階段。舉例來說,可從 ImageReader 或 SurfaceView 取得,方法是使用 CameraDevice.createCaptureSession() (Java) 或 ACameraDevice_createCaptureSession() (NDK)。

    Camera2 支援同時多個串流。建立多個串流,用於預覽、錄製和圖像處理等用途。串流會做為平行管道,依序處理來自攝影機的原始影格。

  3. 如要關閉攝影機裝置,請使用 CameraDevice.close() (Java) 或 ACameraDevice_close() (NDK)。

請參考下列程式碼片段範例:

Java

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
    manager.openCamera(cameraId, new CameraDevice.StateCallback() {
        @Override
        public void onOpened(@NonNull CameraDevice camera) {
            // Camera opened, now create session
        }
        @Override
        public void onDisconnected(@NonNull CameraDevice camera) {}
        @Override
        public void onError(@NonNull CameraDevice camera, int error) {}
    }, handler);
} catch (CameraAccessException e) {
    // Handle exception
}

NDK

ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
    cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);

串流攝影機資料

本節說明如何串流攝影機資料。

EVS

在 EVS 上,請:

  1. 啟動串流,使用 startVideoStream
  2. 停止串流播放,請使用 stopVideoStream

Camera2

在 Camera2 中,如要:

  1. 建立適合預覽的 CaptureRequest,並在 Java 中使用 TEMPLATE_PREVIEW 搭配 CameraDevice.createCaptureRequest(),或在 NDK 中使用 ACameraDevice_createCaptureRequest()

  2. 提交持續串流要求,請使用 CameraCaptureSession.setSingleRepeatingRequest (Java) 或 ACameraCaptureSession_setRepeatingRequestV2 (NDK)。

  3. 停止串流,使用 CameraCaptureSession.stopRepeating (Java) 或 ACameraCaptureSession_stopRepeating (NDK)。

緩衝區管理

  • 在 EVS 中,setMaxFramesInFlight先前控制緩衝區計數, 這可能會在串流中途變更。攝影機開始串流時,EVS 會為每個影像畫面提供緩衝區 ID,這與記憶體中的相同硬體緩衝區位址相關。

  • 在 Camera2 中,AImageReaderImageReader 的圖片數量上限會在初始化工作階段時,透過 AImageReader_newImageReader.newInstance 設定。工作階段開始後,就無法動態變更這項設定。如要取得每個影格的緩衝區 ID,用戶端可以維護對應硬體緩衝區位址 (從 Image 物件取得) 與不重複 ID 的對應項。

暫停及繼續串流播放

攝影機參數

請參閱下列程式碼範例:

Java

CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.set(CaptureRequest.CONTROL_EFFECT_MODE, CaptureRequest.CONTROL_EFFECT_MODE_MONO);
// Submit this request

NDK

ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_CONTROL_EFFECT_MODE, 1, &effectMode);

邏輯攝影機

  • EVS:如果是環景攝影機等邏輯攝影機,EVS 管理工具會開啟所有相關聯的實體攝影機、啟動視訊串流,並提供連貫的影像陣列。

  • Camera2:如果需要使用 Camera2 的類似功能,應用程式必須管理邏輯相機,因此您需要:

    • 找出與邏輯攝影機相關聯的實體子攝影機。
    • 開啟每個必要的實體攝影機。
    • 在每部攝影機上啟動串流。
    • 視需要同步處理影格。最好是在 HAL 處理這項作業,以進行硬體層級的同步處理。

我們會為現有 EVS 用戶端提供相容性程式庫 (墊片層),方便他們進行轉換。目標是支援 Camera2 API,同時盡量減少程式碼變更。

權限

本節說明權限異動。

EVS

只有具備特殊權限的專屬 ID (UID) 才能存取。例如:AID_AUTOMOTIVE_EVS。已淘汰的權限包括 android.car.permission.USE_CAR_EVS_CAMERA

Camera2

Camera2 需要 android.permission.CAMERA。特殊情況:

安全關鍵攝影機應用程式必須遵守「Design for Driving」提供的 Google 內建預先授權政策。

主要和次要用戶端

如要分享攝影機存取權:

  • EVS 提供明確的 API (setPrimaryClientforcePrimaryClient) 來管理主要用戶端,該用戶端有權修改參數。

  • 如果以共用模式開啟 Camera2 (Android 16 以上版本),存取相機的用戶端優先順序會決定主要用戶端。優先順序最高的用戶端 (通常是前景應用程式) 可以修改擷取要求參數。系統不會使用任何直接 API 強制設定主要狀態。主要狀態由架構管理。

系統攝影機

如要限制系統或 1P 應用程式只能存取攝影機裝置,請在該裝置的 Camera HAL 中宣告 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA 功能。除了android.permission.CAMERA,用戶端也必須android.permission.SYSTEM_CAMERA連線至攝影機裝置。

後視鏡頭

EVS

EVS 先前會在 Android 啟動前啟用相機存取權,這對後視攝影機等功能來說是重要事件。車輛 OEM 須負責遵守並通過聯邦機動車輛安全標準 (FMVSS) 第 111 號「後方視野」的法規認證。此外,車輛原始設備製造商 (OEM) 必須遵守其他後視攝影機法規。

是否符合規定取決於硬體、HAL 實作和整體系統整合。在參考平台啟動 Android 後,EVS 通常需要四到六秒才能運作並授予攝影機存取權。

Camera2

AID_AUTOMOTIVE_EVS UID 識別的具備權限用戶端,可以在 Android 開機程序完成前使用 Camera2 API 存取相機。這項搶先體驗功能僅限於車輛外部的系統攝影機。Camera2 的早期相機存取效能 KPI 與 EVS 相同,通常會在 Android 開機後四到六秒內提供。

為確保後視攝影機畫面顯示一致且不受阻礙,特別是在使用者轉換畫面或有其他應用程式可能會遮住預覽畫面時,建議您使用 Camera2 實作後視攝影機時,遵循下列準則:

  1. 將後視攝影機指定為「系統攝影機」,限制第三方應用程式存取。

  2. User 0 執行存取攝影機的服務或應用程式,使用 CAMERA_HEADLESS_SYSTEM_USER 權限。這樣一來,無論使用者是否切換到前景,相機串流都不會中斷。

  3. 將應用程式新增至「攝影機隱私權允許清單」,即使使用者控制的攝影機隱私權切換鈕已啟用,也能授予攝影機存取權。

CarEVSManager 和 CarEVSService

CarEVSManager 先前會授予 Java 應用程式攝影機存取權,改用 Camera2 後,這項功能會由 standard android.hardware.camera2.CameraManager 取代。

我們計畫淘汰 CarEVSService,這項選用服務會監控 GEAR_SELECTION VHAL 屬性,並用於啟動 OEM 指定的後視攝影機活動。使用這項功能的原始設備製造商 (OEM) 必須將相關聯的邏輯轉移至 OEM 擁有的應用程式。

  • 監控 GEAR_SELECTION VHAL 屬性。
  • 啟用倒車檔時,啟動後視攝影機活動。
  • 使用 Camera2 API 顯示相機畫面。

顯示轉譯

EVS 螢幕和車輛螢幕服務

這些已淘汰。

Camera2

搭配使用 Surface、android.hardware.display.DisplayManagerandroid.view.Display,使用標準 Android 算繪方法。

如需提早顯示相機畫面,Camera2 ImageReader 可直接存取硬體緩衝區,方便您整合現有的 DRM 顯示實作項目,以進行算繪。

這項攝影機搶先存取權僅授予具有 AID_AUTOMOTIVE_EVS_UID 的特許用戶,且僅限於車輛外部的系統攝影機。

模擬器 HAL (EVS 模擬 HAL)

我們計畫淘汰 EVS Mock HAL。OEM 應改用 Camera2 模擬相機 HAL hardware/google/camera/devices/EmulatedCamera/,我們計畫支援:

  • 可設定攝影機數量。
  • 色條測試模式。
  • 模擬影片檔案。

如要在建構作業中加入這個 HAL,請執行下列操作:

# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal

此外,您也必須採用適當的安全增強式 Linux (SELinux) 政策,允許 cameraserver 與模擬攝影機 HAL 服務互動。

V4L2 UVC 攝影機 HAL

我們計畫淘汰 EVS V4L2 HAL。使用 Camera2 外接攝影機支援功能,支援 USB 攝影機 (UVC)。詳情請參閱「外接 USB 攝影機」。

超音波 API

我們計畫淘汰 EVS Ultrasonics API。請改用 Android 15 推出的 VHAL 屬性,偵測超音波感應器。

屬性 類型 定義
ULTRASONICS_SENSOR_POSITION 靜態 {<x>, <y>, <z>}

以毫米為單位,每個值代表感應器在相關聯軸上的位置,相對於 AAOS 感應器座標架構。

ULTRASONICS_SENSOR_ORIENTATION 靜態 {<qw>, <qx>, <qy>, <qz>}

這是感應器相對於 AAOS 感應器座標架構的四元數旋轉: $$w+xi+yj+zk$$

ULTRASONICS_SENSOR_FIELD_OF_VIEW 靜態 {<horizontal>, <vertical>}

感應器的水平和垂直視野 (以度為單位)。

ULTRASONICS_SENSOR_DETECTION_RANGE 靜態 {<minimum>, <maximum>}

感應器的偵測範圍,以公釐為單位。

ULTRASONICS_SENSOR_DETECTION_RANGES 靜態 {<range_min_1>, <range_max_1>, <range_min_2>, <range_max_2>}

感應器支援的偵測範圍陣列 (以毫米為單位,含頭尾)。

ULTRASONICS_SENSOR_DETECTION_RANGES 連續 {<distance>, <distance_error>}

以毫米為單位,感應器測量的距離和距離誤差。如果只支援範圍,這是偵測到的範圍內最短的距離。