问题描述
从API 29(Android 10)开始,引入了Scoped Storage。早些时候,我能够直接创建一个可共享文件,并在 Flutter 中使用它写入文件:
File f = File("/storage/emulated/0/MyApp/myFile.txt");
await f.writeAsString(contents);
但是对于privacy changes来说,即使我已授予存储权限,在Android 10中似乎也无法做到这一点。
将所有共享的非媒体文件移动到Downloads /目录的应用专用子目录中。
我的问题是:
- 我仍然可以在
/storage/emulated/0/MyApp/myFile.txt
中创建文件吗? - 如果没有,那么我可以直接在Flutter中用
/storage/emulated/0/Download/MyApp/myFile.txt
在没有平台代码的情况下创建文件吗? - 如果我需要使用特定于平台的代码,using file picker是txt文件的唯一选项吗?
我不想也不想使用android:requestLegacyExternalStorage="true"
,因为那样我的应用将无法在Android 11上运行。
解决方法
不幸的是,Flutter 中似乎还没有实现这一点,以解释新的范围存储更改。 GitHub 上有一个未解决的问题:https://github.com/flutter/flutter/issues/35783
,正确的解决方案是使用 Traceback (most recent call last):
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/client.py",line 343,in _run_event
await coro(*args,**kwargs)
File "main.py",line 98,in on_message
users = json.load(f)
File "/usr/lib/python3.8/json/__init__.py",line 293,in load
return loads(fp.read(),File "/usr/lib/python3.8/json/__init__.py",line 357,in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.8/json/decoder.py",line 337,in decode
obj,end = self.raw_decode(s,idx=_w(s,0).end())
File "/usr/lib/python3.8/json/decoder.py",line 355,in raw_decode
raise JSONDecodeError("Expecting value",s,err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
。关于它在 android 11 上不起作用的部分。我认为情况并非如此。只需将 android:requestLegacyExternalStorage="true"
添加到您的 android:requestLegacyExternalStorage="true"
文件中,并在 AndroidManifest
中更改 build.gradle
,同时保留 targetSdkVersion 29
。这应该可以正常工作。