Android相册保存权限问题求助(permission_handler:^11.3.0)
解决方案:Android端相册权限请求报错“No permissions found in manifest for: []10”
问题根源
报错里的[]10对应permission_handler中的Permission.photosAddOnly常量,但这个权限是iOS专属的,Android平台没有对应的权限定义,你在Android 13+设备上调用这个权限请求,自然会触发Manifest权限缺失的错误。同时你的权限配置也不符合Android不同版本的权限规则。
步骤1:修正AndroidManifest.xml权限配置
删除冗余权限,按Android版本适配所需权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 保留网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- Android 13+(SDK33+)相册读取权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" android:minSdkVersion="33"/> <!-- Android 12及以下存储权限,仅在对应版本生效 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/> <!-- 移除不需要的MANAGE_EXTERNAL_STORAGE权限,保存相册无需此权限 --> <application android:label="vizox_app" android:name="${applicationName}" android:icon="@mipmap/ic_launcher"> <!-- Main Activity --> <activity android:name=".MainActivity" android:exported="true" android:requestLegacyExternalStorage="true" android:theme="@style/LaunchTheme" android:enableOnBackInvokedCallback="true" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> <meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <meta-data android:name="flutterEmbedding" android:value="2" /> </application> <queries> <intent> <action android:name="android.intent.action.PROCESS_TEXT"/> <data android:mimeType="text/plain"/> </intent> </queries> </manifest>
步骤2:修正Dart权限请求代码
替换Android平台错误的权限常量,使用Android支持的权限:
import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; // 原device_info已废弃,推荐用device_info_plus import 'package:permission_handler/permission_handler.dart'; class PermissionService { // 检查并请求相册/存储权限 static Future<bool> permissionPhotoOrStorage() async { bool perm = false; if (Platform.isIOS) { perm = await permissionPhotosIOS(); } else if (Platform.isAndroid) { final AndroidDeviceInfo android = await DeviceInfoPlugin().androidInfo; final int sdkInt = android.version.sdkInt ?? 0; perm = sdkInt >= 33 ? await permissionPhotosAndroid() : await permissionStorage(); } return perm; } // iOS专属相册权限请求(使用photosAddOnly) static Future<bool> permissionPhotosIOS() async { final status = await Permission.photosAddOnly.status; if (status.isGranted) return true; final result = await Permission.photosAddOnly.request(); return result.isGranted; } // Android 13+相册权限请求(使用photos对应READ_MEDIA_IMAGES) static Future<bool> permissionPhotosAndroid() async { final status = await Permission.photos.status; if (status.isGranted) return true; final result = await Permission.photos.request(); return result.isGranted; } // Android 12及以下存储权限请求 static Future<bool> permissionStorage() async { final status = await Permission.storage.status; if (status.isGranted) return true; final result = await Permission.storage.request(); return result.isGranted; } }
注意:更新pubspec.yaml依赖,替换废弃插件:
dependencies: device_info_plus: ^9.1.0 permission_handler: ^11.3.0
步骤3:清理项目并重新编译
- 执行
flutter clean清理项目缓存 - 卸载设备上的旧版本应用
- 重新运行
flutter run编译安装
额外说明
Android 10+(SDK29+)保存图片到公共相册,使用MediaStore API无需申请存储权限,如果你只是保存图片而非读取相册,可以考虑直接跳过权限请求,简化逻辑。
内容的提问来源于stack exchange,提问作者Bear
相关产品推荐
相关产品推荐

