На этой странице описаны различия между расширенной системой обзора (EVS) и Camera2. Здесь также описывается, как настроить Camera2.
Откройте и закройте камеру
ЭВС
openCamera
совмещает открытие устройства и настройку единого потока.
Камера2
Чтобы открыть и закрыть устройство с помощью Camera2:
Выберите один из этих режимов:
В эксклюзивном режиме используйте
CameraManager.openCamera
(Java) илиACameraManager_openCamera
в собственном комплекте разработки (NDK).В режиме общего доступа используйте
openSharedCamera
илиACameraManager_openSharedCamera
. При включении общего доступа к камере укажите конфигурацию общего сеанса.
Чтобы настроить потоки, создайте сеанс захвата с соответствующими выходными поверхностями. Например, из ImageReader или SurfaceView с помощью
CameraDevice.createCaptureSession()
(Java) илиACameraDevice_createCaptureSession()
(NDK).Camera2 поддерживает одновременную обработку нескольких потоков . Создавайте несколько потоков для таких целей, как предварительный просмотр, запись и обработка изображений. Потоки служат параллельными конвейерами, последовательно обрабатывая необработанные кадры с камеры.
Чтобы закрыть камеру, используйте
CameraDevice.close()
(Java) илиACameraDevice_close()
(NDK).
Рассмотрим эти примеры фрагментов кода:
Ява
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
}
НДК
ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);
Потоковые данные с камеры
В этом разделе описывается, как передавать потоковые данные с камеры.
ЭВС
На EVS, чтобы:
- Чтобы начать потоковую передачу, используйте
startVideoStream
. - Остановите потоковую передачу, используя
stopVideoStream
.
Камера2
На Camera2, чтобы:
Создайте
CaptureRequest
, подходящий для предварительного просмотра, используйтеTEMPLATE_PREVIEW
сCameraDevice.createCaptureRequest()
в Java илиACameraDevice_createCaptureRequest()
в NDK.Отправьте запрос на непрерывную потоковую передачу, используя
CameraCaptureSession.setSingleRepeatingRequest
(Java) илиACameraCaptureSession_setRepeatingRequestV2
(NDK).Остановите потоковую передачу, используйте
CameraCaptureSession.stopRepeating
(Java) илиACameraCaptureSession_stopRepeating
(NDK).
Управление буфером
В EVS
setMaxFramesInFlight
ранее контролировал количество буферов, которое потенциально могло изменяться во время трансляции. При запуске потоковой передачи с камеры EVS предоставлял идентификатор буфера для каждого кадра изображения, который соответствовал тому же адресу аппаратного буфера в памяти.На камере Camera2 максимальное количество изображений для
AImageReader
илиImageReader
задаётся с помощьюAImageReader_new
илиImageReader.newInstance
при инициализации сеанса. Это значение нельзя динамически изменить после начала сеанса. Чтобы получить идентификатор буфера для каждого кадра, клиенты могут поддерживать карту, которая сопоставляет адрес аппаратного буфера, полученный из объектаImage
, с уникальным идентификатором.
Приостановка и возобновление трансляции
EVS использовал
pauseVideoStream
иresumeVideoStream
.У Camera2 нет прямых аналогов. Вместо этого:
- Пауза, используйте
stopRepeating
- Возобновить, использовать
setSingleRepeatingRequest
- Пауза, используйте
Параметры камеры
EVS использовал методы, такие как
setIntParameter
для изменения параметра запроса захвата камеры.На Camera2 для изменения параметров вызовите API набора для конструктора
CaptureRequest
, а затем отправьте его.
Рассмотрим эти примеры кода:
Ява
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.set(CaptureRequest.CONTROL_EFFECT_MODE, CaptureRequest.CONTROL_EFFECT_MODE_MONO);
// Submit this request
НДК
ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_CONTROL_EFFECT_MODE, 1, &effectMode);
Логические камеры
EVS: Для логических камер, таких как Surround View, EVS Manager открывал все связанные физические камеры, инициировал видеопотоки и предоставлял связный массив изображений.
Camera2: Если необходимы аналогичные функции с Camera2, приложения должны управлять логическими камерами, для чего вам необходимо:
- Определите физические подкамеры, связанные с логической камерой.
- Откройте каждую необходимую физическую камеру.
- Инициировать трансляции на каждой камере.
- При необходимости синхронизируйте кадры. Оптимально, чтобы это было реализовано на уровне HAL для аппаратной синхронизации.
Мы предоставим существующим клиентам EVS библиотеку совместимости (слой-прокладку) для облегчения перехода. Цель — обеспечить поддержку API Camera2 с минимальными изменениями в коде.
Разрешения
ЭВС
Доступ ограничен привилегированными уникальными идентификаторами (UID). Например, AID_AUTOMOTIVE_EVS
. Устаревшие разрешения включают android.car.permission.USE_CAR_EVS_CAMERA
.
Камера2
Для Camera2 требуется android.permission.CAMERA
. Для особых случаев:
android.permission.SYSTEM_CAMERA
: для доступа к камерам, скрытым от сторонних приложений. Также требуется разрешениеCAMERA
. Подробнее см. в разделе «Системные камеры» .android.permission.CAMERA_HEADLESS_SYSTEM_USER
: Разрешает доступUser 0
, что критически важно для таких служб, как камеры заднего вида, которые должны работать через пользовательские коммутаторы. Требуется предварительно предоставленное разрешение CAMERA.android.permission.CAMERA_PRIVACY_ALLOWLIST
: позволяет OEM-производителям исключать определенные критически важные для безопасности приложения из контролируемого пользователем переключения конфиденциальности камеры.
Приложения для камер, критически важные для безопасности, должны соответствовать встроенным политикам Google по предварительному предоставлению лицензий, изложенным в документе Design for Driving .
Первичные и вторичные клиенты
Для общего доступа к камере:
EVS предлагал явные API-интерфейсы
setPrimaryClient
иforcePrimaryClient
для управления основным клиентом, который имел полномочия изменять параметры.Camera2: при открытии камеры в режиме общего доступа (Android 16 и выше) приоритет клиента, обращающегося к камере, определяет основной клиент. Клиент с наивысшим приоритетом (обычно приложение переднего плана) может изменять параметры запроса на захват. Для принудительного переключения в основной статус не используются прямые API. Основной статус управляется фреймворком.
Системные камеры
Чтобы разрешить доступ к камере только системным приложениям или приложениям 1P, объявите разрешение ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA
в HAL-уровне камеры для этого устройства. Для подключения к этой камере у клиентов должно быть разрешение android.permission.SYSTEM_CAMERA
в дополнение к android.permission.CAMERA
.
CarEVSManager и CarEVSService
Для доступа к API приложения Java должны использовать стандартный android.hardware.camera2.CameraManager
вместо CarEVSManager
.
Для камеры заднего вида логика CarEVSService
, которая отслеживает свойство GEAR_SELECTION
VHAL и запускает действие, должна быть перенесена в приложение, принадлежащее OEM-производителю. Это приложение:
- Контролирует свойство
GEAR_SELECTION
VHAL. - Включает камеру заднего вида при включении задней передачи.
- Использует API Camera2 для отображения потока с камеры.
Для обеспечения постоянного и беспрепятственного отображения камеры заднего вида, особенно во время переключения пользователя или когда другие приложения могут загораживать предварительный просмотр, мы рекомендуем следующие рекомендации при реализации функциональности камеры заднего вида с помощью Camera2:
Отметьте камеру заднего вида как системную камеру .
Запустите службу или приложение, обращающееся к камере как
User 0
используя разрешениеCAMERA_HEADLESS_SYSTEM_USER
.Добавьте приложение в список разрешенных приложений для конфиденциальности камеры .
Отображение рендеринга
Обслуживание дисплеев EVS и автомобильных дисплеев.
Они устарели.
Камера2
Используйте стандартные методы рендеринга Android с Surface, android.hardware.display.DisplayManager
и android.view.Display
.
Для сценариев, требующих раннего отображения камеры, Camera2 ImageReader может обеспечить прямой доступ к аппаратному буферу, что позволяет интегрировать его с существующими реализациями отображения на основе DRM для рендеринга.
Такой ранний доступ к камерам разрешен исключительно привилегированным клиентам, имеющим AID_AUTOMOTIVE_EVS_UID
, и ограничен системными камерами, расположенными снаружи транспортного средства.
Эмулятор HAL (EVS mock HAL)
Мы планируем прекратить поддержку EVS Mock HAL . Вместо этого OEM-производителям следует использовать эмулируемый HAL-файл камеры Camera2, 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
взаимодействовать со службой Emulated Camera HAL.
V4L2 UVC-камера HAL
Мы планируем прекратить поддержку EVS V4L2 HAL . Используйте поддержку внешней камеры Camera2 для USB-камер (UVC). Подробнее см. в разделе Внешние USB-камеры .
Ранний доступ к камере
Доступ к камере EVS был ограничен привилегированным клиентам с идентификатором AID_AUTOMOTIVE_EVS
. Доступ к камере до завершения загрузки Android возможен при условии, что идентификатор останется AID_AUTOMOTIVE_EVS
. Однако ранний доступ к камере ограничен системными камерами, расположенными снаружи автомобиля.
Ультразвуковые API
Мы планируем прекратить поддержку API EVS Ultrasonics. Вместо этого используйте свойства VHAL, представленные в Android 15 для обнаружения ультразвуковых датчиков.
Свойство | Тип | Определение |
---|---|---|
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>} Расстояние, измеренное датчиком, и его погрешность (в миллиметрах). Если поддерживается только диапазон, это минимальное расстояние в обнаруженном диапазоне. |