Android APN配置

如果要支持多个运营商的支持就要在apns-conf.xml中加入。
Android APN配置
分类: 【Android 系统分析】   497人阅读  评论(0)  收藏  举报

目录(?)[+]

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文件内容:

[html]  view plain copy
  1. <!-- If you edit this version, also edit the version in the partner-supplied  
  2.     apns-conf.xml configuration file -->  
  3. <apns version="7">  
  4.   
  5. </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数据库

[java]  view plain copy
  1. public void onCreate(SQLiteDatabase db) {  
  2.     // Set up the database schema  
  3.     db.execSQL("CREATE TABLE " + CARRIERS_TABLE +  
  4.         "(_id INTEGER PRIMARY KEY," +  
  5.             "name TEXT," +  
  6.             "numeric TEXT," +  
  7.             "mcc TEXT," +  
  8.             "mnc TEXT," +  
  9.             "apn TEXT," +  
  10.             "user TEXT," +  
  11.             "server TEXT," +  
  12.             "password TEXT," +  
  13.             "proxy TEXT," +  
  14.             "port TEXT," +  
  15.             "mmsproxy TEXT," +  
  16.             "mmsport TEXT," +  
  17.             "mmsc TEXT," +  
  18.             "authtype INTEGER," +  
  19.             "type TEXT," +  
  20.             "current INTEGER," +  
  21.             "protocol TEXT," +  
  22.             "roaming_protocol TEXT," +  
  23.             "carrier_enabled BOOLEAN," +  
  24.     "preset BOOLEAN default false," +  
  25.             "bearer INTEGER);");  
  26.     //从APN配置xml文件中读取APN配置,并存储到数据表carriers中  
  27.     initDatabase(db);  
  28. }  
APN配置信息加载分为两部分,首先从Android自带的内部APN配置文件中读取配置信息,然后在读取第三方提供的APN配置文件信息。

[java]  view plain copy
  1. private void initDatabase(SQLiteDatabase db) {  
  2.     // Read internal APNS data  
  3.     Resources r = mContext.getResources();  
  4.     //读取frameworks/base/core/res/res/xml/apns.xml文件  
  5.     XmlResourceParser parser = r.getXml(com.android.internal.R.xml.apns);  
  6.     int publicversion = -1;  
  7.     try {  
  8.         XmlUtils.beginDocument(parser, "apns");  
  9.         //读取APN配置版本信息  
  10.         publicversion = Integer.parseInt(parser.getAttributeValue(null"version"));  
  11.         //加载APN配置信息,并保存到数据表中  
  12.         loadApns(db, parser);  
  13.     } catch (Exception e) {  
  14.         Log.e(TAG, "Got exception while loading APN database.", e);  
  15.     } finally {  
  16.         parser.close();  
  17.     }  
  18.   
  19.    // Read external APNS data (partner-provided)  
  20.     XmlPullParser confparser = null;  
  21.     // Environment.getRootDirectory() is a fancy way of saying ANDROID_ROOT or "/system".  
  22.     //读取system/etc/apns-conf.xml文件  
  23.     File confFile = new File(Environment.getRootDirectory(), PARTNER_APNS_PATH);  
  24.     FileReader confreader = null;  
  25.     try {  
  26.         confreader = new FileReader(confFile);  
  27.         confparser = Xml.newPullParser();  
  28.         confparser.setInput(confreader);  
  29.         XmlUtils.beginDocument(confparser, "apns");  
  30.         // 读取第三方提供的APN配置版本号  
  31.         int confversion = Integer.parseInt(confparser.getAttributeValue(null"version"));  
  32.         //判断第三方提供的APN配置版本号是否与Android自带的APN配置版本号相同  
  33.         if (publicversion != confversion) {  
  34.             throw new IllegalStateException("Internal APNS file version doesn't match "  
  35.                     + confFile.getAbsolutePath());  
  36.         }  
  37.         //如果版本号相同,读取APN配置信息  
  38.         loadApns(db, confparser);  
  39.     } catch (FileNotFoundException e) {  
  40.         // It's ok if the file isn't found. It means there isn't a confidential file  
  41.         // Log.e(TAG, "File not found: '" + confFile.getAbsolutePath() + "'");  
  42.     } catch (Exception e) {  
  43.         Log.e(TAG, "Exception while parsing '" + confFile.getAbsolutePath() + "'", e);  
  44.     } finally {  
  45.         try { if (confreader != null) confreader.close(); } catch (IOException e) { }  
  46.     }  
  47. }  
从APN信息加载源码中可以知道,第三方提供的APN配置信息版本必须与内部APN配置信息的版本相同。自此APN配置信息就存储在carriers表中了,并且通过TelephonyProvider向外提供访问接口。
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值