在一个车载android系统定制开发项目中,客户提出有时候要使用厂家的专用网络,访问请求厂家提供的互联网服务;而在普通的网络请求时使用普通SIM卡本身能识别的APN来上网。

项目用的是全志T3 Android4.4平台,首先在系统中增加专用apn,在android\out\target\product\XXX\system\etc目录下,可以看到apns-conf.xml配置文件,这就是android系统里面的默认所有apn列表,源码则在android/device/softwinner/common/rild/apns-conf_sdk.xml 中修改,将新增的专用apn增加到这文件里即可。源码中加载所有apn是在android/package/providers/TelephonyProvider/src/com/android/providers/telephony/TelephonyProvider.java加载:

        /*         * Loads apns from xml file into the database         *         * @param db the sqlite database to write to         * @param parser the xml parser         *         */        private void loadApns(SQLiteDatabase db, XmlPullParser parser) {            if (parser != null) {                try {                    db.beginTransaction();                    XmlUtils.nextElement(parser);                    while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {                        ContentValues row = getRow(parser);                        if (row == null) {                            throw new XmlPullParserException("Expected 'apn' tag", parser, null);                        }                        insertAddingDefaults(db, CARRIERS_TABLE, row);                        XmlUtils.nextElement(parser);                    }                    db.setTransactionSuccessful();                } catch (XmlPullParserException e) {                    Log.e(TAG, "Got XmlPullParserException while loading apns.", e);                } catch (IOException e) {                    Log.e(TAG, "Got IOException while loading apns.", e);                } catch (SQLException e) {                    Log.e(TAG, "Got SQLException while loading apns.", e);                } finally {                    db.endTransaction();                }            }        }

 这方法将解释出一个个apn,然后能过insertAddingDefaults把apn存储到数据库中,也就是我们可以在使用专用网络的时候,在这方法做动作,除专用网络对应的apn入库,其余不入库即可:

private void insertAddingDefaults(SQLiteDatabase db, String table, ContentValues row) {            // Initialize defaults if any            if (row.containsKey(Telephony.Carriers.AUTH_TYPE) == false) {                row.put(Telephony.Carriers.AUTH_TYPE, -1);            }            if (row.containsKey(Telephony.Carriers.PROTOCOL) == false) {                row.put(Telephony.Carriers.PROTOCOL, "IP");            }            if (row.containsKey(Telephony.Carriers.ROAMING_PROTOCOL) == false) {                row.put(Telephony.Carriers.ROAMING_PROTOCOL, "IP");            }            if (row.containsKey(Telephony.Carriers.CARRIER_ENABLED) == false) {                row.put(Telephony.Carriers.CARRIER_ENABLED, true);            }            if (row.containsKey(Telephony.Carriers.BEARER) == false) {                row.put(Telephony.Carriers.BEARER, 0);            }            if (row.containsKey(Telephony.Carriers.MVNO_TYPE) == false) {                row.put(Telephony.Carriers.MVNO_TYPE, "");            }            if (row.containsKey(Telephony.Carriers.MVNO_MATCH_DATA) == false) {                row.put(Telephony.Carriers.MVNO_MATCH_DATA, "");            }            //add by likai start            String custApn = Settings.Secure.getString(mContext.getContentResolver(), "key_custom_apn");            if(custApn != null) {               if (row.containsKey(Telephony.Carriers.APN)) {                  String apn = row.getAsString(Telephony.Carriers.APN);                  if(apn != null && !"".equals(custApn) && !apn.equalsIgnoreCase(custApn)) {                     //Log.d(TAG, "apn not equals");                     return;                  }else{                     Log.d(TAG, "apn equals, custom apn = " + custApn);                  }               }            }            //add by likai end            db.insert(CARRIERS_TABLE, null, row);        }

 然后,在接收到要更新使用专有网络apn的时候,进入重置apn列表即可:

public static final Uri RESTORE_APN_URI = Uri.parse("content://telephony/carriers/restore"); if("NULL".equalsIgnoreCase(newAPN)){            Settings.Secure.putString(mContext.getContentResolver(), "key_custom_apn", "");        }else {            Settings.Secure.putString(mContext.getContentResolver(), "key_custom_apn", newAPN);        }        try {            resolver.delete(RESTORE_APN_URI, null, null);//restore apn data        } catch (Exception e1) {            e1.printStackTrace();        }}

 重置apn后,系统将会重新选择apn,些时数据库中有且仅有专有网络一条记录,如果些记录与正在使用的SIM是匹配的,那么些是使用的就会是专有网络。

此方法仅是个人的一种投机方法,高手勿喷,如有高见请赐教。

更多相关文章

  1. android设置主题和自定义主题的方法
  2. Android系统中UID
  3. android之使用signapk打包成系统应用,获取系统权限
  4. android intent使用方法
  5. Android 系统启动分析
  6. Android系统启动流程(nougat7.1.1_r6)
  7. Android输入系统解析及Native层模拟按键方案
  8. Android webkit webkit中skia的使用方法简析

随机推荐

  1. 自定义Activity栈来管理android的Activit
  2. android简单的手势判断
  3. unity调用aar包 适配AndroidX冲突
  4. android-ndk-r6b编译NDK
  5. Anko for Android
  6. android仿微信聊天页面,以及实现语音功能
  7. [原创] Failed to resolve: com.android.
  8. Android(安卓)消息处理机制: Handler 中
  9. Android(安卓)google VR全景图导航
  10. Android中inflate参数的写法: