无法在Android 10中创建目录

pz6*_*64_ 2 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();
                        }
Run Code Online (Sandbox Code Playgroud)

在此,变量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();
                            }
                        }
Run Code Online (Sandbox Code Playgroud)

导致此异常:

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)
Run Code Online (Sandbox Code Playgroud)

我已经实现了运行时权限,

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)

都准备好了

小智 18

对于 Android 10,您可以添加

android:requestLegacyExternalStorage="true"

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


Wow*_* Ot 12

Android 的限制比较多API 30

你只能写在你的app-specific files

 File dir_ = new File(context.getFilesDir(), "YOUR_DIR");
 dir_.mkdirs();
Run Code Online (Sandbox Code Playgroud)

或在您的应用程序的外部存储中Android/data

File dir_ = new File(myContext.getExternalFilesDir("FolderName"),"YOUR_DIR");
Run Code Online (Sandbox Code Playgroud)

更新

这个答案提供了另一个解决方案/sf/answers/4602116221/

更新

另一种方法是授予此权限manifest

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

像这个答案/sf/answers/4687829051/


Com*_*are 6

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

对于Android 10,您可以将其添加android:requestLegacyExternalStorage="true"<application>清单中的元素。这使您可以选择旧式存储模型,并且现有的外部存储代码将起作用。不过,这不适用于Android R及更高版本,因此这只是短期修复。

您的选择是:

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

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

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

  • @Xihuny:您可以使用“ACTION_OPEN_DOCUMENT_TREE”来允许用户选择文档树。从那里,使用“DocumentFile.fromTreeUri()”获取该文档树的“DocumentFile”。然后,您可以在该树中使用您想要的任何名称创建子项(文档和树)。它是否是一个“目录”取决于用户选择什么作为基本文档树——不要求他们在文件系统上选择什么。 (3认同)
  • @Xihuny:欢迎您创建“getExternalFilesDir()”的子目录以及“Context”提供的类似位置。您无法使用文件系统 API 直接从外部或可移动存储的根目录创建子目录。 (2认同)
  • 我不想这样做,因为当用户卸载应用程序时,这些文件将被删除。 (2认同)
  • @Xihuny:然后使用存储访问框架并允许用户选择将用户内容放置在用户设备上的位置。 (2认同)

JP7*_*711 6

这对我有用,我认为它可以在 Android 10 上运行>

ContentResolver resolver = getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/Folder Example");
String path = String.valueOf(resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues));
File folder = new File(path);
boolean isCreada = folder.exists();
if(!isCreada) {
    folder.mkdirs();
}
Run Code Online (Sandbox Code Playgroud)

  • 您不必创建文件夹。当您写入“Uri”时,会自动创建文件夹。 (4认同)
  • 首先,投反对票的不是我。为了回答您的问题,您正在查询一个文件,这在 Android 10&gt; 上是不允许的,除非您请求旧存储。要正确执行此操作,您应该获取“Uri”,如下所示“Uri mUri =solver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);”,然后直接使用该“Uri”,而不是将其传递给“文件” ` 对象。 (2认同)

小智 5

您可以使用公共目录在 Android 11 中保存文件,如下所示:

dir = new File(Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS).getPath()
    + "/foldername");

if (!dir.exists()) {
     dir.mkdir();
     Toast.makeText(getApplicationContext(), "not exist", Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)