java.lang.IllegalStateException:不是标准目录之一:Android 10 上的 /storage/emulated/0/Download/

Posted

技术标签:

【中文标题】java.lang.IllegalStateException:不是标准目录之一:Android 10 上的 /storage/emulated/0/Download/【英文标题】:java.lang.IllegalStateException: Not one of standard directories: /storage/emulated/0/Download/ on Android 10 【发布时间】:2020-03-09 09:41:18 【问题描述】:

我想从我的 url 下载并将文件保存到 android 10 中的外部存储下载目录。 我已经用这个代码下载了。

    public void StartNewDownload(String url) 

    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
    request.setDescription("Downloading Profile"); 
    request.setTitle("Abc App");
    request.setDestinationInExternalPublicDir(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+ File.separator, "parag.jpeg"); 

    DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
    final long downloadId = manager.enqueue(request); 


显示错误

E/AndroidRuntime: 致命异常: main 进程:com.example.abc,PID:15197

java.lang.IllegalStateException: Not one of standard directories: /storage/emulated/0/Download/
    at android.os.Parcel.createException(Parcel.java:2079)
    at android.os.Parcel.readException(Parcel.java:2039)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
    at android.content.ContentProviderProxy.call(ContentProviderNative.java:658)
    at android.content.ContentProviderClient.call(ContentProviderClient.java:558)
    at android.content.ContentProviderClient.call(ContentProviderClient.java:546)
    at android.app.DownloadManager$Request.setDestinationInExternalPublicDir(DownloadManager.java:569)
    at com.example.abc.Activity.showDetails.StartNewDownload(showDetails.java:102)
    at com.example.abc.Activity.showDetails$1.onClick(showDetails.java:68)

但是如果我使用

request.setDestinationInExternalFilesDir(this,Environment.DIRECTORY_DOWNLOADS+ File.separator , "parag.jpeg");

这会下载文件但在我的应用程序特定文件夹中 但我想在外部公共下载目录中下载文件

【问题讨论】:

【参考方案1】:

根据您的代码,getExternalStoragePublicDirectory API 已弃用。

使用以下代码将文件保存在标准目录中。

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES,"parag.jpeg")

它会尝试保存到标准目录

/storage/emulated/0/Android/data/packagename/files/Pictures/parag.jpg

对于面向 Build.VERSION_CODES.Q 或更高版本的应用程序, 不需要 WRITE_EXTERNAL_STORAGE 权限,并且 dirType 必须 成为已知的公共目录之一,例如 环境#DIRECTORY_DOWNLOADS,环境#DIRECTORY_PICTURES, 环境#DIRECTORY_MOVIES等

我希望这会有所帮助。

【讨论】:

没有问题仍然存在 'E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.abc, PID: 29020 java.lang.IllegalStateException: 不是标准目录之一:/storage/emulated/0/Android/data /com.example.abc/files/Download' @parag 使用 setDestinationInExternalFilesDir 方法来解决这个问题。我已经更新了我的答案。 谢谢@jose praveen 我从你的回答中得到了提示 @parag 我的解决方案有效吗?如果是,则将此答案标记为已解决。【参考方案2】:

首先将此行添加到您的 AndroidManifest.xml 文件中的应用程序标记内。

android:requestLegacyExternalStorage="true"

使用Environment.DIRECTORY_PICTURES 或任何适合您文件的环境。

request.setAllowedNetworkTypes(
            DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE
        )
            .setAllowedOverRoaming(false).setTitle("Krishan Demo") //Download Manager Title
            .setDescription("Downloading...") // Download manager Discription
            .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
            .setDestinationInExternalPublicDir(
                Environment.DIRECTORY_PICTURES, // It can be any stanaderd directory Like DCIM,Downloads etc...
                "/KrishanImages/testing.jpg" // Your Custom directory name/Your Image file name
            )

【讨论】:

【参考方案3】:

您可以使用下面的代码来保存文件。

request.setDestinationInExternalFilesDir(this,Environment.DIRECTORY_DOWNLOADS, fileType)

【讨论】:

当您获得该文件时,您可以使用 val path = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)?.absolutePath + "/" + fileType 这将为您提供使用上述语句保存文件的确切路径。 【参考方案4】:

它对我有用

在清单中android:requestLegacyExternalStorage="true" 适用于 v28 和 v28+ 以下的 Android

  String folder = "/Download";
                    try  //V28 Below
                        request.setDestinationInExternalPublicDir(folder, filename);//v 28 allow to create and it deprecated method(v28+)

                     catch (Exception e) 

                        //For Android  28+
                        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);//(Environment.DIRECTORY_PICTURES,"picname.jpeg")
                    

【讨论】:

必须在清单中添加

以上是关于java.lang.IllegalStateException:不是标准目录之一:Android 10 上的 /storage/emulated/0/Download/的主要内容,如果未能解决你的问题,请参考以下文章