Flutter应用因未使用Media Store API被谷歌拒包 如何正确保存文件到下载目录
解决方案
1. 调整AndroidManifest权限配置
你当前申请的绝大多数存储权限都不符合Google Play政策要求,直接删除以下权限:
READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGEACCESS_MEDIA_LOCATIONMANAGE_EXTERNAL_STORAGE
仅保留网络权限即可,同时在application标签中添加兼容属性适配低版本系统:
<uses-permission android:name="android.permission.INTERNET" /> <application android:requestLegacyExternalStorage="true" ... 其余原有配置不变 > ... </application> minSdkVersion 19 targetSdkVersion 31
2. 替换存储逻辑,改用MediaStore API
Android 10(API 29)开始实施分区存储规则,直接访问硬编码存储路径、申请全量存储权限的实现方式都会被Google驳回,你可以通过适配MediaStore规则实现无权限存储文件到Downloads目录。
以下是修改后的代码示例,无需申请任何存储相关权限即可正常保存文件:
import 'package:path_provider/path_provider.dart'; import 'package:media_store/media_store.dart'; import 'package:device_info_plus/device_info_plus.dart'; Future<bool> savePdfFile(dynamic bytes) async { try { if (Platform.isAndroid) { final androidInfo = await DeviceInfoPlugin().androidInfo; if (androidInfo.version.sdkInt >= 29) { // Android 10及以上使用MediaStore存储 final result = await MediaStore.saveFile( bytes, name: "sample.pdf", directoryType: DirectoryType.downloads, ); return result != null; } else { // Android 9及以下使用公共下载目录 final dir = await getExternalStoragePublicDirectory(DirectoryDownloads); if (dir == null) return false; final saveFile = File("${dir.path}/sample.pdf"); await saveFile.writeAsBytes(bytes); return true; } } // 其余平台逻辑可自行补充 return false; } catch (e) { return false; } }
如果你不想引入第三方包,也可以自行通过Flutter平台通道调用Android原生的MediaStore插入逻辑实现相同效果。
3. 验证标准
调整完成后按以下标准验证即可满足Google Play政策要求:
- 卸载原有测试应用后重新安装,无需授权任何存储权限即可正常保存PDF到Downloads目录
- 保存的文件可以在系统自带的「下载」应用、文件管理器中正常查看打开
- 应用无额外非必要权限申请
内容的提问来源于stack exchange,提问作者Zain SMJ
相关产品推荐
相关产品推荐

