By:GentlemanTsao
背景:
3UK 希望在漫游的时候,APN 能够从 local 切换到 common,也就是从自己的 APN 切换到 一个通用的 APN。这项被称为 LBO 的 feature ,即欧洲的运营商都要支持该通用 APN。
要求
行为:
- 在本地网络,要使用 3UK 本地 APN;
- 处于漫游时,使用 EUInternet APN,不再从 3UK 接入.
菜单设定:
有两个选项:3UK 和 EU Roaming.
- 设为本地,APN 一直是 3UK;
- 设为 EU roaming,APN 随网络的漫游而切换。
实现方案:
根据网络漫游状态,动态更新 APN database。
分为:
静态切换:
当菜单设定变动时;
动态切换:
当网络漫游状态变化时;
关键源代码
静态切换APN,当菜单设定变动时
对应场景是,网络没有改变,APN roaming 设定有更改。若当前网络处于本地,APN 将不会变化;若网络 处于漫游,APN 将切换到 EU Internet。
实现方法是直接修改 APN DB 参数,使对应的 APN 类 型改变、enable 属性改变,从而控制显示或隐藏。
private void doApnSwitch(int value){
boolean roaming = "true".equals(
SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING));
String CARRIERS_URI_STRING = "content://telephony/carriers";
Uri APN_URI = Uri.parse(CARRIERS_URI_STRING);
ContentResolver resolver = getActivity().getContentResolver();
Xlog.d(TAG, "doApnSwitch value =" + value);
// if value == 0, then no EUinternet, switch to 3UK APN anyway;
//if value == 1, should use EUinternet when roaming,use 3UK APN when in Home
if( value == 0 || value == 1 && !roaming){
Xlog.d(TAG, "enable home APN" );
/*disable Roaming APN*/
ContentValues value3 = new ContentValues(1);
value3.put(Telephony.Carriers.CARRIER_ENABLED, 0);
resolver.update(APN_URI, value3, "numeric"+"=?"+ " AND "+"name"+"=?", new String[]{
"23420","EUInternet"});
/*enable home APN*/
ContentValues value1 = new ContentValues(1);
value1.put(Telephony.Carriers.TYPE, "default,mms,supl");
resolver.update(