如何为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
相关产品推荐
相关产品推荐

