无法在 Android 11 中创建文件夹(目录),如何创建?

Posted

技术标签:

【中文标题】无法在 Android 11 中创建文件夹(目录),如何创建?【英文标题】:Unable to create a folder(directory) in Android 11, how to create it? 【发布时间】:2021-07-27 12:52:48 【问题描述】:

我无法使用 java 在我的 android 11 设备中创建文件夹。我用了这段代码

 File file = new File(Environment.getExternalStorageDirectory() + "/folderName/folderName1");
        if (!file.mkdirs()) 
            file.mkdirs();
        
String filePath = file.getAbsolutePath() + File.separator + "demoName";
        Log.i("filePath",filePath.toString());

上述日志语句的输出是/storage/emulated/0/folderName/folderName1/demoName,但是当我检查我的手机时,并没有创建这样的文件夹。

只是为了确认我已经研究并确实包含了我需要包含在清单文件中的所有内容。

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

我也放了

 android:requestLegacyExternalStorage="true"

在应用程序标签内的正确位置。

这就是我从链接下载 PDF 的方法。

 File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) + "/Aide Memoire");

    public  void DownloadBooks(String url,String title)

        DownloadManager.Request request=new DownloadManager.Request(Uri.parse(url));
        String tempTitle=title.trim();
        request.setTitle(tempTitle);
        if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.HONEYCOMB)
            request.allowScanningByMediaScanner();
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        
        String filePath = file.getAbsolutePath();
        Log.i("filePath",filePath.toString());
        request.setDestinationInExternalPublicDir(filePath,tempTitle+".pdf");
        Toast.makeText(this, "Saved to " + filePath , Toast.LENGTH_SHORT).show();
        DownloadManager downloadManager=(DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
        request.setMimeType("application/pdf");
        request.allowScanningByMediaScanner();
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
        downloadManager.enqueue(request);
    
DownloadBooks("a link"," a name for the file");

运行上述内容后,我得到一个错误,logcat 说

java.lang.IllegalStateException: Not one of standard directories: 

现在,如何在 Android 11 的 Internal Storage 中创建自定义文件夹而不出错?

【问题讨论】:

请求旧版外部存储仅适用于 Android 10 设备。 request.setDestinationInExternalPublicDir(filePath,tempTitle+".pdf") 不要乱用 File 类路径。 request.setDestinationInExternalPublicDir(Environment.DIRECTORY.DOCUMENTS,tempTitle+".pdf"). request.setDestinationInExternalPublicDir(Environment.DIRECTORY.DOCUMENTS, "Aide Memoire/" +tempTitle+".pdf") 那么,这是否表明文件(主要是文档)只能下载到 DOCUMENTS 文件夹中,而不能下载到 DOCUMENTS 文件夹内的嵌套文件夹中? 你为什么要问?你没看到我也用了“Aide Memoires”吗?你没有尝试所有吗?如果它有效,你为什么不报告? 【参考方案1】:

这就是所谓的外部存储,正如您在该函数名称上看到的那样。

但在 Android 11 设备上,您无法在外部存储的根目录上创建自己的子目录。

而是在已经存在的公共目录之一上执行此操作,例如 Documents、DCIM、Pictures 等

【讨论】:

我使用了File file = new File(Environment.DIRECTORY_ALARMS + "/folderName/folderName1"); 而不是Environment.getExternalStorageDirectory(),但它没有在公共目录ALARMS 中创建文件夹。怎么办? 当然不是没有有效路径。您可以通过检查 file.getAbsolutePath() 轻松看到。和 file.exists()。 File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS), "folderName/folderName1"); 请注意,Android 11 对文件扩展名非常挑剔。例如,您不能在警报公共目录中创建扩展名为 .pdf 的文件。 .mp3 是可能的。 您的代码确实在文件夹中创建了一个新目录,并考虑了您的建议,对于 PDF 的,我选择了文档文件夹,但是当我下载文件时出现错误,这是 logcat 所说的 java.lang.IllegalStateException: Not one of standard directories: /storage/emulated/0/Documents/My Custom Folder 并且应用程序崩溃了,因此没有任何内容被存储。**不是**我该如何解决这个问题,以便下载的 pdf 存储在 /storage/emulated/0/Documents/My Custom Folder 在您的帖子中发布您的下载代码。我们怎么知道你在做什么?【参考方案2】:

您是否在运行时检查存储权限? 这是google在android 11中更改的api 30存储访问:

Media store

【讨论】:

是的,我有,但它没有好处。

以上是关于无法在 Android 11 中创建文件夹(目录),如何创建?的主要内容,如果未能解决你的问题,请参考以下文章

未在 Xamarin 应用程序 (Android) 中创建目录

无法在 Android Studio 中创建模拟器

无法在 Android 7.0 中创建文件夹

无法在 Android Studio 4.0 中创建 Dart 项目

在 Android 应用程序目录中创建文件夹列表

无法使用 PCLStorage 或 Xamarin Forms Labs 在 Android 文件系统中创建文件夹/文件