1

从 API 29 (Android 10) 开始,引入了Scoped Storage。早些时候,我能够直接创建一个可共享文件并在Flutter中使用它写入:

File f = File("/storage/emulated/0/MyApp/myFile.txt");
await f.writeAsString(contents);

但是现在随着隐私的变化,即使在我授予存储权限之后,在 Android 10 中似乎也无法做到这一点。

根据文件

将任何共享的非媒体文件移动到 Downloads/ 目录的应用程序专用子目录。

我的问题是:

  • 如果可以,我还能在 中创建文件/storage/emulated/0/MyApp/myFile.txt吗?
  • 如果没有,那么我可以/storage/emulated/0/Download/MyApp/myFile.txt直接从 Flutter 中创建一个文件而无需平台代码吗?
  • 如果我需要使用特定于平台的代码,使用文件选择器是 txt 文件的唯一选择吗?

也不想使用android:requestLegacyExternalStorage="true",因为那样我的应用程序将不适用于 Android 11。

4

2 回答 2

2

不幸的是,这似乎还没有在 Flutter 中实现,以解释新的作用域存储更改。GitHub上有一个未解决的问题:https ://github.com/flutter/flutter/issues/35783

于 2021-01-20T13:24:10.217 回答
0

正确的解决方案是使用android:requestLegacyExternalStorage="true". 关于它在 android 11 上不起作用的部分。我认为情况并非如此。只需添加android:requestLegacyExternalStorage="true"到您的AndroidManifest文件中并在build.gradle更改的targetSdkVersion 29同时保留compileSdkVersion 30. 这应该可以正常工作。

于 2021-04-11T17:51:40.943 回答