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
验证步骤
- 执行
flutter clean和flutter pub get - 重新运行应用,点击按钮即可看到对应的媒体权限授权弹窗
内容的提问来源于stack exchange,提问作者Skywalker
相关产品推荐
相关产品推荐

