The Android platform supports the use of plug-and-play USB cameras (that is, webcams) using the standard Android Camera2 API and the camera HIDL interface. Webcams generally support USB video class (UVC) drivers and on Linux, the standard Video4Linux (V4L) driver is used to control UVC cameras.
Google 在 Android P 上提供了对 usb camera 设备的支持,官方叫法是 External USB Cameras
,提供了完整 HALv3 实现并接入到 CameraProviderManager
;可以让任何三方相机应用轻松调用到外接 USB 摄像头功能,而且使用方法跟内置相机几无差别,都是透过 Android Camera API2
调用。
https://source.android.com/devices/camera/external-usb-cameras
实现
1. 首先确保手机系统支持 USB 主机模式 android.hardware.usb.host
, 一个简单的办法是连接 usb 外设,然后安装运行USBEnumerator 这个 android demo app,看是否能列出连接的设备。
备注
USBEnumerator
获取方式:
Android Studio -> Import an Android code sample -> 搜索 USB -> 编译安装
还必须启用对 UVC 设备的内核支持。您可以通过将以下内容添加到相应的内核 deconfig
文件来启用该支持。
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
-
将外接摄像头配置文件和外接摄像头库添加到
device.mk
。+PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-impl +PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-external-service +PRODUCT_COPY_FILES += \ +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
-
将外接摄像头提供程序名称添加到设备 Treble HAL 清单。
<hal format="hidl"> <name>android.hardware.camera.provider</name> <transport arch="32+64">passthrough</transport> <impl level="generic"></impl> <version>2.4</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> + <instance>external/0</instance> </interface> </hal>
-
(可选)如果设备在 Treble 直通模式下运行,请更新
sepolicy
,以便cameraserver
可以访问 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;
使用外接 usb camera
Camera2Basic demo app