针对 Android 11 的应用未强制执行范围存储

问题描述

我正在运行 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 版本的任何例外。

当我的应用声明将使用范围存储时,为什么我能够在新的范围存储限制下创建和访问此文件

解决方法

是的,但我不相信您可以在 Android 11 设备上的外部存储根目录中创建自己的文件夹。但是您可以在外部存储上的所有普通公共目录中。您必须使用 mkdir() 或 mkdirs() 来创建文件夹。

Android 11 不像宣传的那样严格。

Accessing external storage in Android API 29

请参阅答案的第 3 点。