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.xmlAdicione 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.