我正在使用Android中的DownloadManager服务通过https网址下载文件,例如https://www.antennahouse.com/XSLsample/pdf/sample-link_1.pdf。这些文件不受(当前)密码保护,以防万一。
一旦我将下载请求排入队列,DownloadManager就开始下载,但它似乎挂起了。当我检查状态时,我得到了
COLUMN_BYTES_DOWNLOADED_SO_FAR: 0
COLUMN_STATUS: 4
COLUMN_REASON: 1
COLUMN_STATUS 4是STATUS_PAUSED,“当下载等待重试或恢复时。”
COLUMN_REASON 1为PAUSED_WAITING_TO_RETRY,“暂停下载时因某些网络错误而下载管理器正在等待,然后重试请求。”但似乎没有办法确定发生了什么网络错误。下载永远不会成功完成。
我已经检查了logcat监视器是否有相关的警告和错误,但一无所获。
我已尝试使用多个不同的服务器,包括内部和公共服务器,结果相同。
没有明显的网络问题:Wi-Fi连接已启动,下载使用http://正常工作:文件立即下载并显示在指定目的地的文件系统中
对于https下载,我们的服务器日志显示从服务器的角度来看文件已成功提供。在笔记本电脑上的浏览器中测试相同的https网址可以成功下载文件,而不会出现任何明显的问题或在开发人员工具网络面板中显示额外的协商。
我的代码(摘要):
sManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request req = new DownloadManager.Request(sourceURI);
final Uri destinationUri = Uri.fromFile(destinationFile);
req.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI
| DownloadManager.Request.NETWORK_MOBILE)
.setDestinationUri(destinationUri)
.setMimeType(...);
long id = sManager.enqueue(req);
摘要:通过DownloadManager启动的https下载无限期挂起,而相同的https下载在浏览器中正常工作,并且普通的http下载可以使用DownloadManager在同一个应用程序中正常工作。我得到的最好线索是PAUSED_WAITING_TO_RETRY
表示“发生了一些网络错误”。如何确定网络错误是什么?
答案 0 :(得分:0)
近似原因似乎是一个CertificateException:CertPathValidatorException:Trust anchor for certification path not found.
我通过using an HttpURLConnection directly(感谢@CommonsWare的建议)而不是DownloadManager找到了这个,它可以更直接地访问异常。 (在我们的内部服务器的情况下也是如此。我所提到的示例URL似乎并非如此,这似乎与DownloadManager有相同的问题......但也许同样的问题有所不同原因。)
根CA(在所有情况下)是" AddTrust外部CA根",它出现在设备上的受信任CA列表中,在设置>下。安全>可信凭证。因此,如果这是一个受信任的CA根,为什么没有找到认证路径的" Trust锚点"异常?
看起来服务器所服务的链中没有包含中间CA,如described here。实际上,使用openssl s_client -connect
检查CA链确认不包括中间CA. Android doc article提出了两种可能的解决方案:在服务器链中包含中间CA,或者通过创建特殊的TrustManager在应用程序中明确信任它们。我希望能做到前者。