Android 安卓R–;使用作用域存储(MediaStore.Downloads)在下载文件夹中创建文本文件

Android 安卓R–;使用作用域存储(MediaStore.Downloads)在下载文件夹中创建文本文件,android,mediastore,scoped-storage,Android,Mediastore,Scoped Storage,我的应用程序需要在下载文件夹的文本文件中保存一个字符串。目前(目标:API 29(Q)我正在使用文件API,其内容包括: <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> androi

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

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

android:requestLegacyExternalStorage=“true”
但对于API30(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访问它。注意:
环境。getExternalStoragePublicDirectory
已被弃用,但如果您是该文件的所有者,它似乎甚至可以在安卓11上运行

只是为了好玩,我在目标和编译版本29/30之间进行了切换,看看当针对不同的sdk并在同一个模拟器上重新安装同一个应用程序时,是否会发生任何问题。效果很好,不管怎样,我都可以完全访问同一个文件

老实说,整个事情有点混乱——这篇由Commonware撰写的文章是一篇很好的阅读,因为它涉及到许多现在在Android 11中强制实施的东西,尽管它主要谈论的是Android 10

在许多不同的地方,文档似乎与与存储/作用域存储等相关的部分分开。此表链接为根据初始用例筛选文档提供了良好的基础:

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

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

基于注释“R!=30”。我对“R”和Api“30”的使用基于AndroidStudio IDE中的以下内容:

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


如果我误解了某些内容,或者在某种程度上语义不正确,我很乐意进行编辑。

刚刚在
AndrioidManifest.xml中使用上述设置进行了测试:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
android:requestLegacyExternalStorage="true"
这篇文章:建议如果您创建了该文件,您将能够使用文件api访问它。注意:
环境。getExternalStoragePublicDirectory
已被弃用,但如果您是该文件的所有者,它似乎甚至可以在安卓11上运行

只是为了好玩,我在目标和编译版本29/30之间进行了切换,看看当针对不同的sdk并在同一个模拟器上重新安装同一个应用程序时,是否会发生任何问题。效果很好,不管怎样,我都可以完全访问同一个文件

老实说,整个事情有点混乱——这篇由Commonware撰写的文章是一篇很好的阅读,因为它涉及到许多现在在Android 11中强制实施的东西,尽管它主要谈论的是Android 10

在许多不同的地方,文档似乎与与存储/作用域存储等相关的部分分开。此表链接为根据初始用例筛选文档提供了良好的基础:

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

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

基于注释“R!=30”。我对“R”和Api“30”的使用基于AndroidStudio IDE中的以下内容:

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


如果我误解了某些内容,或者在某种程度上语义不正确,我很乐意进行编辑。

只要先在下载文件夹中创建您自己的目录,然后将文件写入目录。所有操作都是以旧方式进行的。谢谢,我将尝试此解决方案,但我仍然有点困惑。您的意思是,如果我在/storage/emulated/Download directl中写入y、 它将失败?是否应该从我的应用程序以编程方式创建目录?我可以使用标准java lib创建目录吗?同时,您将尝试所有方法,因此请报告。只需先在下载文件夹中创建您自己的目录。然后将您的文件写入您的目录。所有操作都是以旧方式进行的。谢谢,我将尝试此解决方案,但我仍在继续有点困惑。你的意思是,如果我直接在/storage/emulated/Download中写入,它会失败吗?是否应该从我的应用程序中以编程方式创建目录?我可以使用标准java库创建目录吗?同时,你会尝试所有方法,所以请报告。R!=30。R的行为更像29。有29、R和30。android:requestLegacyExternalStorage=“true”仅适用于29,对Android 11设备没有影响。当然,在Android 11
Android:requestLegacyExternalStorage=“true”中
自动为假-在我的回答中,我在api 29和30之间交换,因此它被包括在内,并且是从OP的设置中直接获得的。不确定R!=30是什么意思-每当我创建一个虚拟设备时,它都会清楚地说明这一点?不,它不是假的。它没有效果。R!=30意味着R不等于30。有,我重复在:29、R和30。谢谢大家,我明天会玩这个。在Android 11上运行但针对Android 10的范围存储强制应用程序(API级别29)仍然可以请求requestLegacyExternalStorage属性。此标志允许应用暂时退出与作用域存储相关的更改,例如授予对不同目录和不同类型媒体文件的访问权限。将应用更新为目标Android 11后,系统将忽略requestLegacyExternalStorage标志。R=30.R的行为更像29。有29、R和30。android:requestLegacyExternalStorage=“true”只适用于29,对android 11设备没有影响。当然,在android 11
android:requestLegacyExternalStorage=“true”
中,android:requestLegacyExternalStorage=“true”自动为假-在我的回答中,我在api 29和30之间切换,因此它被包括在内,