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:
Selecione um destes modos:
Modo exclusivo, use
CameraManager.openCamera
(Java) ouACameraManager_openCamera
no kit de desenvolvimento nativo (NDK).Modo compartilhado: use
openSharedCamera
ouACameraManager_openSharedCamera
. Ao ativar o compartilhamento de câmera, forneça uma configuração de sessão compartilhada.
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) ouACameraDevice_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.
Para fechar um dispositivo de câmera, use
CameraDevice.close()
(Java) ouACameraDevice_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:
- Inicie a transmissão usando
startVideoStream
. - Para parar o streaming, use
stopVideoStream
.
Camera2
Na Camera2, faça o seguinte:
Crie um
CaptureRequest
adequado para visualização usandoTEMPLATE_PREVIEW
comCameraDevice.createCaptureRequest()
em Java ouACameraDevice_createCaptureRequest()
no NDK.Envie a solicitação de streaming contínuo usando
CameraCaptureSession.setSingleRepeatingRequest
(Java) ouACameraCaptureSession_setRepeatingRequestV2
(NDK).Para interromper o streaming, use
CameraCaptureSession.stopRepeating
(Java) ouACameraCaptureSession_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
ouImageReader
é definido comAImageReader_new
ouImageReader.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 objetoImage
, a um identificador exclusivo.
Pausar e retomar o streaming
A EVS usou
pauseVideoStream
eresumeVideoStream
.O Camera2 não tem equivalentes diretos. Em vez disso, para:
- Pausar, use
stopRepeating
- Retomar usando
setSingleRepeatingRequest
- Pausar, use
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:
android.permission.SYSTEM_CAMERA
: para acessar câmeras ocultas de apps de terceiros. Também requer a permissãoCAMERA
. Para saber mais, consulte Câmeras do sistema.android.permission.CAMERA_HEADLESS_SYSTEM_USER
: permite o acesso deUser 0
, crucial para serviços como câmeras de ré que precisam ser executadas em trocas de usuários. Requer uma permissão de câmera concedida previamente.android.permission.CAMERA_PRIVACY_ALLOWLIST
: permite que os OEMs eximam determinados apps essenciais para a segurança da alternância de privacidade da câmera controlada pelo usuário.
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
eforcePrimaryClient
, 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:
Marque a câmera de ré como uma câmera do sistema.
Execute o serviço ou app que acessa a câmera como
User 0
usando a permissãoCAMERA_HEADLESS_SYSTEM_USER
.Adicione o app à lista de permissões de privacidade 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/
,
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. |