На этой странице описаны различия между системой расширенного просмотра (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).
Рассмотрим следующие примеры кода:
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
}
НДК
ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);
Потоковые данные с камер
В этом разделе описывается, как передавать данные с камеры в потоковом режиме.
ЭВС
В системе EVS:
- Для начала потоковой передачи используйте
startVideoStream. - Остановите трансляцию, используя
stopVideoStream.
Камера2
На камере 2:
Создайте запрос
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, а затем отправьте запрос.
Рассмотрим следующие примеры кода:
Java
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 открывал все связанные физические камеры, запускал видеопотоки и предоставлял согласованный набор изображений.
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: Позволяет производителям оборудования исключать определенные критически важные для безопасности приложения из списка приложений, на которые пользователь может настраивать параметры конфиденциальности камеры.
Приложения для камер, критически важные для обеспечения безопасности, должны соответствовать встроенным в Google правилам предварительного одобрения, изложенным в документе Design for Driving .
Первичные и вторичные клиенты
Для общего доступа к камере:
EVS предоставляла отдельные API-интерфейсы,
setPrimaryClientиforcePrimaryClient, для управления основным клиентом, который имел право изменять параметры.В Camera2, когда камера открыта в режиме общего доступа (Android 16 и выше), приоритет клиента, обращающегося к камере, определяет основного клиента. Клиент с наивысшим приоритетом (обычно это приложение на переднем плане) может изменять параметры запроса на захват изображения. Прямые API для принудительного определения основного статуса не используются. Управление основным статусом осуществляется фреймворком.
Системные камеры
Чтобы ограничить доступ к камере только системным или однопользовательским приложениям, объявите возможность ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA в HAL камеры для этого устройства. Клиенты должны иметь разрешение android.permission.SYSTEM_CAMERA в дополнение к android.permission.CAMERA , подключенному к этой камере.
Камера заднего вида
ЭВС
Ранее EVS предоставляла доступ к камере до загрузки Android, что являлось критически важным событием для таких функций, как камеры заднего вида. Производители автомобилей несут ответственность за соответствие и сертификацию требованиям Федерального стандарта безопасности транспортных средств (FMVSS), № 111 «Обзор сзади» . Кроме того, производители автомобилей должны соблюдать и другие требования к камерам заднего вида.
Соответствие требованиям зависит от аппаратного обеспечения, реализации HAL и общей системной интеграции. После загрузки эталонной платформы Android системе EVS обычно требуется от четырех до шести секунд, чтобы начать работу и предоставить доступ к камере.
Камера2
Привилегированный клиент, идентифицированный по AID_AUTOMOTIVE_EVS UID , может использовать API Camera2 для доступа к камере до завершения процесса загрузки Android. Этот ранний доступ ограничен системными камерами, расположенными снаружи автомобиля. Camera2 соответствует тем же показателям производительности для раннего доступа к камере, что и EVS, который обычно становится доступным в течение четырех-шести секунд после загрузки Android.
Для обеспечения стабильного и беспрепятственного отображения изображения с камеры заднего вида, особенно во время смены пользовательских настроек или когда другие приложения могут закрывать предварительный просмотр, мы рекомендуем следующие рекомендации при использовании камеры заднего вида с Camera2:
Назначьте камеру заднего вида системной камерой , чтобы ограничить доступ сторонних приложений.
Запустите службу или приложение, обращающееся к камере, от имени
User 0, используя разрешение CAMERA_HEADLESS_SYSTEM_USER . Это гарантирует непрерывную потоковую передачу с камеры независимо от переключения пользователя на передний план.Добавьте приложение в список разрешенных приложений для обеспечения конфиденциальности камеры , чтобы предоставить доступ к камере даже при включенной функции обеспечения конфиденциальности камеры, управляемой пользователем.
CarEVSManager и CarEVSService
Ранее CarEVSManager предоставлял Java-приложениям доступ к камере. Переход на Camera2 заменяет эту функцию standard android.hardware.camera2.CameraManager .
Мы планируем отказаться от CarEVSService , необязательной службы, которая отслеживает свойство GEAR_SELECTION VHAL и использовалась для запуска заданной производителем активности камеры заднего вида. Производители, использующие эту функцию, должны перенести соответствующую логику в собственное приложение.
- Отслеживайте свойство
GEAR_SELECTION VHAL. - Активация камеры заднего вида начинается при включении задней передачи.
- Используйте API Camera2 для отображения видеопотока с камеры.
Отображение результатов
Услуги по установке и обслуживанию автомобильных дисплеев и дисплеев для электромобилей.
Эти функции устарели.
Камера2
Используйте стандартные методы рендеринга Android с Surface, android.hardware.display.DisplayManager и android.view.Display .
В сценариях, требующих раннего отображения изображения с камеры, Camera2 ImageReader может обеспечить прямой доступ к аппаратному буферу, что позволяет интегрировать его с существующими реализациями отображения на основе DRM для рендеринга.
Этот ранний доступ к камерам предоставляется исключительно привилегированным клиентам, имеющим идентификатор AID_AUTOMOTIVE_EVS_UID , и ограничивается системными камерами, расположенными снаружи автомобиля.
Эмулятор HAL (EVS mock HAL)
Мы планируем отказаться от использования EVS Mock HAL . Вместо этого производителям оборудования следует использовать эмулируемый 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
Для обеспечения взаимодействия cameraserver с эмулируемой службой HAL камеры также необходимы соответствующие политики SELinux (security-enhanced Linux).
V4L2 UVC Камера HAL
Мы планируем отказаться от использования EVS V4L2 HAL . Используйте поддержку внешних камер Camera2 для USB-камер (UVC). Для получения дополнительной информации см. раздел «Внешние USB-камеры» .
Ультразвуковые 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>}В миллиметрах отображается измеренное датчиком расстояние и погрешность измерения. Если поддерживается только диапазон, это минимальное расстояние в пределах обнаруженного диапазона. |