Flutter Camera切其他相机应用报Function not implemented错误且预览冻结如何解决
问题原因
Android系统相机硬件为独占资源,其他前台应用申请相机权限时,系统会强制回收后台应用持有的相机资源。官方基础教程仅覆盖基础相机调用逻辑,未处理应用生命周期变化时的相机资源释放与重建逻辑,应用退到后台后所持相机资源被系统回收,此时操作已失效的相机实例就会抛出对应的CameraAccessException异常,切回应用后也会出现预览冻结问题。
解决方案
- 在相机页面的State类中混入
WidgetsBindingObserver,监听应用生命周期变化 - 在
initState方法中注册生命周期监听,dispose方法中移除监听 - 重写
didChangeAppLifecycleState方法,按生命周期状态处理相机资源:- 应用进入
paused/inactive后台状态时,主动调用相机控制器的dispose方法释放所有相机相关资源 - 应用回到
resumed前台状态时,重新执行相机初始化流程:检查相机权限、创建新的相机控制器、初始化并启动预览
- 应用进入
- 所有相机操作前增加非空判断,避免操作已释放的控制器实例抛出空指针异常
补充注意事项
- 安卓端请确保模块级build.gradle中的
minSdkVersion不低于21,camera2相关API仅支持Android 5.0及以上系统 - 应用回到前台时建议先检查相机权限是否仍处于授权状态,避免用户后台关闭权限后初始化相机失败
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

