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ê:

    • Identifique 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

Esta seção descreve as mudanças nas 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 conectado a esse dispositivo de câmera.

Câmera traseira

EVS

O EVS ativava o acesso à câmera antes da inicialização do Android, um evento essencial para recursos como câmeras traseiras. Os OEMs de veículos são responsáveis pela conformidade e certificação com os regulamentos fornecidos no Padrão Federal de Segurança para Veículos Motorizados (FMVSS, na sigla em inglês), nº 111, Visibilidade Traseira. Além disso, os OEMs de veículos precisam obedecer a outras regulamentações de câmeras traseiras.

A conformidade depende do hardware, da implementação da HAL e da integração geral do sistema. Depois de uma inicialização do Android na plataforma de referência, o EVS geralmente precisa de quatro a seis segundos para ficar operacional e conceder acesso à câmera.

Camera2

Um cliente privilegiado, identificado pelo AID_AUTOMOTIVE_EVS UID, pode usar as APIs Camera2 para acessar a câmera antes da conclusão do processo de inicialização do Android. Esse acesso antecipado é limitado a câmeras do sistema na parte externa do veículo. O Camera2 atende aos mesmos KPIs de performance para acesso antecipado à câmera que o EVS, que normalmente fica disponível de quatro a seis segundos após a inicialização do Android.

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

  1. Designar a câmera traseira como uma câmera do sistema para restringir o acesso de apps de terceiros.

  2. Execute o serviço ou app que acessa a câmera como User 0 para usar a permissão CAMERA_HEADLESS_SYSTEM_USER. Isso garante o streaming ininterrupto da câmera, mesmo que o usuário mude para outro app em primeiro plano.

  3. Adicione o app à Lista de permissões de privacidade da câmera para conceder acesso à câmera mesmo quando a opção de privacidade da câmera controlada pelo usuário estiver ativada.

CarEVSManager e CarEVSService

O CarEVSManager fornecia aos apps Java acesso à câmera. A transição para o Camera2 substitui esse recurso por standard android.hardware.camera2.CameraManager.

Planejamos descontinuar o CarEVSService, um serviço opcional que monitora a propriedade GEAR_SELECTION VHAL e era usado para iniciar uma atividade de câmera traseira especificada pelo OEM. Os OEMs que usam esse recurso precisam transferir a lógica associada para um app de propriedade do OEM.

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

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/, em que planejamos 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.

APIs ultrassônicas

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.