En esta página, se identifican las diferencias entre el sistema de vista extendida (EVS) y Camera2. También se describe cómo configurar tu implementación de Camera2.
Cómo abrir y cerrar la cámara
EVS
openCamera
combina la apertura del dispositivo y la configuración de una sola transmisión.
Camera2
Para abrir y cerrar un dispositivo con Camera2, haz lo siguiente:
Selecciona uno de los siguientes modos:
Modo exclusivo, usa
CameraManager.openCamera
(Java) oACameraManager_openCamera
en el kit de desarrollo nativo (NDK).Modo compartido, usa
openSharedCamera
oACameraManager_openSharedCamera
. Cuando habilites el uso compartido de la cámara, proporciona una configuración de sesión compartida.
Para configurar transmisiones, crea una sesión de captura con las superficies de salida pertinentes. Por ejemplo, desde un ImageReader o SurfaceView con
CameraDevice.createCaptureSession()
(Java) oACameraDevice_createCaptureSession()
(NDK).Camera2 admite varias transmisiones simultáneas. Crea múltiples transmisiones para fines como la vista previa, la grabación y el procesamiento de imágenes. Las transmisiones funcionan como canalizaciones paralelas que procesan de forma secuencial los fotogramas sin procesar de la cámara.
Para cerrar un dispositivo de cámara, usa
CameraDevice.close()
(Java) oACameraDevice_close()
(NDK).
Considera estos fragmentos de código de muestra:
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);
Transmite datos de la cámara
En esta sección, se describe cómo transmitir datos de la cámara.
EVS
En EVS, para:
- Inicia la transmisión. Usa
startVideoStream
. - Detener la transmisión, usar
stopVideoStream
Camera2
En Camera2, haz lo siguiente:
Crea un
CaptureRequest
adecuado para la vista previa, usaTEMPLATE_PREVIEW
conCameraDevice.createCaptureRequest()
en Java oACameraDevice_createCaptureRequest()
en el NDK.Envía la solicitud de transmisión continua con
CameraCaptureSession.setSingleRepeatingRequest
(Java) oACameraCaptureSession_setRepeatingRequestV2
(NDK).Detén la transmisión con
CameraCaptureSession.stopRepeating
(Java) oACameraCaptureSession_stopRepeating
(NDK).
Administración de búferes
En EVS,
setMaxFramesInFlight
controlaba anteriormente el recuento de búferes, que se podía cambiar durante la transmisión. Cuando se inició la transmisión de la cámara, el EVS proporcionó un ID de búfer para cada fotograma de imagen, que se correlacionaba con la misma dirección de búfer de hardware en la memoria.En Camera2, la cantidad máxima de imágenes para un
AImageReader
oImageReader
se establece conAImageReader_new
oImageReader.newInstance
cuando se inicializa una sesión. No se puede alterar de forma dinámica una vez que se inicia la sesión. Para obtener un ID de búfer para cada fotograma, los clientes pueden mantener un mapa que correlacione la dirección del búfer de hardware, obtenida del objetoImage
, con un identificador único.
Cómo pausar y reanudar la transmisión
El EVS usó
pauseVideoStream
yresumeVideoStream
.Camera2 no tiene equivalentes directos. En su lugar, usa lo siguiente:
- Pausar, usar
stopRepeating
- Reanudar, usar
setSingleRepeatingRequest
- Pausar, usar
Parámetros de la cámara
El EVS usó métodos, como
setIntParameter
, para cambiar el parámetro de solicitud de captura de la cámara.En Camera2, para modificar parámetros, llama a la API de set para el compilador
CaptureRequest
y, luego, envíala.
Considera estas muestras de código:
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);
Cámaras lógicas
EVS: En el caso de las cámaras lógicas, como la vista envolvente, el EVS Manager abrió todas las cámaras físicas asociadas, inició las transmisiones de video y proporcionó un conjunto coherente de imágenes.
Camera2: Cuando se necesita una funcionalidad similar con Camera2, las apps deben administrar las cámaras lógicas, lo que requiere que hagas lo siguiente:
- Identifica las cámaras secundarias físicas asociadas a una cámara lógica.
- Abre cada cámara física necesaria.
- Inicia transmisiones en cada cámara.
- Sincroniza los fotogramas, si es necesario. De manera óptima, esto se controla en el HAL para la sincronización a nivel del hardware.
Proporcionaremos una biblioteca de compatibilidad (capa de simulación) a los clientes existentes de EVS para facilitar la transición. El objetivo es admitir las APIs de Camera2 con la menor cantidad de cambios en el código.
Permisos
En esta sección, se describen los cambios en los permisos.
EVS
El acceso está restringido a identificadores únicos (UID) privilegiados. Por ejemplo, AID_AUTOMOTIVE_EVS
. Los permisos obsoletos incluyen android.car.permission.USE_CAR_EVS_CAMERA
.
Camera2
Camera2 requiere android.permission.CAMERA
. En casos especiales, haz lo siguiente:
android.permission.SYSTEM_CAMERA
: Para acceder a las cámaras ocultas de las apps de terceros También requiere el permisoCAMERA
. Para obtener más información, consulta Cámaras del sistema.android.permission.CAMERA_HEADLESS_SYSTEM_USER
: Permite el acceso desdeUser 0
, lo que es fundamental para servicios como las cámaras de vista trasera que deben ejecutarse en todos los cambios de usuario. Requiere un permiso de CAMERA otorgado previamente.android.permission.CAMERA_PRIVACY_ALLOWLIST
: Permite que los OEM eximan ciertas apps críticas para la seguridad del botón de activación de privacidad de la cámara controlado por el usuario.
Las apps de cámara que son fundamentales para la seguridad deben cumplir con las políticas integradas previas a la concesión de Google que se proporcionan en Diseño para la conducción.
Clientes principales y secundarios
Para compartir el acceso a la cámara, sigue estos pasos:
El EVS ofrecía APIs explícitas,
setPrimaryClient
yforcePrimaryClient
, para administrar el cliente principal, que tenía la autoridad para modificar parámetros.En Camera2, cuando la cámara se abre en modo compartido (Android 16 y versiones posteriores), la prioridad del cliente que accede a la cámara determina el cliente principal. El cliente con la prioridad más alta (por lo general, la app en primer plano) puede modificar los parámetros de la solicitud de captura. No se usan APIs directas para forzar el estado principal. El framework administra el estado principal.
Cámaras del sistema
Para restringir el acceso a un dispositivo de cámara solo a las apps del sistema o de 1P, declara la capacidad ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA
en el HAL de la cámara para ese dispositivo. Los clientes deben tener el objeto android.permission.SYSTEM_CAMERA
, además de android.permission.CAMERA
, conectado a este dispositivo de cámara.
Cámara trasera
EVS
Anteriormente, el EVS habilitaba el acceso a la cámara antes del inicio de Android, un evento crítico para funciones como las cámaras de vista trasera. Los OEM de vehículos son responsables del cumplimiento y la certificación de las reglamentaciones que se proporcionan en el Estándar Federal de Seguridad para Vehículos Motorizados (FMVSS) núm. 111, Visibilidad Trasera. Además, los OEM de vehículos deben cumplir con otras reglamentaciones sobre cámaras de visión trasera.
El cumplimiento depende del hardware, la implementación de HAL y la integración general del sistema. Después de un inicio de Android de la plataforma de referencia, el EVS suele tardar entre cuatro y seis segundos en estar operativo y otorgar acceso a la cámara.
Camera2
Un cliente privilegiado, identificado por AID_AUTOMOTIVE_EVS UID
, puede usar las APIs de Camera2 para acceder a la cámara antes de que se complete el proceso de inicio de Android. Este acceso anticipado se limita a las cámaras del sistema ubicadas en el exterior del vehículo. Camera2 cumple con los mismos KPI de rendimiento para el acceso anticipado a la cámara que EVS, que suele estar disponible entre cuatro y seis segundos después del inicio de Android.
Para que la cámara de vista posterior se muestre de forma coherente y sin obstrucciones, en especial durante las transiciones del usuario o cuando otras apps puedan ocultar la vista previa, recomendamos seguir estos lineamientos cuando implementes la cámara de vista posterior con Camera2:
Designa la cámara de vista posterior como una cámara del sistema para restringir el acceso de apps de terceros.
Ejecuta el servicio o la app que accede a la cámara como
User 0
para usar el permiso CAMERA_HEADLESS_SYSTEM_USER. Esto garantiza la transmisión ininterrumpida de la cámara, independientemente del cambio de usuario en primer plano.Agrega la app a la lista de entidades permitidas de privacidad de la cámara para otorgar acceso a la cámara incluso cuando el botón de activación de privacidad de la cámara controlado por el usuario esté habilitado.
CarEVSManager y CarEVSService
Anteriormente, CarEVSManager proporcionaba a las apps de Java acceso a la cámara. La transición a Camera2 reemplaza esta función con standard android.hardware.camera2.CameraManager
.
Tenemos previsto retirar CarEVSService
, un servicio opcional que supervisa la propiedad GEAR_SELECTION VHAL
y se usa para iniciar una actividad de cámara retrovisora especificada por el OEM. Los OEMs que usan esta función deben migrar la lógica asociada a una app propiedad del OEM.
- Supervisa la propiedad
GEAR_SELECTION VHAL
. - Iniciar la actividad de la cámara de vista posterior cuando se activa la marcha atrás
- Usa las APIs de Camera2 para mostrar el feed de la cámara.
Renderización de la pantalla
Servicio de pantalla EVS y pantalla automotriz
Estas opciones dejaron de estar disponibles.
Camera2
Usa los métodos de renderización estándar de Android con Surface, android.hardware.display.DisplayManager
y android.view.Display
.
En situaciones en las que se necesita una visualización temprana de la cámara, el ImageReader de Camera2 puede proporcionar acceso directo al búfer de hardware para que puedas integrarlo con las implementaciones de visualización existentes basadas en DRM para la renderización.
Este acceso anticipado a la cámara se permite exclusivamente para los clientes privilegiados que tienen el AID_AUTOMOTIVE_EVS_UID
y se limita a las cámaras del sistema ubicadas en el exterior de un vehículo.
HAL del emulador (HAL simulado de EVS)
Tenemos previsto desaprobar EVS Mock HAL. En su lugar, los OEM deben usar la HAL de la cámara emulada de Camera2, hardware/google/camera/devices/EmulatedCamera/
, en la que planeamos admitir lo siguiente:
- Cantidad de cámaras configurable
- Patrones de prueba de barras de color
- Emulación de archivos de video
Para incluir este HAL en la compilación, haz lo siguiente:
# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal
También se requieren políticas de Security-Enhanced Linux (SELinux) adecuadas para permitir que cameraserver
interactúe con el servicio HAL de la cámara emulada.
HAL de cámara UVC de V4L2
Tenemos previsto desaprobar EVS V4L2 HAL. Usar la compatibilidad con cámaras externas de Camera2 para cámaras USB (UVC) Para obtener más información, consulta Cámaras USB externas.
APIs de ultrasonido
Tenemos previsto desaprobar las APIs de EVS Ultrasonics. En su lugar, usa estas propiedades de VHAL introducidas en Android 15 para las detecciones de sensores ultrasónicos.
Propiedad | Tipo | Definición |
---|---|---|
ULTRASONICS_SENSOR_POSITION |
Estático | {<x>, <y>, <z>}
En milímetros, cada valor representa la posición del sensor a lo largo del eje asociado en relación con el marco de coordenadas del sensor de AAOS. |
ULTRASONICS_SENSOR_ORIENTATION |
Estático | {<qw>, <qx>, <qy>, <qz>}
Es la rotación del sensor en cuaternión en relación con el sistema de coordenadas del sensor de AAOS: $$w+xi+yj+zk$$ |
ULTRASONICS_SENSOR_FIELD_OF_VIEW |
Estático | {<horizontal>, <vertical>}
En grados, el campo visual horizontal y vertical del sensor. |
ULTRASONICS_SENSOR_DETECTION_RANGE |
Estático | {<minimum>, <maximum>}
Es el rango de detección del sensor en milímetros. |
ULTRASONICS_SENSOR_DETECTION_RANGES |
Estático | {<range_min_1>, <range_max_1>, <range_min_2>,
<range_max_2>}
Es un array de los rangos de detección admitidos del sensor, incluidos, en milímetros. |
ULTRASONICS_SENSOR_DETECTION_RANGES |
Continuo | {<distance>, <distance_error>}
En milímetros, la distancia medida y el error de distancia del sensor. Si solo se admite un rango, esta es la distancia mínima en el rango detectado. |