本頁面說明擴展視野系統 (EVS) 和 Camera2 的差異。並說明如何設定 Camera2 實作。
開啟及關閉攝影機
EVS
openCamera
結合了開啟裝置和設定單一串流的作業。
Camera2
如要使用 Camera2 開啟及關閉裝置,請按照下列步驟操作:
選取下列其中一個模式:
專屬模式:使用原生開發套件 (NDK) 中的
CameraManager.openCamera
(Java) 或ACameraManager_openCamera
。共用模式:使用
openSharedCamera
或ACameraManager_openSharedCamera
。啟用攝影機分享功能時,請提供共用工作階段設定。
如要設定串流,請使用相關輸出介面建立擷取工作階段。舉例來說,可從 ImageReader 或 SurfaceView 取得,方法是使用
CameraDevice.createCaptureSession()
(Java) 或ACameraDevice_createCaptureSession()
(NDK)。Camera2 支援同時多個串流。建立多個串流,用於預覽、錄製和圖像處理等用途。串流會做為平行管道,依序處理來自攝影機的原始影格。
如要關閉攝影機裝置,請使用
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 上,請:
- 啟動串流,使用
startVideoStream
。 - 停止串流播放,請使用
stopVideoStream
。
Camera2
在 Camera2 中,如要:
建立適合預覽的
CaptureRequest
,並在 Java 中使用TEMPLATE_PREVIEW
搭配CameraDevice.createCaptureRequest()
,或在 NDK 中使用ACameraDevice_createCaptureRequest()
。提交持續串流要求,請使用
CameraCaptureSession.setSingleRepeatingRequest
(Java) 或ACameraCaptureSession_setRepeatingRequestV2
(NDK)。停止串流,使用
CameraCaptureSession.stopRepeating
(Java) 或ACameraCaptureSession_stopRepeating
(NDK)。
緩衝區管理
在 EVS 中,
setMaxFramesInFlight
先前控制緩衝區計數, 這可能會在串流中途變更。攝影機開始串流時,EVS 會為每個影像畫面提供緩衝區 ID,這與記憶體中的相同硬體緩衝區位址相關。在 Camera2 中,
AImageReader
或ImageReader
的圖片數量上限會在初始化工作階段時,透過AImageReader_new
或ImageReader.newInstance
設定。工作階段開始後,就無法動態變更這項設定。如要取得每個影格的緩衝區 ID,用戶端可以維護對應硬體緩衝區位址 (從Image
物件取得) 與不重複 ID 的對應項。
暫停及繼續串流播放
EVS 使用
pauseVideoStream
和resumeVideoStream
。Camera2 沒有直接對應的項目。請改為:
- 暫停,使用
stopRepeating
- 繼續使用
setSingleRepeatingRequest
- 暫停,使用
攝影機參數
EVS 使用
setIntParameter
等方法變更攝影機擷取要求參數。在 Camera2 中,如要修改參數,請呼叫
CaptureRequest
建構工具的 set API,然後提交。
請參閱下列程式碼範例:
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
。特殊情況:
android.permission.SYSTEM_CAMERA
:存取第三方應用程式隱藏的攝影機。也需要CAMERA
權限。詳情請參閱「系統攝影機」一文。android.permission.CAMERA_HEADLESS_SYSTEM_USER
:允許從User 0
存取,這對後視攝影機等服務至關重要,因為這類服務必須在使用者切換時執行。必須預先授予 CAMERA 權限。android.permission.CAMERA_PRIVACY_ALLOWLIST
:允許原始設備製造商免除特定安全關鍵應用程式的使用者控制相機隱私權切換開關。
安全關鍵攝影機應用程式必須遵守「Design for Driving」提供的 Google 內建預先授權政策。
主要和次要用戶端
如要分享攝影機存取權:
EVS 提供明確的 API (
setPrimaryClient
和forcePrimaryClient
) 來管理主要用戶端,該用戶端有權修改參數。如果以共用模式開啟 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 實作後視攝影機時,遵循下列準則:
以
User 0
執行存取攝影機的服務或應用程式,使用 CAMERA_HEADLESS_SYSTEM_USER 權限。這樣一來,無論使用者是否切換到前景,相機串流都不會中斷。
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.DisplayManager
和 android.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>}
以毫米為單位,感應器測量的距離和距離誤差。如果只支援範圍,這是偵測到的範圍內最短的距離。 |