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

如何为Android无障碍服务集成外接USB摄像头

Android无障碍服务USB摄像头帧获取解决方案

一、Camera2 API 外接USB摄像头适配

  • 权限要求:除CAMERA权限外,需申请FOREGROUND_SERVICE(Android 9+),USB设备权限需动态请求。Android 12+还需在服务中声明android:foregroundServiceType="camera"。
  • 枚举外接摄像头:通过CameraManager遍历摄像头ID,筛选LENS_FACING_EXTERNAL类型的设备:
val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager
cameraManager.cameraIdList.forEach { id ->
    val characteristics = cameraManager.getCameraCharacteristics(id)
    val lensFacing = characteristics.get(CameraCharacteristics.LENS_FACING)
    if (lensFacing == CameraCharacteristics.LENS_FACING_EXTERNAL) {
        try {
            cameraManager.openCamera(id, object : CameraDevice.StateCallback() {
                override fun onOpened(camera: CameraDevice) {
                    // 创建预览会话并获取帧
                    val textureView = TextureView(applicationContext)
                    textureView.surfaceTextureListener = object : TextureView.SurfaceTextureListener {
                        override fun onSurfaceTextureAvailable(surface: SurfaceTexture, width: Int, height: Int) {
                            val previewSurface = Surface(surface)
                            val captureRequest = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
                                .addTarget(previewSurface)
                                .build()
                            camera.createCaptureSession(listOf(previewSurface), object : CameraCaptureSession.StateCallback() {
                                override fun onConfigured(session: CameraCaptureSession) {
                                    session.setRepeatingRequest(captureRequest, null, Handler(Looper.getMainLooper()))
                                }
                                override fun onConfigureFailed(session: CameraCaptureSession) {}
                            }, null)
                        }
                        override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture, width: Int, height: Int) {}
                        override fun onSurfaceTextureDestroyed(surface: SurfaceTexture): Boolean = false
                        override fun onSurfaceTextureUpdated(surface: SurfaceTexture) {}
                    }
                }
                override fun onDisconnected(camera: CameraDevice) {
                    // 摄像头断开时重新尝试连接
                    camera.close()
                    reconnectCamera()
                }
                override fun onError(camera: CameraDevice, error: Int) {
                    camera.close()
                    reconnectCamera()
                }
            }, Handler(Looper.getMainLooper()))
        } catch (e: CameraAccessException) {
            e.printStackTrace()
        }
    }
}
  • 关键注意:无障碍服务属于后台进程,必须启动前台服务才能持续使用摄像头,可在onServiceConnected()中调用startForeground()创建常驻通知。

二、官方文档配置文件说明

官方文档提到的配置文件属于ROM系统级修改,仅适用于定制Android系统的开发者,普通APP无需修改。只要设备硬件支持UVC协议(多数现代Android设备默认支持),直接通过API或第三方库即可访问USB摄像头。

三、UVCCamera项目适配要点

  • 权限检查:确保Manifest中添加<uses-feature android:name="android.hardware.usb.host"/>和必要的CAMERA、WRITE_EXTERNAL_STORAGE权限。
  • USB权限申请:通过UsbManager主动请求目标设备权限,避免权限缺失导致连接失败。
  • 线程适配:UVCCamera的初始化和预览操作需在非主线程执行,可使用HandlerThread避免ANR。
  • 无障碍服务生命周期绑定:在服务的onServiceConnected()中初始化UVCCamera,onInterrupt()中仅暂停预览而非释放设备,确保摄像头持续运行。

四、摄像头持续开启实现

  • 生命周期监听:在摄像头回调的onDisconnected/onError方法中,添加延迟重连逻辑,避免系统抢占后摄像头关闭。
  • 防杀机制:保持前台服务状态,避免无障碍服务被系统回收;Android 12+需指定foregroundServiceType="camera"增强优先级。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:45:52