`
jgsj
  • 浏览: 967136 次
文章分类
社区版块
存档分类
最新评论

Android APN配置

 
阅读更多

APN概念


APN(Access Point Name),即“接入点名称”,用来标识GPRS的业务种类,目前分为两大类:CMWAP(通过GPRS访问WAP业务)、CMNET(除了WAP以外的服务目前都用CMNET,比如连接因特网等)。是通过手机上网时必须配置的一个参数,它决定了您的手机通过哪种接入方式来访问网络。业务流程GPRS专网系统终端上网登录服务器平台的流程为:
  1)用户发出GPRS登录请求,请求中包括由移动公司为GPRS专网系统专门分配的专网APN;
  2)根据请求中的APN,SGSN向DNS服务器发出查询请求,找到与企业服务器平台连接的GGSN,并将用户请求通过GTP隧道封装送给GGSN;
  3)GGSN将用户认证信息(包括手机号码、用户账号、密码等)通过专线送至Radius进行认证;
  4)Radius认证服务器看到手机号等认证信息,确认是合法用户发来的请求,向DHCP服务器请求分配用户地址;
  5)Radius认证通过后,由Radius向GGSN发送携带用户地址的确认信息;
  6)用户得到了IP地址,就可以携带数据包,对GPRS专网系统信息查询和业务处理平台进行访问。

Android自带的内部APN配置文件


frameworks/base/core/res/res/xml/apns.xml文件内容:

<!-- If you edit this version, also edit the version in the partner-supplied
    apns-conf.xml configuration file -->
<apns version="7">

</apns>

该文件被编译到res.apk中,通过android的资源管理器进行访问。

第三方提供的APN配置文件

在Android源码build目录下,通过搜索apns-conf.xml可以找到在各个board中分别有配置:


在编译该product时会将device/generic/goldfish/data/etc/apns-conf.xml文件拷贝到system/etc/目录下,最后打包到system.img中。

APN配置加载


android通过telephony.db数据库中的carriers表来保存所有的APN配置信息


packages/providers/TelephonyProvider/src/com/android/providers/telephony/TelephonyProvider.java文件中的内部类DatabaseHelper用于创建telephony.db数据库

public void onCreate(SQLiteDatabase db) {
	// Set up the database schema
	db.execSQL("CREATE TABLE " + CARRIERS_TABLE +
		"(_id INTEGER PRIMARY KEY," +
			"name TEXT," +
			"numeric TEXT," +
			"mcc TEXT," +
			"mnc TEXT," +
			"apn TEXT," +
			"user TEXT," +
			"server TEXT," +
			"password TEXT," +
			"proxy TEXT," +
			"port TEXT," +
			"mmsproxy TEXT," +
			"mmsport TEXT," +
			"mmsc TEXT," +
			"authtype INTEGER," +
			"type TEXT," +
			"current INTEGER," +
			"protocol TEXT," +
			"roaming_protocol TEXT," +
			"carrier_enabled BOOLEAN," +
	"preset BOOLEAN default false," +
			"bearer INTEGER);");
	//从APN配置xml文件中读取APN配置,并存储到数据表carriers中
	initDatabase(db);
}
APN配置信息加载分为两部分,首先从Android自带的内部APN配置文件中读取配置信息,然后在读取第三方提供的APN配置文件信息。

private void initDatabase(SQLiteDatabase db) {
	// Read internal APNS data
	Resources r = mContext.getResources();
	//读取frameworks/base/core/res/res/xml/apns.xml文件
	XmlResourceParser parser = r.getXml(com.android.internal.R.xml.apns);
	int publicversion = -1;
	try {
		XmlUtils.beginDocument(parser, "apns");
		//读取APN配置版本信息
		publicversion = Integer.parseInt(parser.getAttributeValue(null, "version"));
		//加载APN配置信息,并保存到数据表中
		loadApns(db, parser);
	} catch (Exception e) {
		Log.e(TAG, "Got exception while loading APN database.", e);
	} finally {
		parser.close();
	}

   // Read external APNS data (partner-provided)
	XmlPullParser confparser = null;
	// Environment.getRootDirectory() is a fancy way of saying ANDROID_ROOT or "/system".
	//读取system/etc/apns-conf.xml文件
	File confFile = new File(Environment.getRootDirectory(), PARTNER_APNS_PATH);
	FileReader confreader = null;
	try {
		confreader = new FileReader(confFile);
		confparser = Xml.newPullParser();
		confparser.setInput(confreader);
		XmlUtils.beginDocument(confparser, "apns");
		// 读取第三方提供的APN配置版本号
		int confversion = Integer.parseInt(confparser.getAttributeValue(null, "version"));
		//判断第三方提供的APN配置版本号是否与Android自带的APN配置版本号相同
		if (publicversion != confversion) {
			throw new IllegalStateException("Internal APNS file version doesn't match "
					+ confFile.getAbsolutePath());
		}
		//如果版本号相同,读取APN配置信息
		loadApns(db, confparser);
	} catch (FileNotFoundException e) {
		// It's ok if the file isn't found. It means there isn't a confidential file
		// Log.e(TAG, "File not found: '" + confFile.getAbsolutePath() + "'");
	} catch (Exception e) {
		Log.e(TAG, "Exception while parsing '" + confFile.getAbsolutePath() + "'", e);
	} finally {
		try { if (confreader != null) confreader.close(); } catch (IOException e) { }
	}
}
从APN信息加载源码中可以知道,第三方提供的APN配置信息版本必须与内部APN配置信息的版本相同。自此APN配置信息就存储在carriers表中了,并且通过TelephonyProvider向外提供访问接口。

分享到:
评论

相关推荐

    android手机APN设置

    设置android的APN配置,移动2G和联通的2G和3G网络配置,以及MMS的APN配置

    Android端APN实现module

    android端通过代码实现apn配置,这里做一下记录,方便以后查看这部分实现内容

    android APN 设置

    在android代码中切换网络,如cmnet,cmwap

    android apn设置 A20 A83 RK3288 验证通过

    附件为apndemo,apn.xml需放到U盘或者sd卡根目录,在有信号的时候插卡或U盘3秒后配置成功

    APN配置指北1

    APN配置指北1

    [Mark安卓教程]Android手机修改APN不保存解决办法.pdf

    APN的英文全称是Access Point Name,中文全称叫接入点,是您在通过手机上网时必须配置的一个参数,它决定了您的手机通过哪种接入方式来访问网络。 有时候需要修改APN的时候会发现无法更改,连常用的海卓HIAPN都无法...

    apns-conf.xml

    文档收集全球大部分运营商APN配置,条目丰富,持续更新中。

    apn-defaults:用于开发移动消息应用程序的 MMS APN 数据的公共源

    该类为 APN MMSC 信息提供了一个应用程序内源,以在系统 APN DB 不可用且用户未提供自己的本地 MMSC 配置详细信息的情况下用作后备。 它目前覆盖了全球数百家运营商。 它使用得越多,我们实现全面覆盖的速度就越快...

    nodePushServer:APN GCM节点推送服务器

    Push Server当前支持iOS(APN)和android(GCM)平台。 它使用mongoDB来存储推送令牌。 请注意,由于未实现任何特定的安全性,因此该服务器不应用作前端服务器。入门1-数据库node-pushserver使用mongodb来存储用户/...

    我的情景模式MyProfiles v2.4.0 付费汉化版

    修復 Android上的APN崩潰問題 4.0 ICS, 請使用“移動網絡”,而不是. 微調部件佈局, 特別是對於 QVGA的設備. 重新排列的配置文件設置的順序. 降低功耗,同時使“保持清醒”. 提高為文件名有特殊的鈴聲的支持.

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--android 设置apn |--android 调节屏幕亮度 |--android 资源uri |--android 还原短信 |--android 重启 |--android中anim文件特效 |--app信息menifest获取(如版本号) |--AsyncQueryHandler之异步查询Cursor处理 |--...

    推送:最后,推送通知框架不会受到伤害。 当前支持Android(FCM)和iOS(APN)

    配置之上的约定:推送将约定之上的配置带到您的应用中,以组织您的推送通知实现。 极其容易学习:如果您知道如何使用ActionMailer,那么您已经知道如何使用Pushing。 与ActiveJob异步发送通知,无需任何学习费用。...

    3C Toolbox Pro 1.9.9.7.6C.apk

    ◊配置Android防火墙,TCP拥塞,DNS * 1►任务管理器 ◊检查CPU,网络和内存使用情况 ◊杀死(默认)或强制停止* 1任何应用程序或内核进程 ◊自动任务杀手,内存增强器,内存清理器 ►系统控制* 1◊CPU调速器,频率...

    push-service:APN 和 GCM 推送服务的直接 RESTful 接口

    Tart Push Service 能够以透明的方式向 Android 和 IOS 设备发送推送通知。 安装 克隆存储库。 运行npm install 并运行./bin/www --config "/path/to/config.json" --port 3000 配置 配置文件 配置文件必须是严格...

    PushNotification:PHP和Laravel软件包将推送通知发送到Android和IOS设备

    可用的推送服务提供商: GCM 流式细胞仪APN安装Laravel 5.8以下版本在控制台中输入: composer require "edujugon/push-notification:^v3.0.0"Laravel 5.8 / 6及更高版本在控制台中输入: composer require edujugon...

    dossum:使用Meteor构建的开源Instant Messenger

    使用raix:push软件包为Android推送通知配置GCM。 。 将凭据粘贴到config.push.json中 使用raix:push软件包为iOS推送通知配置APN。 。 将凭据粘贴到config.push.json中 笔记 和软件包进行了稍微修改,并将其放置在...

    androidpn-client-0.5.0.zip和androidpn-server-0.5.0-bin.zip

    AndroidPN实现了从服务器到android移动平台的文本消息推送。这里先简单说一下androidPN的安装过程。 下载androidpn-client-0.5.0.zip和androidpn-server-0.5.0-bin.zip 网址:...

    loopback-component-kue-push

    方便的回送组件,可使用kue为iOS和Android发送推送通知。 安装 npm i loopback-component-kue-push --save 配置 将loopback-component-kue-push对象添加到项目的component-config.json : " loopback-component-...

    PushNotification

    Push Server当前支持iOS(APN)和android(GCM)平台。 它使用mongoDB来存储推送令牌。 请注意,由于未实现任何特定的安全性,因此该服务器不应用作前端服务器。入门1-数据库node-pushserver使用mongodb来存储用户/...

Global site tag (gtag.js) - Google Analytics