无法在 Android 10 中创建目录

新手上路,请多包涵

我无法在 android 10 中创建目录。它在 android Oreo 之前的设备上工作。

我尝试了两种创建文件夹的方法。

使用 File.mkdir()

    File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pastebin");
                    if (!f.isFile()) {
                        if (!(f.isDirectory())) {
                               success =  f.mkdir();
                        }

此处,变量 success 始终为 false ,这意味着未创建目录。

使用 Files.createDirectory()

    File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pastebin");
                    if (!f.isFile()) {
                        if (!(f.isDirectory())) {
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                try {
                                    Files.createDirectory(Paths.get(f.getAbsolutePath()));
                                } catch (IOException e) {
                                    e.printStackTrace();
                                    Toast.makeText(getApplicationContext(), R.string.unable_to_download, Toast.LENGTH_LONG).show();
                                }
                            } else {
                                f.mkdir();
                            }
                        }

导致此异常:

 pzy64.pastebinpro W/System.err: java.nio.file.AccessDeniedException: /storage/emulated/0/Pastebin
pzy64.pastebinpro W/System.err:     at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:391)
pzy64.pastebinpro W/System.err:     at java.nio.file.Files.createDirectory(Files.java:674)

我已经实现了运行时权限并且

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

一切就绪。

原文由 pz64_ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

正如 2019 年 3 月首次披露的那样,在 Android 10+ 上,默认情况下您不再可以访问 外部存储可移动存储 上的任意位置。这包括 Environment.getExternalStorageDirectory()Environment 上的其他方法(例如 getExternalStoragePublicDirectory()

对于 Android 10 和 11,您可以将 android:requestLegacyExternalStorage="true" 添加到清单中的 <application> 元素。这会让您选择使用旧存储模型,并且您现有的外部存储代码将起作用。

否则,您的选择是:

  • 使用 Context 上的方法,例如 getExternalFilesDir() ,获取您的应用程序可以写入的外部存储目录。在 Android 4.4+ 上使用这些目录不需要任何权限。但是,当您的应用程序被卸载时,您存储在那里的数据将被删除。

  • 使用存储访问框架,例如 ACTION_OPEN_DOCUMENTACTION_CREATE_DOCUMENT

  • 如果您的内容是媒体,您可以使用 MediaStore 将媒体放置在标准媒体位置。

原文由 CommonsWare 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于 Android 10,您可以添加

android:requestLegacyExternalStorage="true"

清单中的元素。这会让您选择使用旧存储模型,并且您现有的外部存储代码将起作用。不过,此修复不适用于 Android R 及更高版本,因此这只是一个短期修复。

原文由 Sujit Jamdade 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题