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

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:清理项目并重新编译

  1. 执行flutter clean清理项目缓存
  2. 卸载设备上的旧版本应用
  3. 重新运行flutter run编译安装

额外说明

Android 10+(SDK29+)保存图片到公共相册,使用MediaStore API无需申请存储权限,如果你只是保存图片而非读取相册,可以考虑直接跳过权限请求,简化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:51:04