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

Android Download Manager在私有APN网络下Pending问题求助

解决Download Manager在私有APN蜂窝网络下的下载Pending问题

在Android 10/12/13设备上,使用Download Manager从私有APN蜂窝网络连接的私有服务器下载文件(该服务器无法通过公网访问)时,出现以下问题:

  • 仅开启私有APN蜂窝网络时,下载任务处于Pending状态(状态码1)
  • 开启WiFi后,下载通知出现但因服务器无法通过公网访问而失败
  • 直接用浏览器可正常下载该文件,且相同代码下载公网文件时,WiFi/常规蜂窝网络均正常

当前代码与配置

Download Manager请求代码

DownloadManager.Request request = new DownloadManager.Request(uri);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
request.setDestinationUri(Uri.fromFile(getFile()));
request.setAllowedOverMetered(true);
request.setAllowedOverRoaming(true);
request.setTitle(mContext.getString(R.string.title));
request.setDescription(mName);

文件保存路径

File file = new File(Environment.getExternalStorageDirectory(), "Download");

Manifest权限配置

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

解决方案

1. 强制仅使用蜂窝网络

由于私有服务器仅能通过私有APN的蜂窝网络访问,需移除NETWORK_WIFI的网络类型限制,让Download Manager仅尝试使用蜂窝网络:

// 只允许蜂窝网络,删除NETWORK_WIFI选项
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE);

2. 确认计量网络权限生效

虽然已设置setAllowedOverMetered(true),但部分系统对私有APN的计量标记可能有特殊处理:

  • 检查设备的私有APN配置,确认是否被标记为“计量网络”,若支持可手动改为非计量
  • 确保setAllowedOverMetered(true)代码未被逻辑覆盖,该方法允许Download Manager在计量网络(包括私有APN)上发起下载

3. 配置网络安全策略(Android 10+)

Android 10及以上默认启用网络安全配置,若私有服务器使用自签名证书或未被系统信任的证书,Download Manager可能无法建立连接(浏览器可能已手动信任该证书):

  1. 在res/xml目录下创建network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <!-- 替换为私有服务器的域名或IP地址 -->
        <domain includeSubdomains="true">your-private-server-domain-or-ip</domain>
    </domain-config>
    <!-- 信任用户安装的自签名证书(如果需要) -->
    <trust-anchors>
        <certificates src="user" />
        <certificates src="system" />
    </trust-anchors>
</network-security-config>
  1. 在Manifest的<application>标签中引用该配置:
<application
    ...
    android:networkSecurityConfig="@xml/network_security_config">
    ...
</application>

4. 检查系统级网络限制

部分厂商对Download Manager的网络访问有额外限制,可尝试:

  • 进入应用设置→数据使用→后台数据,确保允许应用在后台使用数据
  • 关闭设备的“省流量模式”或“智能省流量”功能,避免系统限制私有APN的网络访问

5. 自定义下载任务替代方案

若以上方法无效,可放弃Download Manager,改用OkHttp或HttpURLConnection实现自定义下载,完全控制网络请求逻辑:

OkHttpClient client = new OkHttpClient.Builder()
        // 如需信任自签名证书,添加对应的SSL配置
        .sslSocketFactory(yourCustomSslSocketFactory, yourTrustManager)
        .build();

Request request = new Request.Builder()
        .url(uri.toString())
        .build();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        // 处理下载失败逻辑
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            InputStream inputStream = response.body().byteStream();
            FileOutputStream outputStream = new FileOutputStream(getFile());
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            outputStream.close();
            inputStream.close();
            // 下载完成后通知用户
        }
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:40:20