【问题标题】:Android mkdirs() return false on Android 11 with Environment.getExternalStorageDirectory()Android mkdirs() 在 Android 11 上使用 Environment.getExternalStorageDirectory() 返回 false
【发布时间】:2021-07-02 08:48:48
【问题描述】:

Mkdirs() 函数在 Android 11 上不起作用。在 Android 10 及更低版本上一切正常。

代码:

***String path =Environment.getExternalStorageDirectory().getAbsolutePath() + "/My_directory/";
    File temp_file = new File(path);
    if (!temp_file.exists()){
        Boolean can_create= temp_file.mkdir();
    }***

以上代码在 Android 10 或更低版本的情况下返回 true。但在 Android 11 的情况下返回 false。 清单权限:

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

注意运行时权限被认为是相同的(READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE)。

清单应用程序:

    <application
    android:requestLegacyExternalStorage="true"

我能够在外部存储中写入的唯一方法是使用getExternalFilesDir(),但这不是根目录。

根据developer这个网站,我们不能再在根目录下创建文件夹了!

检查this后到目前为止的问题:

1- 是否确认在 Android 11 中我们不能在根目录上创建任何文件夹?有什么解决办法吗?

2-如果是,将数据保存在外部存储中的方法是什么,不包括getExternalFilesDir()

3- 为什么android:requestLegacyExternalStorage="true" 不起作用?

【问题讨论】:

标签: android storage android-sdcard mkdirs


【解决方案1】:

为什么android:requestLegacyExternalStorage="true" 不起作用?

android:requestLegacyExternalStorage 不再适用于 Android 11+。它只是 Android 10 上的一个帮手,让开发人员在迁移到范围存储之前有更多时间。在作用域存储上,您需要使用 URI 来创建、重命名、移动文件等。因此 java.io.File 现在几乎没用了。

确定在 Android 11 中我们不能在根目录上创建任何文件夹吗?有什么解决办法吗?

没有解决办法。

顺便说一句,为了降低范围存储的复杂性,我创建了一个名为 Simple Storage 的库。它适用于各种 API 级别。

【讨论】:

  • 您能否指出一个文档,其中他们说将来将删除对 j​​ava.io.File 的支持并且强制使用 URI?据我了解,谷歌尝试了这个,但它反弹了,现在他们将继续为文件 API 提供支持。这就是在 Android 11 中的原因,您甚至不需要标志来请求对 Java API 的支持。
  • @Roadblock 以后不会被移除,但是它的局限性让它几乎没用。你可以阅读这篇文章:commonsware.com/blog/2019/06/07/…
【解决方案2】:

***字符串路径=Environment.getExternalStorageDirectory().getAbsolutePath() + "/My_directory/";

您无法在 Android 11 设备的外部存储根目录中创建目录。

改为在外部存储的公共目录之一中创建您自己的目录。

File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "My_directory");

【讨论】:

  • 不需要使用公共目录,已经提到 getExternalFilesDir() 是有效的。
  • 有趣不知道这个,保存了。如果我真的遇到它,至少我将来会花更少的时间来调试它
猜你喜欢
  • 2015-12-22
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 2012-08-25
  • 2020-05-21
  • 1970-01-01
  • 2023-03-29
  • 2011-07-24
相关资源
最近更新 更多