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

Flutter中解决「No permissions found in manifest for: []9」权限错误

权限问题导致Flutter应用无法访问相册并上传Firebase

我的Flutter应用原本能正常将文件上传到Firebase,但昨天开始无法显示文件。调用Permission.photos.request()时出现日志错误:No permissions found in manifest for: []9,控制台提示「Grant Permissions and try again」。相关上传代码和AndroidManifest.xml配置如下,求解决这个权限问题。

上传代码

uploadImage() async {
  final storage = FirebaseStorage.instance;
  final picker = ImagePicker();
  PickedFile? image;

  //Check Permissions
  await Permission.photos.request();

  var permissionStatus = await Permission.photos.status;

  if (permissionStatus.isGranted) {
    //Select Image
    image = await picker.getImage(source: ImageSource.gallery);

    var file = File(image!.path);

    final fileName = basename(file.path);
    final destination = 'user/$emaila/identitas/$fileName';

    if (image != null) {
      //Upload to Firebase
      var snapshot = await storage
          .ref()
          .child(destination)
          .putFile(file)
          .whenComplete(() => null);

      var downloadUrl = await snapshot.ref.getDownloadURL();

      setState(() {
        imageUrlidentitas = downloadUrl;
      });
    } else {
      print('No Path Received');
    }
  } else {
    print('Grant Permissions and try again');
  }
}

AndroidManifest.xml配置

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.rekammedis">


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

    <!-- Permissions options for the `storage` group -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

    <!-- Permissions options for the `camera` group -->
    <uses-permission android:name="android.permission.CAMERA"/>


   <application
        android:label="rekammedis"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <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>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>

问题原因与修复方案

这个错误是因为Android 13+的权限模型变更,permission_handler库中的Permission.photos常量在高版本系统已失效,得针对不同Android版本适配对应权限。

1. 替换过时的权限请求逻辑

把Permission.photos换成版本适配的权限:

  • Android 13及以上:用Permission.images
  • Android 12及以下:用Permission.storage(对应READ_EXTERNAL_STORAGE)

修改后的权限检查代码:

// 适配Android版本的权限请求
Permission permission;
if (Platform.isAndroid) {
  final androidInfo = await DeviceInfoPlugin().androidInfo;
  if (androidInfo.version.sdkInt >= 33) {
    permission = Permission.images;
  } else {
    permission = Permission.storage;
  }
} else {
  permission = Permission.photos;
}

await permission.request();
var permissionStatus = await permission.status;

2. 优化Manifest权限配置

你的Manifest里已经加了READ_MEDIA_IMAGES(Android13+)和READ_EXTERNAL_STORAGE(低版本),但可以移除冗余的WRITE_EXTERNAL_STORAGE(Android13+读取媒体文件不需要这个权限),同时给READ_EXTERNAL_STORAGE加上maxSdkVersion="32",避免高版本系统重复申请:

修改后的权限声明部分:

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

<!-- Android 12及以下存储权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
<!-- Android 13+媒体图片权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

<!-- 相机权限(如果需要保留) -->
<uses-permission android:name="android.permission.CAMERA"/>

3. 完整修改后的上传代码

import 'dart:io';
import 'package:path/path.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:device_info_plus/device_info_plus.dart';

uploadImage() async {
  final storage = FirebaseStorage.instance;
  final picker = ImagePicker();
  PickedFile? image;

  // 适配不同Android版本的权限请求
  Permission permission;
  if (Platform.isAndroid) {
    final androidInfo = await DeviceInfoPlugin().androidInfo;
    if (androidInfo.version.sdkInt >= 33) {
      permission = Permission.images;
    } else {
      permission = Permission.storage;
    }
  } else {
    permission = Permission.photos;
  }

  await permission.request();
  var permissionStatus = await permission.status;

  if (permissionStatus.isGranted) {
    // 选择图片
    image = await picker.getImage(source: ImageSource.gallery);

    if (image != null) {
      var file = File(image.path);
      final fileName = basename(file.path);
      final destination = 'user/$emaila/identitas/$fileName';

      // 上传到Firebase
      var snapshot = await storage
          .ref()
          .child(destination)
          .putFile(file)
          .whenComplete(() => null);

      var downloadUrl = await snapshot.ref.getDownloadURL();

      setState(() {
        imageUrlidentitas = downloadUrl;
      });
    } else {
      print('未获取到图片路径');
    }
  } else {
    print('请授予权限后重试');
  }
}

4. 额外注意事项

  • 确保permission_handler库版本≥10.0.0,避免版本兼容问题
  • 测试前卸载旧版本应用,清除缓存后重新安装
  • iOS平台需在Info.plist中添加NSPhotoLibraryUsageDescription,说明权限用途

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:25:13