You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Android项目中使用外接USB摄像头(UVC摄像头)

Android外接UVC摄像头快速实现指南

一、优先尝试官方Camera2 API方案

Camera2原生支持外接UVC摄像头,无需额外依赖,按以下步骤操作:

  • 权限配置:在AndroidManifest.xml中添加必要权限:
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.USB_PERMISSION" />
    <uses-feature android:name="android.hardware.camera" />
    
    Android 6.0+需动态申请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作为预览载体,创建CameraCaptureSessionCaptureRequest——直接参考官方Camera2Basic示例,替换成外接摄像头的cameraId即可。

二、用封装库跳过libusb/libuvc编译

如果需要更底层的UVC控制,又没时间编译原生库,直接用现成的封装库:

  • AndroidUSBCamera:已封装libusb和libuvc,gradle直接引入:
    dependencies {
        implementation 'com.github.jiangdongguo:AndroidUSBCamera:2.0.5'
    }
    
    核心使用流程:
    1. 初始化管理器并监听设备状态:
      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) {
              // 处理连接断开逻辑
          }
      })
      
    2. 在生命周期中注册/注销监听:
      override fun onResume() {
          super.onResume()
          usbCameraManager.registerUSB()
      }
      
      override fun onPause() {
          super.onPause()
          usbCameraManager.unregisterUSB()
      }
      
    这个库已经帮你处理了权限、设备枚举、预览渲染等所有细节,不用管.so文件的集成问题。

三、避坑要点

  • 务必处理USB权限:系统会弹出授权对话框,用户拒绝后无法访问摄像头,需提示用户重新授权。
  • 兼容性测试:部分小众品牌的UVC摄像头可能存在兼容性问题,优先用主流品牌设备测试。
  • Android版本限制:Camera2对外接摄像头的完善支持从API 24(Android 7.0)开始,低版本设备建议用封装库。

内容的提问来源于stack exchange,提问作者JIWONKIM

火山引擎 最新活动