刚刚在 AndrioidManifest.xml
中测试了您上面的设置:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
android:requestLegacyExternalStorage="true"
在授予了这些权限并在运行API 30(R)的模拟器上,我能够使用以下简单代码编写/读取/更新文本文件:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
val f = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "new_file.txt")
f.appendText("test ${Instant.now().toEpochMilli()}\n")
f.readLines().forEach { line -> Log.e("LOG", line)}
}
}
这篇文章
https://dev59.com/lr3pa4cB1Zd3GeqPgYye#64192581表明,如果您创建了文件,则可以使用File api访问它。注意:
Environment.getExternalStoragePublicDirectory
已被弃用,但似乎即使在Android 11上,如果您是文件的所有者,则仍然可以使用该方法。
只是为了好玩,我在目标和编译版本29/30之间交换,看看是否会因为针对不同的SDK并在同一模拟器上重新安装相同的应用程序而出现问题。结果很好,我可以完全访问相同的文件。
如果我说实话,整个过程有点混乱 - CommonsWare的这篇文章
https://commonsware.com/blog/2019/12/21/scoped-storage-stories-storing-mediastore.html是一篇不错的阅读材料,因为它涉及到Android 11中现在强制执行的许多内容,尽管它大多谈论的是Android 10。
文档似乎分散在许多不同的地方,涉及存储/作用域存储等部分。这个链接指向一个表格,为根据初始用例筛选文档提供了很好的起点:
https://developer.android.com/training/data-storage
我还附上了文件管理器中文件出现的截图:
PS: 这里是一些糟糕的丢弃代码 - 输入/输出工作在主线程等等,仅供说明目的。
根据评论“R != 30”。我的“R”用法和Api“30”基于AndroidStudio IDE中的这个:
(R = 运行环境,Api 30 = 运行时的sdk)
如果我有误解或在某些方面不符合语义要求,请随时进行编辑。