Flutter中Permission Handler多权限请求触发PlatformException异常问题求助
解决权限请求冲突的PlatformException问题
我一眼就看出问题所在了——你的代码里重复发起了权限请求操作,这正是系统抛出那个异常的核心原因。
问题分析
在_listenForPermission方法中,你分别对相机和存储权限的状态做了独立的switch判断:
- 如果相机权限是
denied,你调用一次requestForPermission(这个方法里同时请求相机+存储权限) - 紧接着如果存储权限也是
denied,你又调用了一次requestForPermission
这就导致第一次权限请求还在系统处理中,第二次请求又发起了,而Android系统不允许同时运行多个权限请求任务,所以直接抛出了A request for permissions is already running的异常。
解决方案
我们需要把权限请求合并成一次操作,只在需要的时候发起一次请求。下面是修改后的完整核心代码:
1. 优化权限请求方法
使用requestMultiple一次性请求多个权限,这也是permission_handler库推荐的多权限请求方式:
Future<void> requestForPermission() async { // 一次性批量请求相机和存储权限 Map<Permission, PermissionStatus> statuses = await [ Permission.camera, Permission.storage, ].request(); setState(() { cameraPermissionStatus = statuses[Permission.camera] ?? PermissionStatus.denied; storagePermissionStatus = statuses[Permission.storage] ?? PermissionStatus.denied; }); }
2. 修改权限检查逻辑
只在任意一个权限需要请求时,发起一次请求,彻底避免重复调用:
void _listenForPermission() async { final cameraStatus = await Permission.camera.status; final storageStatus = await Permission.storage.status; setState(() { cameraPermissionStatus = cameraStatus; storagePermissionStatus = storageStatus; }); // 判断是否有至少一个权限需要申请 bool shouldRequestPermissions = cameraStatus == PermissionStatus.denied || storageStatus == PermissionStatus.denied; if (shouldRequestPermissions) { await requestForPermission(); } else { // 统一处理其他权限状态(永久拒绝、受限等) bool hasPermanentDenial = cameraStatus == PermissionStatus.permanentlyDenied || storageStatus == PermissionStatus.permanentlyDenied; bool hasRestriction = cameraStatus == PermissionStatus.restricted || storageStatus == PermissionStatus.restricted; if (hasPermanentDenial || hasRestriction) { Navigator.pop(context); // 可选:如果是永久拒绝,这里可以引导用户打开应用设置页 // await openAppSettings(); } } }
为什么这样能解决问题?
- 现在只会发起一次权限请求,同时申请相机和存储权限,完全符合系统的权限请求规则
- 彻底避免了两次调用
requestForPermission导致的请求冲突 - 批量请求的方式更简洁,也能减少用户的弹窗交互次数
这样修改后,你的应用就不会再抛出那个PlatformException了,权限请求流程也能正常完成。
内容的提问来源于stack exchange,提问作者hamza hasan
相关产品推荐
相关产品推荐

