在 Android 9 上配置 APN(API 级别 28)

Posted

技术标签:

【中文标题】在 Android 9 上配置 APN(API 级别 28)【英文标题】:Configure APNs on Android 9 (API level 28) 【发布时间】:2020-04-16 13:28:42 【问题描述】:

我正在尝试使用新的 APN api

代码如下所示

DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

ComponentName deviceAdmin = new ComponentName(getApplicationContext(), DeviceAdmin.class);

ApnSetting apn = (new ApnSetting.Builder())
        .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT)
        .setApnName("sonme.real.apn.url")
        .setEntryName("Some Entry")
        .setCarrierEnabled(true)
        .build();

int re = dpm.addOverrideApn(deviceAdmin, apn);

dpm.setOverrideApnsEnabled(deviceAdmin, true);

但除了 APN 菜单不可用(锁定到管理员 - 没关系)这一事实之外,APN 无法正常工作

附言

我检查了dpm.getOverrideApns(deviceAdmin); 并且添加的apn 存在... 我还尝试设置setProtocolsetRoamingProtocol

有什么想法吗?

【问题讨论】:

【参考方案1】:

终于搞清楚了缺什么

似乎在使用 API 添加 apns 时,您必须明确指定 setProtocolsetRoamingProtocolsetOperatorNumeric,这是必须的,它由 Telephony.Carriers.MCC + Telephony.Carriers.MNC 组成(在我的情况,我必须用前导零填充 MNC)

ApnSetting apn = (new ApnSetting.Builder())
        .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT)
        .setApnName("net.hotm")
        .setEntryName("HOT")
        .setCarrierEnabled(true) // enable it
        .setOperatorNumeric("425" + "07") // this is a must its consists from Telephony.Carriers.MCC + Telephony.Carriers.MNC, In my case, I had to pad the MNC with a leading zero
        .setProtocol(ApnSetting.PROTOCOL_IPV4V6) // this is a must
        .setRoamingProtocol(ApnSetting.PROTOCOL_IPV4V6) // this is a must
        .build();

int re = dpm.addOverrideApn(deviceAdmin, apn);

currApns =  dpm.getOverrideApns(deviceAdmin);

dpm.setOverrideApnsEnabled(deviceAdmin, true);

附言

可以从TelephonyManager, getSimOperator() (getSimOperator().substring(3) and getSimOperator().substring(0, 3)) 获取 MCC 和 MNC

【讨论】:

以上是关于在 Android 9 上配置 APN(API 级别 28)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PushPlugin 中配置 apn 服务器?

Android APN的配置和加载

如何以编程方式在 Android(KitKat 及更高版本)中添加 APN

Android 7.1开机之后APN的加载及拨号上网流程分析

记录android百度地图的一些细节功能的实现。

Android开发中如何定义和使用数组