A plataforma Android é compatível com o uso de câmeras USB plug-and-play (ou seja, webcams) usando a interface padrão API Android Camera2 e a câmera HAL interface gráfica do usuário. Geralmente, as webcams oferecem suporte Classe de vídeo USB (UVC) e no Linux, a versão padrão Video4Linux (V4L) é usado para controlar câmeras UVC.
Com suporte a webcams, os dispositivos podem ser usados em casos de uso leves, como bate-papo por vídeo e quiosques de fotos. Esse recurso não substitui HALs da câmera em smartphones Android e não foi projetado para dar suporte a tarefas complexas e que exigem alto desempenho e streaming de alta velocidade, RA e controle manual de ISP/sensor/lente.
O processo HAL da câmera USB faz parte do provedor da câmera externa que detecta a disponibilidade do dispositivo USB e enumera os dispositivos de câmera externa de maneira adequada. O processo tem permissões e uma política de SE semelhante à processo HAL da câmera integrada. Apps de terceiros com webcam que se comunicam diretamente com dispositivos USB exigem as mesmas permissões de câmera para acessar a UVC e dispositivos móveis, assim como qualquer app de câmera comum.
Exemplos e origens
Para mais informações sobre como implementar câmeras USB, consulte a câmera externa
implementação de referência do provedor
ExternalCameraProvider
As implementações de sessão e dispositivo de câmera externa estão incluídas no
ExternalCameraDevice
e
ExternalCameraDeviceSession
A partir do nível 28 da API, a API do cliente Java inclui as
EXTERNAL
no nível de hardware.
Implementação
A implementação precisa oferecer suporte à
android.hardware.usb.host
recurso do sistema.
O suporte ao kernel para dispositivos UVC também precisa estar ativado. Para ativar esse recurso,
adicionando o seguinte aos respectivos arquivos defconfig
do kernel.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
Para ativar o provedor externo da câmera na versão do dispositivo correspondente, que adiciona as permissões SELinux necessárias, configuração de câmera externa e dependência do provedor de câmera externo, siga estas etapas:
Adicione o arquivo de configuração e a biblioteca de câmera externa a
device.mk
:+PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service +PRODUCT_COPY_FILES += \ +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
Adicione o nome do provedor da câmera externa ao manifesto da HAL do Treble do dispositivo.
<hal format="aidl"> <name>android.hardware.camera.provider</name> <version>1</version> <interface> <name>ICameraProvider</name> <instance>internal/0</instance> + <instance>external/0</instance> </interface> </hal>
(Opcional) Se o dispositivo for executado no modo de passagem do Treble, atualize o
sepolicy
para quecameraserver
possa acessar a câmera UVC.+# for external camera +allow cameraserver device:dir r_dir_perms; +allow cameraserver video_device:dir r_dir_perms; +allow cameraserver video_device:chr_file rw_file_perms;
Veja um exemplo de external_camera_config.xml
(linhas de direitos autorais omitidas).
<ExternalCamera> <Provider> <ignore> <!-- Internal video devices to be ignored by external camera HAL --> <id>0</id> <!-- No leading/trailing spaces --> <id>1</id> </ignore> </Provider> <!-- See ExternalCameraUtils.cpp for default values of Device configurations below --> <Device> <!-- Max JPEG buffer size in bytes--> <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) --> <!-- Size of v4l2 buffer queue when streaming >= 30fps --> <!-- Larger value: more request can be cached pipeline (less janky) --> <!-- Smaller value: use less memory --> <NumVideoBuffers count="4"/> <!-- Size of v4l2 buffer queue when streaming < 30fps --> <NumStillBuffers count="2"/> <!-- List of maximum fps for various output sizes --> <!-- Any image size smaller than the size listed in Limit row will report fps (as minimum frame duration) up to the fpsBound value. --> <FpsList> <!-- width/height must be increasing, fpsBound must be decreasing--> <Limit width="640" height="480" fpsBound="30.0"/> <Limit width="1280" height="720" fpsBound="15.0"/> <Limit width="1920" height="1080" fpsBound="10.0"/> <!-- image size larger than the last entry will not be supported--> </FpsList> </Device> </ExternalCamera>
Personalização
Você pode aprimorar a câmera do Android por meio de opções gerais de personalização ou para dispositivos específicos.
Personalizações gerais
É possível personalizar o provedor externo da câmera modificando o
external_camera_config.xml
. Especificamente, os clientes podem personalizar
parâmetros a seguir:
- Exclusão de nós de vídeo de câmeras internas
- Limite superior do tamanho da imagem e do frame rate compatíveis
- Número de buffers em trânsito (instabilidade vs. compensação de memória)
Além desses parâmetros, você pode adicionar seus próprios parâmetros ou desenvolver seu suas próprias configurações.
Otimizações específicas para dispositivos
Também é possível melhorar o desempenho adicionando otimizações específicas do dispositivo.
Cópia/escalonamento de buffer e decodificação/codificação de JPEG
Implementações genéricas usam CPU (libyuv/libjpeg), mas é possível substituí-lo por e otimizações específicas do dispositivo.
Formato de saída HAL
As implementações genéricas usam os seguintes formatos de saída:
YUV_420_888
para buffers deIMPLEMENTATION_DEFINED
de vídeoYUV12
para todos os outros buffers deIMPLEMENTATION_DEFINED
Para melhorar o desempenho, você pode substituir formatos de saída por formatos específicos formatos mais eficientes. Também é possível oferecer suporte a outros formatos em um implementação
Validação
Os dispositivos que oferecem suporte a câmeras externas precisam ser aprovados CTS da câmera. O USB externo a webcam deve permanecer conectada ao dispositivo específico durante toda a execução do teste, Caso contrário, alguns casos de teste vão falhar.