下载的文件不会出现在下载文件夹中(android Q)



我已经寻找了很长时间的解决方案,但仍然没有找到合适的解决方案。

我的问题是…当用低于Q的Android下载文件时,绝对没有问题,并且文件出现在下载文件夹中。但是当使用Android下载文件时>=Q、 该文件不会出现在下载文件夹中。

所以我知道自从安卓10有了下载管理器之后,情况发生了变化。我读过很多次关于您现在应该使用StorageManager的文章,我当时就是这么做的。所以我改了这个:

if (download_uri == null) {
try {
URL rurl = new URL(url);
InputStream is = rurl.openStream();
DataInputStream dis = new DataInputStream(is);
byte[] buffer = new byte[4096];
File file = new File(getExternalFilesDir(null), nameOfFile);
FileOutputStream fos = new FileOutputStream(file);
int length;
while ((length = dis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
manager.addCompletedDownload(nameOfFile, "File", true, mimetype, Environment.DIRECTORY_DOWNLOADS + "/" + nameOfFile, contentLength, true);
}

到这个

if (download_uri == null) {
try {
URL rurl = new URL(url);
InputStream is = rurl.openStream();
DataInputStream dis = new DataInputStream(is);
byte[] buffer = new byte[4096];
File file = new File(getExternalFilesDir(null), nameOfFile);
FileOutputStream fos = new FileOutputStream(file);
int length;
while ((length = dis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
final String relativeLocation = Environment.DIRECTORY_DOWNLOADS + "/" + nameOfFile;

ContentValues myContentValues = new ContentValues();
myContentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, nameOfFile);
myContentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, relativeLocation);
myContentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimetype);
myContentValues.put(MediaStore.MediaColumns.IS_PENDING, 1);
} else {
manager.addCompletedDownload(nameOfFile, "FileDescription", true, mimetype, Environment.DIRECTORY_DOWNLOADS + "/" + nameOfFile, contentLength, true);
}
}

我看了很多次这个代码,但在我的情况下,文件还不会下载。也许我忘了一些导致问题的代码?

我还看到了一行有人使用的代码:

StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);

在我的代码中,我仍然使用:

DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));

然后:

download_id = manager.enqueue(request);
Uri download_uri = manager.getUriForDownloadedFile(download_id);

我不知道如何使用StorageManager(如果必须的话(。。。任何帮助都将不胜感激。

这是我的旧代码与下载管理器:

webView.setDownloadListener((url, userAgent, contentDisposition, mimetype, contentLength) -> {
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
if (checkPermission()) {
Log.d(LogTag, "Download URL:" + url);
Log.d(LogTag, "Download user-Agent:" + userAgent);
Log.d(LogTag, "Download contentDisposition:" + contentDisposition);
Log.d(LogTag, "Download MIME-Type:" + mimetype);
Log.d(LogTag, "Download length:" + ((Long) contentLength).toString());
final DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
String nameOfFile = URLUtil.guessFileName(url, null, mimetype);
request.setMimeType(mimetype);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
request.setAllowedOverMetered(true);
request.setAllowedOverRoaming(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
request.setRequiresCharging(false);
request.setRequiresDeviceIdle(false);
}
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, nameOfFile);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
request.allowScanningByMediaScanner();
}
request.setDescription("FileDescription");
String cookies = CookieManager.getInstance().getCookie(url);
request.addRequestHeader("cookie", cookies);
request.addRequestHeader("User-Agent", userAgent);
request.setTitle(nameOfFile);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//request.setVisibleInDownloadsUi(true);
final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
long download_id;
download_id = manager.enqueue(request);
}
}
}
});

根据Android文档,应用程序无法再使用DownloadManager下载到下载目录。

您可以尝试在AndroidManifest中将android:requestLegacyExternalStorage="true"添加到应用程序中。

新线程("文件下载"(

这里开始出现错误的代码。

不要使用假设下载已经完成而等待一秒钟的线程。

这个uri可能为null,因为该文件尚未下载。

相反,你应该启动一个广播接收器,它会在文件下载时通知你。

更新:如果你试图使用http://url下载,那么你必须在清单文件中添加<application标签:

android:usesCleartextTraffic="true" 

相关内容

  • 没有找到相关文章