本頁面說明擴展視野系統 (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.SYSTEM_CAMERA
。android.permission.CAMERA
CarEVSManager 和 CarEVSService
如要存取 API,Java 應用程式應使用標準 android.hardware.camera2.CameraManager
,而非 CarEVSManager
。
如果是後視攝影機,CarEVSService
中監控 GEAR_SELECTION
VHAL 屬性並啟動活動的邏輯必須遷移至 OEM 擁有的應用程式。這個應用程式:
- 監控
GEAR_SELECTION
VHAL 屬性。 - 在倒車時啟動後視攝影機活動。
- 使用 Camera2 API 顯示相機畫面。
為確保後視攝影機畫面顯示一致且不受阻礙,特別是在使用者轉換畫面或有其他應用程式可能會遮住預覽畫面時,建議您使用 Camera2 實作後視攝影機功能時,遵循下列指南:
將後視攝影機標示為系統攝影機。
以
User 0
權限執行存取相機的服務或應用程式。CAMERA_HEADLESS_SYSTEM_USER
將應用程式加入攝影機隱私權許可清單。
顯示轉譯
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 攝影機」。
搶先使用相機
EVS 攝影機存取權僅限於具有 AID_AUTOMOTIVE_EVS
UID 的特權用戶端。在 Android 開機程序完成前存取攝影機,但前提是 UID 仍為 AID_AUTOMOTIVE_EVS
。不過,搶先存取攝影機功能僅限於車輛外部的系統攝影機。
超音波 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>}
以毫米為單位,感應器測量的距離和距離誤差。如果只支援範圍,這是偵測到的範圍內最短的距離。 |