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/的主要内容,如果未能解决你的问题,请参考以下文章