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

Flutter使用permission_handler请求Android存储权限始终被拒如何解决

问题原因

你遇到的问题由两个核心错误导致:

1. Dart代码逻辑错误

你打印的权限状态是发起申请前查询的旧值,不是权限申请后的实际结果:
你先执行await Permission.storage.status拿到初始被拒的状态,发起申请后直接打印了这个旧值,自然始终返回denied。

2. Android版本权限适配错误

日志No android specific permissions needed for: 9里的9对应Permission.storage枚举值,说明你当前运行的设备系统版本是Android 13(API 33+):

  • Android 13及以上版本废弃了READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE权限,Permission.storage申请会被系统直接忽略,需要申请媒体图片权限Permission.photos
  • 如果你配置了MANAGE_EXTERNAL_STORAGE权限,该权限属于特殊权限,无法通过普通的request()方法申请,必须引导用户手动跳转到系统设置页开启

解决步骤

步骤1:修正Dart权限申请代码

区分Android版本申请对应权限,并且取申请后的最新状态判断:

_askPermission() async {
  if (io.Platform.isIOS) {
    var photosStatus = await Permission.photos.status;
    if (photosStatus.isDenied) {
      // 接收申请后的新状态
      final newStatus = await Permission.photos.request();
      print("Photos Permission Status: ${newStatus.toString()}");
    }
  } else {
    Permission? needRequestPermission;
    // 区分Android版本
    if (io.Platform.version >= 13) {
      needRequestPermission = Permission.photos;
    } else {
      needRequestPermission = Permission.storage;
    }
    final status = await needRequestPermission.status;
    if (status.isDenied) {
      final newStatus = await needRequestPermission.request();
      print("Android Permission Status: ${newStatus.toString()}");
      // 如果返回永久拒绝,引导用户去设置页
      if (newStatus.isPermanentlyDenied) {
        await openAppSettings();
      }
    }
  }
}

步骤2:优化AndroidManifest配置

如果你的应用不需要访问所有公共目录,只是用来读取壁纸图片,可以删除MANAGE_EXTERNAL_STORAGE权限配置,调整存储权限声明如下:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"  android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" android:minSdkVersion="33" />
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:requestLegacyExternalStorage="true"
    <!-- 其余配置保持不变 -->
>

步骤3:特殊情况处理

如果你确实需要全文件访问权限(MANAGE_EXTERNAL_STORAGE),需要单独增加跳转逻辑:

// Android 11及以上需要全文件权限时调用
if (await Permission.manageExternalStorage.isDenied) {
  await openAppSettings();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 08:45:08