Android APN管理 (接入点管理)

每个运营商都有特定的一些apn,android 系统怎么识别和管理这些apn,本文将对这个问题做一些讨论和研究。

涉及文件:

development/data/etc/apns-conf.xml 所有运行商的信息

/framework/base/core/res/res/apns.xml 空文件没什么作用 

com.android.settings.ApnSettings  


系统设置--查询显示

 1)设置中查询显示在上面的操作过后咱们就有了一张叫做carriers的表,该表存放了所有的apn以及其相关的一些属性之类的;
 2)设置中的ApnSettings.java就是进入设置apn显示的界面,那该类怎么去加载属于自己的apn列表
      调用 fillList()方法填充这个列表,以下是该方法的核心代码:
    
[plain]  view plain copy
  1. private void fillList() {  
  2.     String where = "numeric=\""  
  3.             + getOperatorNumeric()  
  4.             + "\"";  
  5.     Cursor cursor = managedQuery(Telephony.Carriers.CONTENT_URI, new String[] {  
  6.             "_id", "name", "apn", "type"}, where,  
  7.             Telephony.Carriers.DEFAULT_SORT_ORDER);  
  8.   
  9.     PreferenceGroup apnList = (PreferenceGroup) findPreference("apn_list");  
  10.     apnList.removeAll();  
  11.   
  12.     ArrayList<Preference> mmsApnList = new ArrayList<Preference>();  
  13.   
  14.     mSelectedKey = getSelectedApnKey();  
  15.     cursor.moveToFirst();  
  16.     while (!cursor.isAfterLast()) {  
  17.         String name = cursor.getString(NAME_INDEX);  
  18.         String apn = cursor.getString(APN_INDEX);  
  19.         String key = cursor.getString(ID_INDEX);  
  20.         String type = cursor.getString(TYPES_INDEX);  
  21.   
  22.         ApnPreference pref = new ApnPreference(this);  
  23.   
  24.         if (name.contains("ro.")){  
  25.             //for china union  
  26.             if (ChinaUnionPLMN.equals(getOperatorNumeric())){  
  27.                 if (type.equals("default")){  
  28.                     if (name.contains("wap")){  
  29.                         name = getString(R.string.china_union_wap_apn_name);  
  30.                     }else{  
  31.                         name = getString(R.string.china_union_net_apn_name);  
  32.                     }  
  33.                 }  
  34.                 if (type.equals("mms")) name = getString(R.string.china_union_mms_apn_name);  
  35.                 if (type.equals("supl")) name = getString(R.string.china_union_supl_apn_name);  
  36.                 /**  
  37.                  * changed by zaokun,fix bug 12113,union apn can't edit  
  38.                  */  
  39.                // pref.setIsDefault(true);  
  40.             }  
  41.         }  
  42.   
  43.         pref.setKey(key);  
  44.         pref.setTitle(name);  
  45.         pref.setSummary(apn);  
  46.         pref.setPersistent(false);  
  47.         pref.setOnPreferenceChangeListener(this);  
  48.   
  49.         boolean selectable = ((type == null) || !type.equals("mms"));  
  50.         pref.setSelectable(selectable);  
  51.         if (selectable) {  
  52.             if ((mSelectedKey != null) && mSelectedKey.equals(key)) {  
  53.                 pref.setChecked();  
  54.             }  
  55.             apnList.addPreference(pref);  
  56.         } else {  
  57.             mmsApnList.add(pref);  
  58.         }  
  59.         cursor.moveToNext();  
  60.     }  
  61.     cursor.close();  
  62.   
  63.     for (Preference preference : mmsApnList) {  
  64.         apnList.addPreference(preference);  
  65.     }  
  66. }  
重点:

     每个运行商都有多个接入点,默认选择与apns-conf.xml 中的顺序有关。



另外对于Android apk开发来说,可以通过apk代码自行创建接入点,不受设备default的接入点干扰。

你可能感兴趣的:(Android APN管理 (接入点管理))