java - 无法在 Android 10 中创建目录

标签 java android

我无法在 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"/>

一切都准备好了。

最佳答案

正如 2019 年 3 月首次披露的那样,默认情况下您不再有权访问 external storage 上的任意位置或removable storage在 Android 10+ 上。这包括 Environment.getExternalStorageDirectory()以及 Environment 上的其他方法(例如,getExternalStoragePublicDirectory()

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

否则,您的选择是:

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

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

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

关于java - 无法在 Android 10 中创建目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62363341/

相关文章:

Android:如何为应用程序设置文化值

java - 不同 Java 版本的应用程序在 Tomcat 6 服务器中不工作

java - 如何为多个 ImageView 设置触摸监听器?

java - 在mysql数据库中导入csv

java - 如何从我在 firebase 中加载的最后一个项目加载下一个 "n"项目

android - Android 4.4.+ 上的 db4o : storing an object fails because cannot cast long to integer

java - Google Docs List API PDF 文件下载不工作 (Android)

java - 在 java 上通过模 m 实现的斐波那契数给出除法的负余数

java - 使用 Recycler View 调用 Api 加载更多

java - 在 Android 操作系统销毁 Activity 后,对 Activity 的引用会发生什么情况?