1、简单说明
  上一篇博文http://myqdroid.blog.51cto.com/2057579/389134已对APN的配置作了较为详细的说明 ,可是我想有些读者对为啥要提前在源码中配置APN及成功配置后有啥效果较为迷惑,同时我想对在创建一个APN时的注意之处作出说明。
 
2、为啥配置APN及配置效果
  如果你用的MOTO或HTC的Android手机,那么在你插入3G SIM卡以后,进入APN设置界面,手机会自动为你提供好多APN选项;这些不是Google提供的,而是这些厂商在定制自己的Android手机时提供的;如果这些厂商没有提供这些的话,那么一条APN信息都不会出现的,如果那样就需要用户自己配置APN了,若配置不当就无法连接3G网络了。
 
3、成功配置后,Settings 有关APN源码分析
0)此处我的版本为android 2.2
 
1)
所涉及的源文件 $ANDROID_SRC_PATH/packages/apps/Settings/src/com/android/settings/ApnSettings.java
 
2)
149行 android.os.SystemProperties.get(xxx_NUMERIC, "")
--1)该语句的作用是读取SIM卡的numeric,模拟器默认是310260
 
--2)
numeric值,它是由mcc与mnc拼接而成的,其中mcc是国家码,mnc是供应商码,从而numeric对某一个国家的某一个供应商而言是唯一的,例如:中国移动3gnet 460+02,中国联通3gnet 460+01
 
--3)
任一时刻,只能看到某一SIM卡所对应的供应商的APN设置,双卡双待模式的机型也是如此的
 
3、apn的属性问题
1)
一个正确的China Unicom 3gnet
<apn carrier="China Unicom"
    apn="3gnet"
    proxy=""
    port=""
    user=""
    password=""
    server=""
    mmsc=""
    mcc="460"
    mnc="01"
    mmsproxy=""
    mmsport=""
    type=""
/>
 
2)
其中有些属性是必须要设置的,即使是赋空字符串!
eg:
mmsproxy=""
mmsport=""
type=""
如果你没有设置的话,那么数据库中将给字段设为NULL,从而连接就会出错,需要说明的是我的MID开发板是这样的。
 
3)
至于哪些值必须设,以及如何设置请看android的有关源码
eg:
TelephonyProvider.java中的方法:
 
 private ContentValues getRow(XmlPullParser parser) {
...
           String mmsproxy = parser.getAttributeValue(null, "mmsproxy");
            if (mmsproxy != null) {
                map.put(Telephony.Carriers.MMSPROXY, mmsproxy);
            }

            String mmsport = parser.getAttributeValue(null, "mmsport");
            if (mmsport != null) {
                map.put(Telephony.Carriers.MMSPORT, mmsport);
            }

            map.put(Telephony.Carriers.MMSC, parser.getAttributeValue(null, "mmsc"));
            String type = parser.getAttributeValue(null, "type");
            if (type != null) {
                map.put(Telephony.Carriers.TYPE, type);
            }
...
}