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 cambio, para:
- 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
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 android.permission.SYSTEM_CAMERA
además de android.permission.CAMERA
para conectarse a este dispositivo de cámara.
CarEVSManager y CarEVSService
Para el acceso a la API, las apps de Java deben usar el archivo android.hardware.camera2.CameraManager
estándar en lugar de CarEVSManager
.
En el caso de la cámara de vista trasera, la lógica en CarEVSService
que supervisa la propiedad GEAR_SELECTION
del VHAL y lanza una actividad debe migrarse a una app propiedad del OEM. Esta app debe cumplir con los siguientes requisitos:
- Supervisa la propiedad
GEAR_SELECTION
del VHAL. - Inicia 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.
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 podrían ocultar la vista previa, recomendamos seguir estos lineamientos cuando implementes la funcionalidad de la cámara de vista posterior con Camera2:
Marca la cámara de vista posterior como una cámara del sistema.
Ejecuta el servicio o la app que accede a la cámara como
User 0
con el permisoCAMERA_HEADLESS_SYSTEM_USER
.Agrega la app a la lista de entidades permitidas de privacidad 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 cámara emulada de Camera2, hardware/google/camera/devices/EmulatedCamera/
, que se mejorará para 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.
Acceso anticipado a la cámara
El acceso a la cámara de EVS se limitó a los clientes privilegiados con el UID de AID_AUTOMOTIVE_EVS
. Para el acceso a la cámara antes de que se complete el proceso de arranque de Android, siempre que el UID siga siendo AID_AUTOMOTIVE_EVS
. Sin embargo, el acceso anticipado a la cámara se limita a las cámaras del sistema ubicadas en el exterior del vehículo.
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 por el sensor y el error de distancia. Si solo se admite un rango, esta es la distancia mínima en el rango detectado. |