Migra a Camera2

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:

  1. Selecciona uno de los siguientes modos:

  2. 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) o ACameraDevice_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.

  3. Para cerrar un dispositivo de cámara, usa CameraDevice.close() (Java) o ACameraDevice_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:

  1. Inicia la transmisión. Usa startVideoStream.
  2. Detener la transmisión, usar stopVideoStream

Camera2

En Camera2, haz lo siguiente:

  1. Crea un CaptureRequest adecuado para la vista previa, usa TEMPLATE_PREVIEW con CameraDevice.createCaptureRequest() en Java o ACameraDevice_createCaptureRequest() en el NDK.

  2. Envía la solicitud de transmisión continua con CameraCaptureSession.setSingleRepeatingRequest (Java) o ACameraCaptureSession_setRepeatingRequestV2 (NDK).

  3. Detén la transmisión con CameraCaptureSession.stopRepeating (Java) o ACameraCaptureSession_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 o ImageReader se establece con AImageReader_new o ImageReader.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 objeto Image, con un identificador único.

Cómo pausar y reanudar la transmisión

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:

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 y forcePrimaryClient, 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:

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.