【发布时间】:2021-03-30 15:27:45
【问题描述】:
我正在运行 Android 9 的设备上测试我的应用。根据我的 Gradle 文件,该应用现在以 Android 11 为目标:
android {
compileSdkVersion 30
buildToolsVersion '30.0.3'
defaultConfig {
applicationId "com.xxx.yyy.zzz"
minSdkVersion 15
targetSdkVersion 30
versionCode 15455
versionName "4.55"
multiDexEnabled true
}
在运行应用程序之前,我从测试设备中删除了之前的版本。
使用以下代码运行面向 Android 11 的应用时:
try {
File oldDir = new File(Environment.getExternalStorageDirectory(), "MyFolder");
File afile = new File(oldDir, "myFile.boo");
afile.createNewFile();
}
catch(IOException e){}
应用程序创建可访问和可删除的 MyFolder/myFile.boo。
开发者文档明确指出:https://developer.android.com/about/versions/11/privacy
“以 Android 11 或更高版本为目标的应用始终受制于范围存储行为。”文档没有提及特定手机的 android 版本的任何例外情况。
当我的应用声明它将使用范围存储时,为什么我能够在新的范围存储限制下创建和访问此文件?
【问题讨论】:
-
The app creates MyFolder/myFile.boohe he createNewFile();不会创建文件夹。 -
MyFolder 之前是由应用程序创建的。尽管如此,我可以在 Environment.getExternalStorageDirectory() 中创建一个新文件夹,如下所示: File aFile = new File(Environment.getExternalStorageDirectory(), "your_file_name"); aFile.mkDirs()。现在,“your_file_name”文件夹已创建并且对运行 Android 9 的设备上的其他应用可见,并且该应用针对的是 android 11。
-
当然是在 Android 9 设备上。您的最小 SdkVersion 为 15。其余的 30 无关紧要。我以为你是在 Android 11 设备上看到的。
-
when my app has declared that it will be using scoped storage?你的应用只能跟随设备的可能性。应用程序不能声明它们使用范围存储。范围存储不是额外的功能,而是一种限制。 -
谢谢。如果您修改您的答案,使其包含类似“并且范围存储仅在运行 Android 11 的设备上适用于针对 android 11 或 Android 10 的应用程序且未在应用程序中声明 requestLegacyExternalStorage="true" 并同意这一点,我会接受答案。通常当安卓版本有新的限制时,文档会说“在运行安卓的设备上运行时?等等……”。这条语句的缺失让我陷入了循环。
标签: android file-access scoped-storage