android 自带了一个 downloadmanager,能用 Notification 提示,能暂停,支持断点。
网上介绍的文章比较多,使用也非常简单,不多说,记录一个使用时碰到的超级血坑,调试的我头都大了
测试结果:
使用 android studio 8.0 以下模拟器 : ok
使用 8.0 以上模拟器: 添加任务成功,但下载任务不开始
用一部 8.0 以上的华为真机: ok
-
猜测,这个玩意可能兼容性不好,是不是有什么东西没配置好,搜到 stackoverflow 上一个答案,尝试,失败。
-
猜测,是不是 provider 问题,搜到 这篇文章,尝试,又失败。
继续各种搜索尝试,都失败.......
重新打开模拟器,发现 8.0 以下的模拟器没有 wifi 图标,8.0以上的有 wifi 图标有个叹号,显示为 [已连接,但没有网络],关键是 LTE 网络是有信号的,模拟器内的浏览器也是可以上网的。猜测是不是 downloadmanager 有什么网络监测机制,而不是直接联网下载。
搜索到 搜索到 这篇,这篇,还有 这篇,根据这几篇文章设置,然后就 OK 了,卧槽,不是代码问题,而是模拟器的问题,这谁能想到啊
跟我上面的猜测一致,android 自带的 downloadmanager 好像是会用了网络监测,可以看这里的 源码,监测使用的是 https://www.google.com/generate_204,这个 url 国内打不开,所以导致 downloadmanager 无法开始下载
好在这个可以用 adb 命令重置
# 查看所有配置
adb shell settings list global
# Android 7.1.1 以下重置
adb shell settings put global captive_portal_server connect.rom.miui.com
# 还原
adb shell settings delete global captive_portal_server
# Android 7.1.1 以上
adb shell settings put global captive_portal_https_url https://connect.rom.miui.com/generate_204
# 还原
adb shell settings delete global captive_portal_https_url
# Android 7.1.1 以上也可以使用 http url 检测
adb shell settings put global captive_portal_use_https 0
adb shell settings put global captive_portal_http_url http://connect.rom.miui.com/generate_204
# 还原
adb shell settings delete captive_portal_use_https
adb shell settings delete global captive_portal_http_url
收集了几个可用的地址
http(s)://connect.rom.miui.com/generate_204
http(s)://www.qualcomm.cn/generate_204
http(s)://www.androidbak.net/generate_204
http(s)://www.noisyfox.cn/generate_204
执行完上面的命令,模拟器打开飞行模式,再关掉,然后 wifi 图标的叹号消失了,downloadmanager 也可以用了。
那么问题来了, 是不是就可以完全依赖 downloadmanager 做下载功能了,恐怕还是不行的,在寻找解决方案的时,确实发现了不少其他使用该模块无法下载的情况。
退一步讲,如果有人刷机,刷了原生 android 系统,那么使用 downloadmanager 也是无法进行的,所以还是要有容错处理,可以先判断网络状态,进而决定是否使用 downloadmanager (这需要用户额外授权网络权限了),也可先无脑添加,添加后判断下载状态,进而返回是否成功。
不是很懂 android 的这个设计,下载模块为毛要依赖这个状态,直接发送请求不好吗、追踪了几个钟头发现是这么个问题也是挺无语的
网友评论