Android 下载管理器“下载未成功”

8

这是我第一次尝试实现DownloadManager,无论我尝试什么方法,我总是收到一个通知说“下载失败”。我查看了许多其他SO论坛、几个教程,我所拥有的应该可以工作。是的,我在清单文件中设置了网络和外部存储权限。是的,我在手机的应用程序设置中授予了存储权限。我在运行API 28的Android模拟器和运行相同版本的真实手机上都尝试过这个。下面是我的代码:

        String url = "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4";

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

        request.setTitle("title");

        request.setDescription("Your file is downloading");

        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC, "" + System.currentTimeMillis());

        request.allowScanningByMediaScanner();
        request.setAllowedOverMetered(true);
        request.setAllowedOverRoaming(true);

        //Enqueue download and save the referenceId
        long downloadReference = downloadManager.enqueue(request);

        if (downloadReference != 0) {
            Toast.makeText(getApplicationContext(), "download started", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(getApplicationContext(), "no download started", Toast.LENGTH_SHORT).show();
        }

非常感谢您提供的任何帮助或建议。谢谢。


你尝试使用其他的URL了吗? - Abhay Koradiya
@AbhayKoradiya 是的,我已经尝试了3个URL。 - Ethan Shoe
只有一个问题是在28号出现的吗? - Abhay Koradiya
@AbhayKoradiya 我还没有尝试其他的API。 - Ethan Shoe
你检查了手机存储空间吗? - Quick learner
请确保您的服务器允许您下载文件。 - undefined
2个回答

12

这个问题是由于网络安全引起的。如果您在上述饼图API中使用不安全的URL,则无法执行您的URL。请查看官方文档

避免明文传输的原因是缺乏机密性、真实性和防篡改保护;网络攻击者可以监听传输数据,也可以在不被检测到的情况下修改它。

在清单中添加以下内容以绕过所有安全措施。

<application
  android:name=".ApplicationClass"
  ....
  android:usesCleartextTraffic="true">

就是这样。我已经添加了它,但我还没有将URL添加到我试图从中下载的测试网站上。感谢您的帮助! - Ethan Shoe
1
我花了好几个小时来尝试下载一个.apk文件,终于找到了这篇解释失败原因的答案。感谢您! - birgersp
对我来说很有效。谢谢你。 - Pratik Gaikwad
不要在清单文件中使用clearTextTraffic,而是在android:networkSecurityConfig="@xml/network_security_config"中使用它。 - undefined

4

我的经验是在2021年1月11日,最低SDK版本19,目标SDK版本30。

我花了一天时间使用下载服务,最终它成功了。为了对任何想要尝试的人总结如下:

  1. 不要忘记在Manifest中添加WRITE_EXTERNAL_STORAGE和INTERNET权限。
  2. 使用requestPermissions()从用户那里授权。
  3. 使用getExternalFilesDir()而不是getExternalStorageDirectory()。
  4. 如果你从http://下载文件,请在Manifest中添加usesCleartextTraffic="true"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接