每个运营商都有特定的一些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()方法填充这个列表,以下是该方法的核心代码:
- private void fillList() {
- String where = "numeric=\""
- + getOperatorNumeric()
- + "\"";
- Cursor cursor = managedQuery(Telephony.Carriers.CONTENT_URI, new String[] {
- "_id", "name", "apn", "type"}, where,
- Telephony.Carriers.DEFAULT_SORT_ORDER);
- PreferenceGroup apnList = (PreferenceGroup) findPreference("apn_list");
- apnList.removeAll();
- ArrayList<Preference> mmsApnList = new ArrayList<Preference>();
- mSelectedKey = getSelectedApnKey();
- cursor.moveToFirst();
- while (!cursor.isAfterLast()) {
- String name = cursor.getString(NAME_INDEX);
- String apn = cursor.getString(APN_INDEX);
- String key = cursor.getString(ID_INDEX);
- String type = cursor.getString(TYPES_INDEX);
- ApnPreference pref = new ApnPreference(this);
- if (name.contains("ro.")){
- //for china union
- if (ChinaUnionPLMN.equals(getOperatorNumeric())){
- if (type.equals("default")){
- if (name.contains("wap")){
- name = getString(R.string.china_union_wap_apn_name);
- }else{
- name = getString(R.string.china_union_net_apn_name);
- }
- }
- if (type.equals("mms")) name = getString(R.string.china_union_mms_apn_name);
- if (type.equals("supl")) name = getString(R.string.china_union_supl_apn_name);
- /**
- * changed by zaokun,fix bug 12113,union apn can't edit
- */
- // pref.setIsDefault(true);
- }
- }
- pref.setKey(key);
- pref.setTitle(name);
- pref.setSummary(apn);
- pref.setPersistent(false);
- pref.setOnPreferenceChangeListener(this);
- boolean selectable = ((type == null) || !type.equals("mms"));
- pref.setSelectable(selectable);
- if (selectable) {
- if ((mSelectedKey != null) && mSelectedKey.equals(key)) {
- pref.setChecked();
- }
- apnList.addPreference(pref);
- } else {
- mmsApnList.add(pref);
- }
- cursor.moveToNext();
- }
- cursor.close();
- for (Preference preference : mmsApnList) {
- apnList.addPreference(preference);
- }
- }
每个运行商都有多个接入点,默认选择与apns-conf.xml 中的顺序有关。
另外对于Android apk开发来说,可以通过apk代码自行创建接入点,不受设备default的接入点干扰。