微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android R – 使用 Scoped 存储 (MediaStore.Downloads) 在下载文件夹中创建一个文本文件

如何解决Android R – 使用 Scoped 存储 (MediaStore.Downloads) 在下载文件夹中创建一个文本文件

我的应用程序需要在下载文件夹中的文本文件中保存一个字符串。目前(目标:API 29 (Q) 我正在使用 FILE API :

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
android:requestLegacyExternalStorage="true"

但是对于 API 30 (R),如果我理解得很好,我必须将其迁移到作用域存储 (MediaStore.Downloads)。

在这里我有点失落。我在下载中找不到显示如何创建文本文件的好的文档或片段。如果有人可以解释或展示如何做到这一点,我会很高兴吗?

解决方法

刚刚在 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://stackoverflow.com/a/64192581/4252352 表明如果您创建了该文件,您将能够使用 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

我还附上了出现在文件管理器中的文件的屏幕截图:

File Manager

PS:这里的代码很糟糕 - 主线程上的 I/O 工作等.. 仅用于说明目的。

基于评论“R != 30”。我对 "R" 和 Api "30" 的使用基于 AndroidStudio IDE 中的这一点:

Andriod versions

(R = 运行时环境,Api 30 = 运行时的 sdk)

如果我误解了某些内容,或者在某些方面在语义上不正确,很高兴进行编辑。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。