Lar*_*rsH 7 https android android-download-manager
我正在使用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
Run Code Online (Sandbox Code Playgroud)
COLUMN_STATUS 4是STATUS_PAUSED,"当下载等待重试或恢复时."
COLUMN_REASON 1是PAUSED_WAITING_TO_RETRY,"当下载暂停时,因为发生了一些网络错误并且下载管理器在重试请求之前正在等待." 但似乎没有办法确定发生了什么网络错误.下载永远不会成功完成.
我已经检查了logcat监视器是否有相关的警告和错误,但一无所获.
我已尝试使用多个不同的服务器,包括内部和公共服务器,结果相同.
没有明显的网络问题:Wi-Fi连接已启动,使用http://下载正常工作:文件立即下载并显示在指定目标的文件系统中.
在https下载的情况下,我们的服务器日志显示从服务器的角度成功提供文件.在笔记本电脑上的浏览器中测试相同的https URL会导致成功下载文件,而不会出现任何明显的问题或在开发人员工具网络面板中显示额外的协商.
我的代码(摘要):
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);
Run Code Online (Sandbox Code Playgroud)
简介:通过DownloadManager启动的https下载无限期挂起,而相同的https下载在浏览器中正常工作,并且普通的http下载可以使用DownloadManager在同一个应用程序中正常工作.我有的最好的线索是PAUSED_WAITING_TO_RETRY表示"发生了一些网络错误".如何确定网络错误是什么?
直接原因似乎是CertificateException:CertPathValidatorException:我通过直接使用HttpURLConnection(感谢@CommonsWare的建议)而不是DownloadManagerTrust anchor for certification path not found.发现了这一点,它可以更直接地访问异常。(对于我们的内部服务器来说确实如此。我提到的示例 URL 似乎并非如此,它似乎与 DownloadManager 存在相同的问题......但也许相同的问题有不同的情况原因。)
根 CA(在所有情况下)是“AddTrust 外部 CA 根”,它位于设备上的受信任 CA 列表中,位于“设置”>“安全性”>“受信任凭据”下。那么,如果这是受信任的 CA 根,为什么会出现“未找到证书路径的信任锚”异常?
看起来有一个中间 CA 未包含在服务器提供的链中,如此处所述。事实上,使用openssl s_client -connect检查 CA 链可以确认中间 CA 不包括在内。Android文档文章提出了两种可能的解决方案:将中间 CA 包含在服务器链中,或者通过创建特殊的 TrustManager 在应用程序中明确信任它们。我希望做前者。
| 归档时间: |
|
| 查看次数: |
1216 次 |
| 最近记录: |