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

Flutter应用Android API30+因存储权限被拒,如何调整实现PDF读写合规?

合规适配修改方案

1. AndroidManifest配置调整

移除全文件访问权限和 legacy 存储适配标记,给普通存储权限增加版本限制,修改后配置如下:

<uses-permission android:name="android.permission.INTERNET"/>
<!-- 仅Android 13以下需要读存储权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- 仅Android 10以下需要写存储权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
<!-- 移除MANAGE_EXTERNAL_STORAGE权限和android:requestLegacyExternalStorage属性 -->

2. 权限申请逻辑修改

删除全文件权限申请逻辑,仅针对低版本安卓申请必要的读存储权限,修改后代码如下:

Future<void> askPermission() async {
    if (androidInfo != null && Platform.isAndroid) {
      final sdkInt = androidInfo!.version.sdkInt!;
      // Android 13及以上用系统文件选择器无需申请读权限
      if (sdkInt < 33) {
        await Permission.storage.request();
      }
    }
  }

3. PDF选取逻辑保留

现有FilePicker选取PDF的代码无需修改,FilePicker本身调用系统原生文件选择器,用户主动选中的文件会被授予临时访问权限,无需额外存储权限即可正常读取文件内容。

4. 生成PDF保存逻辑适配

如果不需要用户在文件管理器中直接看到生成的PDF,可直接保存到应用专属目录,不需要任何权限:

// 引入path_provider获取应用专属目录
final appDir = await getApplicationDocumentsDirectory();
final savePath = "${appDir.path}/生成的文件名.pdf";
await File(savePath).writeAsBytes(pdf字节数据);

如果需要保存到公共目录让用户可见,调用系统保存文件对话框由用户选择存储位置,无需额外权限:

// 调用FilePicker的保存接口拉起系统保存对话框
String? savePath = await FilePicker.platform.saveFile(
  fileName: "生成的文件名.pdf",
  type: FileType.custom,
  allowedExtensions: ['pdf'],
);
if (savePath != null) {
  await File(savePath).writeAsBytes(pdf字节数据);
}

以上修改完成后即可移除全文件访问权限,所有存储交互都符合安卓分区存储的隐私规范,可正常通过应用商店审核。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:06:03