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

Flutter应用存储权限请求异常:跳转设置显示‘无需权限’

问题解决:Flutter permission_handler请求存储权限直接跳设置且显示“No Permission Required”

问题根源

你的问题出在Android 13(API 33)及以上的存储权限机制变更:

  • 原有的READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE权限在Android 13+已被废弃,系统不再要求用户授权这些权限,所以设置页面会显示“No Permission Required”。
  • Permission.storage在Android 13+上会直接返回granted状态,不会弹出授权弹窗,因为该权限已不再对应实际的媒体访问权限。

解决方案

根据你需要访问的存储内容类型,做如下适配:

1. 调整AndroidManifest.xml权限声明

如果是访问媒体文件(图片、视频、音频),替换原有权限为细分媒体权限:

<!-- Android 13+ 访问图片 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<!-- Android 13+ 访问视频 -->
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<!-- Android 13+ 访问音频 -->
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

<!-- 兼容Android 12及以下版本 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

如果是访问非媒体文件(如文档、下载目录的非媒体文件),需要申请MANAGE_EXTERNAL_STORAGE权限(注意:该权限需要用户手动跳转到设置开启,且Google Play审核严格,仅适用于特定场景):

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

2. 修改Dart代码中的权限请求逻辑

替换Permission.storage为对应场景的权限,并兼容低版本:

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:device_info_plus/device_info_plus.dart'; // 需要添加device_info_plus依赖

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            PermissionStatus status;
            final androidInfo = await DeviceInfoPlugin().androidInfo;
            if (androidInfo.version.sdkInt >= 33) {
              // Android 13+ 请求图片权限,根据需求替换为videos/audio
              status = await Permission.photos.request();
            } else {
              // Android 12及以下 请求存储权限
              status = await Permission.storage.request();
            }

            if (status == PermissionStatus.granted) {
              print("权限已授予");
            } else if (status == PermissionStatus.denied) {
              print("权限被拒绝");
            } else if (status == PermissionStatus.permanentlyDenied) {
              openAppSettings();
            }
          },
          child: Text('申请权限'),
        ),
      ),
    );
  }
}

3. 补充依赖

如果使用device_info_plus,需要在pubspec.yaml中添加:

dependencies:
  device_info_plus: ^9.1.1

验证步骤

  1. 执行flutter clean和flutter pub get
  2. 重新运行应用,点击按钮即可看到对应的媒体权限授权弹窗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 19:46:15