DownloadManager在Android Q上引发SecurityException



Download Manager在Android 10设备上收到以下错误。目标版本是29。

我将android:requestLegacyExternalStorage="true"标记添加到Manifest中,但它不起作用。

java.lang.SecurityException:不支持的路径/存储/模拟/0/Contents/Awesome App.apk

这是代码

public static void startDownload(Context context, String url, String token, String subPath) {
DownloadManager.Request request;
DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse(url);  // A url to download a file
try {
request = new DownloadManager.Request(uri);
request.addRequestHeader("X-Auth-Token", token);
} catch (IllegalArgumentException e) {
e.printStackTrace();
return;
}
request.setVisibleInDownloadsUi(true);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
try {
File downloadFileDir = new File(Environment
.getExternalStorageDirectory().getAbsolutePath() + "/Contents");
if (downloadFileDir != null) {
if (!downloadFileDir.exists()) {
downloadFileDir.mkdirs();
}
File file = new File(downloadFileDir.getAbsolutePath() + File.separator + subPath);
// subPath is name of the file to download. e.g. Awesome App.apk
if (file.exists()) {
file.delete();
}
Uri localUri = Uri.fromFile(file);
request.setDestinationUri(localUri);
if (localUri != null) {
request.setMimeType(MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(localUri.toString())));
}
}
} catch (SecurityException e) {
e.printStackTrace();
}
request.setTitle(subPath);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
try {
manager.enqueue(request);
} catch (SecurityException e) {
e.printStackTrace();
//Got exception here
}
}

/storage/emulated/0/Contents/Awesome App.apk

在Android 10设备中,DownloadManager不会下载到外部存储上您自己的目录中。

你需要使用一个已经可用的公共目录,如文档,下载,DCIM,音乐等等

所以你可以让下载到

/storage/emulated/0/Music/Contents/Awesome App.apk

无需自己创建子目录,因为下载管理器会这样做。

您的应用程序不需要任何权限就可以让下载管理器执行其任务。

相关内容

  • 没有找到相关文章

最新更新