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

Android API31+解决DownloadManager ERROR_TOO_MANY_REDIRECTS问题

关于DownloadManager重定向次数的问题解答

1. DownloadManager默认重定向次数

Android系统的DownloadManager默认允许的HTTP重定向次数为5次,这个限制是系统底层实现的硬约束,未通过公开API对外暴露。当重定向次数超过该阈值时,就会触发ERROR_TOO_MANY_REDIRECTS(1005)错误。

2. 能否增加最大重定向次数?

不能。DownloadManager没有提供任何公开方法或参数来修改最大重定向次数,这个限制是固定的,无法通过配置调整。

3. 解决过多重定向下载失败的方案

如果需要支持10、20甚至30次的重定向场景,只能放弃DownloadManager,改用自定义下载实现,比如使用OkHttp框架,它允许灵活配置重定向策略。

示例代码(基于OkHttp实现自定义下载)

import okhttp3.OkHttpClient
import okhttp3.Request
import java.io.File
import java.io.FileOutputStream
import java.io.IOException

fun downloadFileWithCustomRedirects(url: String, path: String, maxRedirects: Int = 30): Boolean {
    val client = OkHttpClient.Builder()
        .followRedirects(true)
        .followSslRedirects(true)
        .retryOnConnectionFailure(true)
        .callTimeout(30, java.util.concurrent.TimeUnit.SECONDS)
        // 自定义重定向次数限制
        .addInterceptor { chain ->
            var request = chain.request()
            var response = chain.proceed(request)
            var redirectCount = 0
            while (response.isRedirect && redirectCount < maxRedirects) {
                redirectCount++
                val newUrl = response.header("Location") ?: break
                request = request.newBuilder().url(newUrl).build()
                response.close()
                response = chain.proceed(request)
            }
            if (redirectCount >= maxRedirects) {
                throw IOException("Too many redirects: $redirectCount")
            }
            response
        }
        .build()

    val request = Request.Builder().url(url).build()

    return try {
        client.newCall(request).execute().use { response ->
            if (!response.isSuccessful) throw IOException("Unexpected code $response")
            val file = File(path)
            file.parentFile?.mkdirs()
            FileOutputStream(file).use { outputStream ->
                response.body?.byteStream()?.copyTo(outputStream)
            }
            true
        }
    } catch (e: IOException) {
        e.printStackTrace()
        false
    } finally {
        client.dispatcher.executorService.shutdown()
        client.connectionPool.evictAll()
    }
}

注意事项

  • 自定义下载需要自行处理网络权限(INTERNET)、存储权限(根据Android版本适配WRITE_EXTERNAL_STORAGE或使用Scoped Storage)。
  • 如果需要后台下载,可以结合WorkManager或ForegroundService实现,避免系统杀死进程。
  • 下载完成后需调用媒体扫描(如MediaScannerConnection)让系统识别下载的文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:52:44