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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:37:34