下图中的官方示例代码存在一个问题,即当从相机 app 切换至后台后,如果相机 app 在后台停留的时间较长,再次进入相机 app 时,就会报错:system/camera-is-restricted Camera functionality is not available because it has been restricted by the operating system, possibly due to a device policy.
。
解决方案
在组件挂载前加上一个isActive条件判断,当前页面是否处于焦点状态,应用程序是否处于活动状态
这个解决方案的工作原理可以从几个方面解释:
- 状态条件控制:
const isActive = isFocused && appState === "active";
{isActive && (
<Camera ... />
)}
isFocused
: 来自useIsFocused
hook,表示当前页面是否处于焦点状态appState === "active"
: 表示应用是否在前台运行- 两个条件的组合确保只有在页面聚焦且应用在前台时才挂载相机组件
- 生命周期管理:
- 当应用切换到后台时,
appState
会变为 "background",导致isActive
为 false - 这会自动卸载 Camera 组件,释放相机资源
- 当重新回到应用时,Camera 组件会重新挂载,重新初始化相机
- 问题原因与解决:
- "camera-is-restricted" 错误通常发生在相机资源未被正确释放的情况下
- 特别是在应用切换到后台时,如果相机组件仍然挂载,可能会导致系统限制相机访问
- 通过在合适的时机卸载和重新挂载相机组件,可以确保相机资源被正确管理
- 工作流程:
应用切换到后台:
appState → "background"
↓
isActive = false
↓
Camera组件卸载
↓
相机资源释放
应用回到前台:
appState → "active"
↓
isActive = true
↓
Camera组件重新挂载
↓
相机重新初始化
这种方案之所以有效,是因为它遵循了操作系统的资源管理策略,在不需要相机时及时释放资源,避免了资源占用冲突导致的限制问题。