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

Android 13(Pixel 7)上FilePicker缺失权限问题求助

Android 13调用FilePicker权限拒绝异常解决方案

问题背景

此前版本Android运行无异常,但在Android 13(Pixel 7设备)上调用FilePicker时抛出以下异常:

PlatformException (PlatformException(read_external_storage_denied, User did not allow reading external storage, null, null))

调用代码:

final result = await FilePicker.platform.pickFiles(
                                type: Platform.isAndroid
                                    ? FileType.any
                                    : FileType.custom,
                                allowedExtensions: Platform.isAndroid
                                    ? null
                                    : ['bin', 'nano']);

已在app/src/main/AndroidManifest.xml中添加<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>权限,但问题未解决。

可行解决方案

1. 适配Android 13的权限细分机制

Android 13(API 33)将原有的READ_EXTERNAL_STORAGE拆分为媒体类型专属权限,若targetSdkVersion设为33或更高,需要在AndroidManifest.xml中添加新权限并兼容旧版本:

<!-- 仅对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.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

2. 动态申请权限

即使Manifest声明了权限,仍需在代码中主动申请。可以用permission_handler包处理:

  • 先添加依赖到pubspec.yaml:
dependencies:
  permission_handler: ^10.2.0 # 建议使用最新稳定版
  • 在调用FilePicker前检查并申请权限:
import 'package:permission_handler/permission_handler.dart';

Future<bool> checkAndRequestPermissions() async {
  if (Platform.isAndroid) {
    // 检查现有权限状态
    if (await Permission.photos.isGranted && 
        await Permission.videos.isGranted && 
        await Permission.audio.isGranted) {
      return true;
    }
    // 批量申请权限
    final statuses = await [
      Permission.photos,
      Permission.videos,
      Permission.audio,
    ].request();
    // 判断是否全部授权
    return statuses[Permission.photos]!.isGranted && 
           statuses[Permission.videos]!.isGranted && 
           statuses[Permission.audio]!.isGranted;
  }
  return true;
}

// 调用FilePicker前先确认权限
final hasPermission = await checkAndRequestPermissions();
if (hasPermission) {
  final result = await FilePicker.platform.pickFiles(
    type: Platform.isAndroid ? FileType.any : FileType.custom,
    allowedExtensions: Platform.isAndroid ? null : ['bin', 'nano']);
} else {
  // 处理用户拒绝权限的逻辑,比如提示开启权限
}

3. 更新FilePicker到最新版本

旧版本的file_picker可能未适配Android 13的权限规则,更新依赖到最新稳定版:

dependencies:
  file_picker: ^5.0.0 # 请替换为当前最新版

4. 非媒体文件的特殊处理

如果选择的是非媒体文件(如.bin、.nano),Android 13不需要额外存储权限,系统文件选择器会自动处理文件访问,确保调用FileType.any或对应自定义类型时参数正确即可。

内容的提问来源于stack exchange,提问作者Stéphane de Luca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:57:58