You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例,易因组件回收导致广播无法接收,还可能引发内存泄漏。建议二选一:

    1. 仅保留静态注册:确保Manifest中android:name的路径与Receiver实际类路径完全一致(比如somename.DownloadReceiver需匹配真实包名+类名)
    2. 仅使用动态注册:在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)
      }
      
  • 确认权限配置完整性
    再次核对权限设置:

    • 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"/>,否则无法联网下载
  • 检查静态Receiver的广播接收权限
    你Manifest中的Receiver设置了android:exported="false",虽然ACTION_DOWNLOAD_COMPLETE是定向到你的应用的广播,但如果仍收不到,可以尝试改为android:exported="true"(该广播仅会发送给你的应用,安全风险较低),同时确认Receiver类名无拼写错误。

内容的提问来源于stack exchange,提问作者lelestacia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:55:23