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

Android平台ERROR_CAMERA_DISABLED错误的解决方法咨询

解决锁屏后触发ERROR_CAMERA_DISABLED的方案

错误码3对应的ERROR_CAMERA_DISABLED,本质是系统在锁屏后限制了后台相机资源的访问,强行持有相机资源会触发该错误。以下是具体解决方法:

  • 监听屏幕状态,主动释放/重建相机资源
    锁屏时系统会优先回收后台非必要资源,此时主动释放相机相关资源,解锁后再重新初始化,是最直接的解决方式:

    1. 结合生命周期监听屏幕状态变化,在锁屏(对应Activity的onPause)时释放资源,解锁(对应onResume)时重建相机:
      class CameraLifecycleObserver(private val cameraManager: CameraManager) : DefaultLifecycleObserver {
          private var cameraDevice: CameraDevice? = null
          private var captureSession: CameraCaptureSession? = null
          private var imageReader: ImageReader? = null
      
          override fun onPause(owner: LifecycleOwner) {
              super.onPause(owner)
              // 释放所有相机相关资源
              captureSession?.close()
              cameraDevice?.close()
              imageReader?.close()
              captureSession = null
              cameraDevice = null
              imageReader = null
          }
      
          override fun onResume(owner: LifecycleOwner) {
              super.onResume(owner)
              // 重新初始化相机流程
              openCamera()
          }
      
          private fun openCamera() {
              // 执行你原本的打开相机、创建CaptureSession、发起setRepeatingRequest的逻辑
          }
      }
      
    2. 在Activity/Fragment中绑定观察者:lifecycle.addObserver(CameraLifecycleObserver(cameraManager))
  • 适配Android版本的相机权限要求

    • Android 12(API 31)及以上,后台持续使用相机需要额外申请android.permission.CAMERA_BACKGROUND权限,且需用户手动授权;如果你的应用不需要后台相机功能,锁屏时释放资源即可,无需申请该权限。
    • 确保Manifest中已声明基础相机权限:
      <uses-permission android:name="android.permission.CAMERA" />
      <!-- Android 12+ 后台相机权限(按需添加) -->
      <uses-permission android:name="android.permission.CAMERA_BACKGROUND" />
      
  • 完善相机资源的回收逻辑
    不要依赖finalize方法(该方法已废弃且不可靠),要在明确的回调节点主动释放资源:

    • 在CameraDevice.StateCallback的onDisconnected和onError回调中统一执行清理:
      override fun onDisconnected(camera: CameraDevice) {
          camera.close()
          cameraDevice = null
          // 标记相机需要重新初始化
      }
      
      override fun onError(camera: CameraDevice, error: Int) {
          camera.close()
          cameraDevice = null
          if (error == CameraDevice.ERROR_CAMERA_DISABLED) {
              // 锁屏触发的错误,无需崩溃处理,等待解锁后重建即可
          }
      }
      
    • 处理ImageReader的图片时,及时调用image.close(),避免资源堆积。
  • 避免后台持续持有相机
    锁屏后应用进入后台,系统会严格限制相机这类敏感资源的使用,强行维持setRepeatingRequest会触发系统的资源限制机制,导致错误。因此锁屏时必须停止重复请求并释放相机。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:29:57