Migrar para a Camera2

Esta página identifica as diferenças entre o Extended View System (EVS) e o Camera2. Ela também descreve como configurar a implementação do Camera2.

Abrir e fechar a câmera

EVS

openCamera combina a abertura do dispositivo e a configuração de um único stream.

Camera2

Para abrir e fechar um dispositivo com Camera2:

  1. Selecione um destes modos:

  2. Para configurar streams, crie uma sessão de captura com as superfícies de saída relevantes. Por exemplo, de um ImageReader ou SurfaceView com CameraDevice.createCaptureSession() (Java) ou ACameraDevice_createCaptureSession() (NDK).

    A Camera2 é compatível com vários fluxos simultâneos. Crie vários fluxos para fins como visualização, gravação e processamento de imagens. Os fluxos servem como pipelines paralelos, processando sequencialmente frames brutos da câmera.

  3. Para fechar um dispositivo de câmera, use CameraDevice.close() (Java) ou ACameraDevice_close() (NDK).

Considere estes exemplos de snippets de código:

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);

Transmitir dados da câmera

Esta seção descreve como transmitir dados da câmera.

EVS

No EVS, para:

  1. Inicie a transmissão usando startVideoStream.
  2. Para parar o streaming, use stopVideoStream.

Camera2

Na Camera2, faça o seguinte:

  1. Crie um CaptureRequest adequado para visualização usando TEMPLATE_PREVIEW com CameraDevice.createCaptureRequest() em Java ou ACameraDevice_createCaptureRequest() no NDK.

  2. Envie a solicitação de streaming contínuo usando CameraCaptureSession.setSingleRepeatingRequest (Java) ou ACameraCaptureSession_setRepeatingRequestV2 (NDK).

  3. Para interromper o streaming, use CameraCaptureSession.stopRepeating (Java) ou ACameraCaptureSession_stopRepeating (NDK).

Gerenciamento de buffer

  • No EVS, setMaxFramesInFlight controlava a contagem de buffers, que podia ser alterada no meio do fluxo. Quando o streaming de câmera começou, o EVS forneceu um ID de buffer para cada frame de imagem, que se correlacionava ao mesmo endereço de buffer de hardware na memória.

  • No Camera2, o número máximo de imagens para um AImageReader ou ImageReader é definido com AImageReader_new ou ImageReader.newInstance quando uma sessão é inicializada. Não é possível alterar isso dinamicamente depois que a sessão começa. Para receber um ID de buffer de cada frame, os clientes podem manter um mapa que correlaciona o endereço do buffer de hardware, obtido do objeto Image, a um identificador exclusivo.

Pausar e retomar o streaming

Parâmetros da câmera

  • O EVS usou métodos, como setIntParameter, para mudar o parâmetro de solicitação de captura da câmera.

  • Na Camera2, para modificar parâmetros, chame a API set para o builder CaptureRequest e envie.

Considere estes exemplos 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âmeras lógicas

  • EVS: para câmeras lógicas, como a visão geral, o EVS Manager abriu todas as câmeras físicas associadas, iniciou os streams de vídeo e forneceu uma matriz coesa de imagens.

  • Camera2: quando uma funcionalidade semelhante é necessária com o Camera2, os apps precisam gerenciar câmeras lógicas, o que exige que você:

    • Identificar subcâmeras físicas associadas a uma câmera lógica.
    • Abra cada câmera física necessária.
    • Inicie streams em cada câmera.
    • Sincronize os frames, se necessário. O ideal é que isso seja processado na HAL para sincronização no nível do hardware.

Vamos fornecer uma biblioteca de compatibilidade (camada de shim) aos clientes atuais do EVS para facilitar a transição. O objetivo é oferecer suporte às APIs Camera2 com o mínimo de mudanças no código.

Permissões

EVS

O acesso é restrito a identificadores exclusivos privilegiados (UIDs). Por exemplo, AID_AUTOMOTIVE_EVS. As permissões descontinuadas incluem android.car.permission.USE_CAR_EVS_CAMERA.

Camera2

O Camera2 exige android.permission.CAMERA. Para casos especiais:

Os apps de câmera essenciais para a segurança precisam seguir as políticas integradas de pré-concessão do Google fornecidas em Design para direção.

Clientes principais e secundários

Para acesso compartilhado à câmera:

  • O EVS ofereceu APIs explícitas, setPrimaryClient e forcePrimaryClient, para gerenciar o cliente principal, que tinha a autoridade para modificar parâmetros.

  • Na Camera2, quando a câmera é aberta no modo compartilhado (Android 16 e versões mais recentes), a prioridade do cliente que acessa a câmera determina o cliente principal. O cliente de maior prioridade (normalmente o app em primeiro plano) pode modificar os parâmetros da solicitação de captura. Nenhuma API direta é usada para forçar o status primário. O status principal é gerenciado pelo framework.

Câmeras do sistema

Para restringir o acesso a um dispositivo de câmera apenas a apps do sistema ou próprios , declare a capacidade ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA na HAL da câmera para esse dispositivo. Os clientes precisam ter o android.permission.SYSTEM_CAMERA além do android.permission.CAMERA para se conectar a esse dispositivo de câmera.

CarEVSManager e CarEVSService

Para acesso à API, os apps Java precisam usar o android.hardware.camera2.CameraManager padrão em vez de CarEVSManager.

Para a câmera traseira, a lógica em CarEVSService que monitora a propriedade GEAR_SELECTION VHAL e inicia uma atividade precisa ser migrada para um app de propriedade do OEM. Esse app:

  • Monitora a propriedade GEAR_SELECTION da VHAL.
  • Inicia a atividade da câmera traseira quando a marcha à ré é engatada.
  • Usa as APIs Camera2 para mostrar a transmissão da câmera.

Para uma exibição consistente e sem obstruções da câmera traseira, especialmente durante transições do usuário ou quando outros apps podem obscurecer a visualização, recomendamos estas diretrizes ao implementar a funcionalidade da câmera traseira com o Camera2:

Renderização da tela

Serviço de exibição de EVS e de exibição automotiva.

Elas foram descontinuadas.

Camera2

Use os métodos de renderização padrão do Android com Surface, android.hardware.display.DisplayManager e android.view.Display.

Para cenários que precisam de exibição antecipada da câmera, o ImageReader da Camera2 pode fornecer acesso direto ao buffer de hardware para que você possa integrá-lo às implementações de exibição baseadas em DRM atuais para renderização.

Esse acesso antecipado à câmera é permitido exclusivamente para clientes privilegiados que têm o AID_AUTOMOTIVE_EVS_UID e está limitado a câmeras do sistema localizadas na parte externa de um veículo.

HAL do emulador (HAL simulada do EVS)

Planejamos descontinuar a HAL simulada do EVS. Em vez disso, os OEMs precisam usar a HAL da câmera emulada da Camera2, hardware/google/camera/devices/EmulatedCamera/, que será aprimorada para oferecer suporte a:

  • Número configurável de câmeras.
  • Padrões de teste de barra de cores.
  • Emulação de arquivos de vídeo.

Para incluir esse HAL no build:

# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal

Também são necessárias políticas adequadas do Security-Enhanced Linux (SELinux) para permitir que o cameraserver interaja com o serviço HAL da câmera emulada.

HAL da câmera UVC V4L2

Planejamos descontinuar o EVS V4L2 HAL. Use o suporte de câmera externa do Camera2 para câmeras USB (UVC). Para saber mais, consulte Câmeras USB externas.

Acesso antecipado à câmera

O acesso à câmera EVS foi limitado a clientes privilegiados com o UID AID_AUTOMOTIVE_EVS. Para acesso à câmera antes da conclusão do processo de inicialização do Android, desde que o UID permaneça AID_AUTOMOTIVE_EVS. No entanto, o acesso antecipado à câmera é limitado às câmeras do sistema localizadas na parte externa do veículo.

APIs de ultrassom

Planejamos descontinuar as APIs de ultrassom do EVS. Em vez disso, use estas propriedades da VHAL introduzidas no Android 15 para detecções de sensores ultrassônicos.

Propriedade Tipo Definição
ULTRASONICS_SENSOR_POSITION Estático {<x>, <y>, <z>}

Em milímetros, cada valor representa a posição do sensor ao longo do eixo associado em relação ao sistema de coordenadas do sensor AAOS.

ULTRASONICS_SENSOR_ORIENTATION Estático {<qw>, <qx>, <qy>, <qz>}

Que é esta rotação do sensor em quaternário em relação ao sistema de coordenadas do sensor AAOS: $$w+xi+yj+zk$$

ULTRASONICS_SENSOR_FIELD_OF_VIEW Estático {<horizontal>, <vertical>}

Em graus, o campo de visão horizontal e vertical do sensor.

ULTRASONICS_SENSOR_DETECTION_RANGE Estático {<minimum>, <maximum>}

Em milímetros, o alcance de detecção do sensor.

ULTRASONICS_SENSOR_DETECTION_RANGES Estático {<range_min_1>, <range_max_1>, <range_min_2>, <range_max_2>}

Em milímetros, inclusive, uma matriz dos intervalos de detecção compatíveis do sensor.

ULTRASONICS_SENSOR_DETECTION_RANGES Contínuo {<distance>, <distance_error>}

Em milímetros, a distância medida e o erro de distância do sensor. Se apenas um intervalo for compatível, essa será a distância mínima no intervalo detectado.