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


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

查看所有标签

猜你喜欢:

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

Operating System Algorithms

Operating System Algorithms

Nathan Adams、Elisha Chirchir / CreateSpace Independent Publishing Platform / 2017-4-21 / USD 39.15

Operating System Algorithms will walk you through in depth examples of algorithms that you would find in an operating system. Selected algorithms include process and disk scheduling.一起来看看 《Operating System Algorithms》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具