如何在Android项目中使用外接USB摄像头(UVC摄像头)
Android外接UVC摄像头快速实现指南
一、优先尝试官方Camera2 API方案
Camera2原生支持外接UVC摄像头,无需额外依赖,按以下步骤操作:
- 权限配置:在
AndroidManifest.xml中添加必要权限:
Android 6.0+需动态申请<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.USB_PERMISSION" /> <uses-feature android:name="android.hardware.camera" />CAMERA权限;Android 10+访问USB设备时,系统会自动触发权限弹窗,需处理授权回调。 - 枚举外接摄像头:通过
CameraManager筛选出外接设备,其LENS_FACING属性为LENS_FACING_EXTERNAL:val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager cameraManager.cameraIdList.forEach { cameraId -> val characteristics = cameraManager.getCameraCharacteristics(cameraId) val lensFacing = characteristics.get(CameraCharacteristics.LENS_FACING) if (lensFacing == CameraCharacteristics.LENS_FACING_EXTERNAL) { // 找到目标外接摄像头,启动预览 startCameraPreview(cameraId) return@forEach } } - 预览实现:和普通摄像头预览逻辑一致,用
TextureView作为预览载体,创建CameraCaptureSession和CaptureRequest——直接参考官方Camera2Basic示例,替换成外接摄像头的cameraId即可。
二、用封装库跳过libusb/libuvc编译
如果需要更底层的UVC控制,又没时间编译原生库,直接用现成的封装库:
- AndroidUSBCamera:已封装libusb和libuvc,gradle直接引入:
核心使用流程:dependencies { implementation 'com.github.jiangdongguo:AndroidUSBCamera:2.0.5' }- 初始化管理器并监听设备状态:
val usbCameraManager = USBCameraManager.getInstance(this) usbCameraManager.setOnDevConnectListener(object : USBCameraManager.OnDevConnectListener { override fun onAttachDev(device: UsbDevice) { usbCameraManager.requestPermission(device) } override fun onConnectDev(device: UsbDevice, camera: USBCamera?) { camera?.startPreview(yourTextureView) } override fun onDettachDev(device: UsbDevice) { // 处理设备断开逻辑 } override fun onDisConnectDev(device: UsbDevice) { // 处理连接断开逻辑 } }) - 在生命周期中注册/注销监听:
override fun onResume() { super.onResume() usbCameraManager.registerUSB() } override fun onPause() { super.onPause() usbCameraManager.unregisterUSB() }
- 初始化管理器并监听设备状态:
三、避坑要点
- 务必处理USB权限:系统会弹出授权对话框,用户拒绝后无法访问摄像头,需提示用户重新授权。
- 兼容性测试:部分小众品牌的UVC摄像头可能存在兼容性问题,优先用主流品牌设备测试。
- Android版本限制:Camera2对外接摄像头的完善支持从API 24(Android 7.0)开始,低版本设备建议用封装库。
内容的提问来源于stack exchange,提问作者JIWONKIM




