Flutter签名APK安装到物理设备无法创建本地文本文件如何解决
问题解决步骤
1. 优先使用应用专属目录(无需申请存储权限)
- Android 6.0及以上的动态权限机制、Android 10引入的分区存储规则是核心诱因:模拟器通常默认授予目标应用存储权限、或者运行的Android版本低于10,才会出现模拟器正常实机异常的情况
- 优先选择Flutter官方推荐的应用专属目录存储文件,无需申请任何存储权限,卸载应用时系统会自动清理对应目录的文件,符合Android权限规范:
- 用
path_provider包获取对应目录:- 安卓内部存储专属目录调用
getApplicationDocumentsDirectory(),不会被其他应用随意访问 - 如果需要用户可见的存储位置,调用
getExternalStorageDirectory()获取应用专属的外置存储目录,同样不需要额外权限
- 安卓内部存储专属目录调用
- 用
- 如果必须要访问公共存储目录(比如下载、文档公共目录),才需要申请存储权限,按下面步骤配置
2. 如需申请存储权限的配置步骤
2.1 原生配置修改
- 修改
android/app/src/main/AndroidManifest.xml文件,在manifest标签下添加对应权限声明:
<!-- 适配Android 13以下版本的存储读写权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_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" /> <!-- 如果你的应用targetSdkVersion >=33且需要管理所有文件,可添加以下权限,注意谷歌应用商店上架需要额外说明使用场景 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
- 如果是targetSdkVersion >=29,且暂时不想适配分区存储,可以临时在
application标签添加属性关闭分区存储(仅兼容到Android 12,Android 13开始强制生效,不推荐长期使用):
android:requestLegacyExternalStorage="true"
2.2 Flutter侧动态申请权限
- 使用
permission_handler包动态申请权限,不要只在清单文件声明:
// 申请存储权限示例代码 Future<bool> requestStoragePermission() async { if (Platform.isAndroid) { final androidInfo = await DeviceInfoPlugin().androidInfo; if (androidInfo.version.sdkInt <= 32) { final status = await Permission.storage.request(); return status.isGranted; } else { // Android 13及以上按需申请对应媒体权限,或者申请管理所有文件权限 final status = await Permission.manageExternalStorage.request(); return status.isGranted; } } return true; }
- 注意:所有需要读写存储的操作,必须先调用上述方法确认权限已授予后再执行,否则会出现写入失败的问题
3. 实机调试验证步骤
- 卸载设备上已经安装的旧版本应用,避免旧权限缓存影响
- 重新打包签名APK安装到实机,首次打开应用触发权限申请弹窗,授予对应权限后再测试文件写入逻辑
- 如果权限申请弹窗不弹出,可手动到系统应用设置-权限管理中找到你的应用,手动开启存储权限后再测试
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

