Android Download Manager下载延迟且始终失败问题求助
DownloadManager下载立即失败无日志的排查方案
先验证下载链接有效性
直接在设备浏览器中打开你代码里的PDF链接,确认是否能正常下载。如果链接失效、需要身份验证或服务器返回错误,DownloadManager会静默失败,不会产生明显日志。主动查询下载状态,获取错误原因
不要仅依赖广播,在调用downloadManager.enqueue(request)时保存返回的downloadId,主动查询下载状态来获取具体失败信息:val downloadId = downloadManager.enqueue(request) // 可在合适时机(如延迟几秒或按钮触发)执行查询 val query = DownloadManager.Query().setFilterById(downloadId) val cursor = downloadManager.query(query) if (cursor.moveToFirst()) { val status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) val reason = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_REASON)) if (status == DownloadManager.STATUS_FAILED) { Log.d("DownloadError", "下载失败,错误码:$reason") // 错误码对应含义可参考DownloadManager常量,如ERROR_FILE_ERROR、ERROR_UNHANDLED_HTTP_CODE等 } } cursor.close()修正Receiver注册问题
你同时使用了静态注册和动态注册,且动态注册时直接创建临时Receiver实例,易因组件回收导致广播无法接收,还可能引发内存泄漏。建议二选一:- 仅保留静态注册:确保Manifest中
android:name的路径与Receiver实际类路径完全一致(比如somename.DownloadReceiver需匹配真实包名+类名) - 仅使用动态注册:在Activity/Fragment的生命周期中管理Receiver实例:
private lateinit var downloadReceiver: DownloadReceiver override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) downloadReceiver = DownloadReceiver() val filter = IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE) registerReceiver(downloadReceiver, filter) } override fun onDestroy() { super.onDestroy() unregisterReceiver(downloadReceiver) }
- 仅保留静态注册:确保Manifest中
确认权限配置完整性
再次核对权限设置:- Android 6.0-9.0:Manifest中需声明
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>,且需在运行时申请该权限 - Android 10:在
<application>标签中添加android:requestLegacyExternalStorage="true"以兼容公共目录写入 - 所有版本:必须声明
<uses-permission android:name="android.permission.INTERNET"/>,否则无法联网下载
- Android 6.0-9.0:Manifest中需声明
检查静态Receiver的广播接收权限
你Manifest中的Receiver设置了android:exported="false",虽然ACTION_DOWNLOAD_COMPLETE是定向到你的应用的广播,但如果仍收不到,可以尝试改为android:exported="true"(该广播仅会发送给你的应用,安全风险较低),同时确认Receiver类名无拼写错误。
内容的提问来源于stack exchange,提问作者lelestacia
相关产品推荐
相关产品推荐

