You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安卓开发:CameraX无法识别USB UVC摄像头,如何解决?

解决CameraX无法识别USB摄像头的问题

以下是针对你的问题的具体解决步骤:

  • 确认CameraX依赖版本
    CameraX对USB摄像头(UVC设备)的支持依赖较新版本,确保你的build.gradle中使用至少1.2.0及以上的CameraX库,同时引入camera2扩展:

    dependencies {
      def camerax_version = "1.3.0"
      implementation "androidx.camera:camera-core:$camerax_version"
      implementation "androidx.camera:camera-camera2:$camerax_version"
      implementation "androidx.camera:camera-lifecycle:$camerax_version"
      implementation "androidx.camera:camera-view:$camerax_version"
    }
    
  • 申请并处理USB权限
    除常规的CAMERA权限,还需获取USB设备访问权限:

    1. 在AndroidManifest.xml中添加权限声明:
      <uses-permission android:name="android.permission.CAMERA" />
      <uses-permission android:name="android.permission.USB_PERMISSION" />
      <uses-feature android:name="android.hardware.usb.host" />
      
    2. 动态请求USB权限,获取目标UsbDevice后发起权限申请:
      val usbManager = getSystemService(Context.USB_SERVICE) as UsbManager
      val targetDevice: UsbDevice = // 从UsbManager枚举到的USB摄像头设备
      val permissionIntent = PendingIntent.getBroadcast(this, 0, Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_IMMUTABLE)
      usbManager.requestPermission(targetDevice, permissionIntent)
      
    3. 通过BroadcastReceiver接收权限结果,只有获取权限后,CameraX才可能识别该设备。
  • 主动枚举并绑定USB摄像头
    部分场景下CameraX不会自动枚举USB摄像头,可手动遍历可用设备并绑定:

    val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    cameraProviderFuture.addListener({
      val cameraProvider = cameraProviderFuture.get()
      // 遍历所有可用摄像头信息
      for (cameraInfo in cameraProvider.availableCameraInfos) {
        val characteristics = cameraInfo.cameraCharacteristics
        // 判断是否为外部USB摄像头
        val isExternalCamera = characteristics.get(CameraCharacteristics.EXTERNAL_CAMERA) == true
                                || characteristics.get(CameraCharacteristics.LENS_FACING) == null
        if (isExternalCamera) {
          // 绑定预览功能
          val preview = Preview.Builder().build().also {
            it.setSurfaceProvider(previewView.surfaceProvider)
          }
          try {
            cameraProvider.unbindAll()
            cameraProvider.bindToLifecycle(this as LifecycleOwner, CameraSelector.fromCameraInfo(cameraInfo), preview)
          } catch (e: Exception) {
            // 处理绑定异常
          }
        }
      }
    }, ContextCompat.getMainExecutor(this))
    
  • 检查设备Camera2支持级别
    USB摄像头需要设备支持至少Camera2的LEGACY级别,可通过以下代码验证:

    val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager
    for (cameraId in cameraManager.cameraIdList) {
      val characteristics = cameraManager.getCameraCharacteristics(cameraId)
      val supportLevel = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)
      if (supportLevel != null && supportLevel >= CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) {
        // 设备支持符合要求的Camera2级别
      }
    }
    

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:40:25