Android指定专用APN

栏目: Android · 发布时间: 6年前

内容简介:在一个车载Android系统定制开发项目中,客户提出有时候要使用厂家的专用网络,访问请求厂家提供的互联网服务;而在普通的网络请求时使用普通SIM卡本身能识别的APN来上网。项目用的是全志T3 Android4.4平台,首先在系统中增加专用apn,在android\out\target\product\XXX\system\etc目录下,可以看到apns-conf.xml配置文件,这就是android系统里面的默认所有apn列表,源码则在android/device/softwinner/common/ri

在一个车载Android系统定制开发项目中,客户提出有时候要使用厂家的专用网络,访问请求厂家提供的互联网服务;而在普通的网络请求时使用普通SIM卡本身能识别的APN来上网。

项目用的是全志T3 Android4.4平台,首先在系统中增加专用apn,在android\out\target\product\XXX\system\etc目录下,可以看到apns-conf.xml配置文件,这就是android系统里面的默认所有apn列表,源码则在android/device/softwinner/common/rild/apns-conf_sdk.xml 中修改,将新增的专用apn增加到这文件里即可。源码中加载所有apn是在android/package/providers/TelephonyProvider/src/com/android/providers/telephony/TelephonyProvider.java加载:

/*

* Loads apns from xml file into the database

*

* @param db the sqlite database to write to

* @param parser the xml parser

*

*/

private void loadApns(SQLiteDatabase db, XmlPullParser parser) {

if (parser != null) {

try {

db.beginTransaction();

XmlUtils.nextElement(parser);

while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {

ContentValues row = getRow(parser);

if (row == null) {

throw new XmlPullParserException("Expected 'apn' tag", parser, null);

}

insertAddingDefaults(db, CARRIERS_TABLE, row);

XmlUtils.nextElement(parser);

}

db.setTransactionSuccessful();

} catch (XmlPullParserException e) {

Log.e(TAG, "Got XmlPullParserException while loading apns.", e);

} catch (IOException e) {

Log.e(TAG, "Got IOException while loading apns.", e);

} catch (SQLException e) {

Log.e(TAG, "Got SQLException while loading apns.", e);

} finally {

db.endTransaction();

}

}

}

这方法将解释出一个个apn,然后能过insertAddingDefaults把apn存储到数据库中,也就是我们可以在使用专用网络的时候,在这方法做动作,除专用网络对应的apn入库,其余不入库即可:

private void insertAddingDefaults(SQLiteDatabase db, String table, ContentValues row) {

// Initialize defaults if any

if (row.containsKey(Telephony.Carriers.AUTH_TYPE) == false) {

row.put(Telephony.Carriers.AUTH_TYPE, -1);

}

if (row.containsKey(Telephony.Carriers.PROTOCOL) == false) {

row.put(Telephony.Carriers.PROTOCOL, "IP");

}

if (row.containsKey(Telephony.Carriers.ROAMING_PROTOCOL) == false) {

row.put(Telephony.Carriers.ROAMING_PROTOCOL, "IP");

}

if (row.containsKey(Telephony.Carriers.CARRIER_ENABLED) == false) {

row.put(Telephony.Carriers.CARRIER_ENABLED, true);

}

if (row.containsKey(Telephony.Carriers.BEARER) == false) {

row.put(Telephony.Carriers.BEARER, 0);

}

if (row.containsKey(Telephony.Carriers.MVNO_TYPE) == false) {

row.put(Telephony.Carriers.MVNO_TYPE, "");

}

if (row.containsKey(Telephony.Carriers.MVNO_MATCH_DATA) == false) {

row.put(Telephony.Carriers.MVNO_MATCH_DATA, "");

}

//add by likai start

String custApn = Settings.Secure.getString(mContext.getContentResolver(), "key_custom_apn");

if(custApn != null) {

if (row.containsKey(Telephony.Carriers.APN)) {

String apn = row.getAsString(Telephony.Carriers.APN);

if(apn != null && !"".equals(custApn) && !apn.equalsIgnoreCase(custApn)) {

//Log.d(TAG, "apn not equals");

return;

}else{

Log.d(TAG, "apn equals, custom apn = " + custApn);

}

}

}

//add by likai end

db.insert(CARRIERS_TABLE, null, row);

}

然后,在接收到要更新使用专有网络apn的时候,进入重置apn列表即可:

public static final Uri RESTORE_APN_URI = Uri.parse("content://telephony/carriers/restore");

if("NULL".equalsIgnoreCase(newAPN)){

Settings.Secure.putString(mContext.getContentResolver(), "key_custom_apn", "");

}else {

Settings.Secure.putString(mContext.getContentResolver(), "key_custom_apn", newAPN);

}

try {

resolver.delete(RESTORE_APN_URI, null, null);//restore apn data

} catch (Exception e1) {

e1.printStackTrace();

}

重置apn后,系统将会重新选择apn,些时数据库中有且仅有专有网络一条记录,如果些记录与正在使用的SIM是匹配的,那么些是使用的就会是专有网络。

此方法仅是个人的一种投机方法,高手勿喷,如有高见请赐教。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-09/154463.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Haskell

Haskell

Simon Thompson / Addison-Wesley / 1999-3-16 / GBP 40.99

The second edition of Haskell: The Craft of Functional Programming is essential reading for beginners to functional programming and newcomers to the Haskell programming language. The emphasis is on th......一起来看看 《Haskell》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码