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
相关产品推荐
相关产品推荐

