最近被Android系统的APN自动切换网络问题折腾死了,软件使用CMNET网络,而系统自带的一些软件必须使用CMWAP,或者手机厂家搞的一些后台服务或者流氓软件总是在切换网络。没办法,只好想个解决之道了。

我的解决方案是:
1、在程序启动时,注册 Receiver 监视网络状态,当网络发生变化判断不是CMNET时则切换网络;
2、为了保险起见,在每个HTTP链接请求前加上网络判断。

本软件主要实现了功能如下:
拍照、定位、表单文件上传、查询、短信拦截(用于通过短信指令获得手机当前位置)、拨打电话、定时自动上传定位数据、版本更新等。

如下粘贴APN网络判断网站代码:
1、NetworkChangeReceiver  网络状态监视

package com.wiz.receiver;
0203
import com.wiz.tools.NetCheck;
04
import com.wiz.tools.StringUtils;
0506
import android.content.BroadcastReceiver;
07
import android.content.Context;
08
import android.content.Intent;
09
import android.net.ConnectivityManager;
10
import android.net.NetworkInfo;
11
import android.util.Log;
1213
public class NetworkChangeReceiver  extends BroadcastReceiver {
14NetCheck netCheck=new NetCheck();
15public void onReceive(Context context, Intent intent) {
16Log.e("NetworkChangeReceiver", "onReceive");
17ConnectivityManager conManager= (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
1819if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
20NetworkInfo info = conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
21String apn = StringUtils.null2String(info.getExtraInfo());
22if (!"cmnet".equals(apn.toLowerCase())) {
23netCheck.checkNetworkInfo(context);
24}
25}
26}
27
}

2、Activity 中注册 NetworkChangeReceiver

NetworkChangeReceiver ncr = new NetworkChangeReceiver();
2
IntentFilter upIntentFilter = new IntentFilter( ConnectivityManager.CONNECTIVITY_ACTION);
3
this.registerReceiver(ncr, upIntentFilter);// 网络状态监控

3、APN判断及网络切换

package com.wiz.tools;
002
import android.content.ContentResolver;
003
import android.content.ContentValues;
004
import android.content.Context;
005
import android.database.Cursor;
006
import android.database.SQLException;
007
import android.net.ConnectivityManager;
008
import android.net.NetworkInfo;
009
import android.net.Uri;
010
import android.util.Log;
011012
public class NetCheck {
013public static final Uri APN_URI = Uri.parse("content://telephony/carriers");
014public static final Uri CURRENT_APN_URI = Uri
015.parse("content://telephony/carriers/preferapn");
016public static String getCurrentAPNFromSetting(ContentResolver resolver) {
017Cursor cursor = null;
018try {
019cursor = resolver.query(CURRENT_APN_URI, null, null, null, null);
020String curApnId = null;
021String apnName1=null;
022if (cursor != null && cursor.moveToFirst()) {
023curApnId = cursor.getString(cursor.getColumnIndex("_id"));
024apnName1 = cursor.getString(cursor.getColumnIndex("apn"));
025}
026cursor.close();
027Log.e("NetCheck getCurrentAPNFromSetting","curApnId:"+curApnId+" apnName1:"+apnName1);
028//find apn name from apn list
029if (curApnId != null) {
030cursor = resolver.query(APN_URI, null, " _id = ?", new String[]{curApnId}, null);
031if (cursor != null && cursor.moveToFirst()) {
032String apnName = cursor.getString(cursor.getColumnIndex("apn"));
033return apnName;
034}
035}
036037} catch (SQLException e) {
038Log.e("NetCheck getCurrentAPNFromSetting",e.getMessage());
039} finally {
040if (cursor != null) {
041cursor.close();
042}4、HTTP请求前的判断
043}
044045return null;
046
}
047public static int updateCurrentAPN(ContentResolver resolver, String newAPN) {
048Cursor cursor = null;
049try {
050//get new apn id from list
051cursor = resolver.query(APN_URI, null, " apn = ? and current = 1", new String[]{newAPN.toLowerCase()}, null);
052String apnId = null;
053if (cursor != null && cursor.moveToFirst()) {
054apnId = cursor.getString(cursor.getColumnIndex("_id"));
055}
056cursor.close();
057Log.e("NetCheck updateCurrentAPN","apnId:"+apnId);
058//set new apn id as chosen one
059if (apnId != null) {
060ContentValues values = new ContentValues();
061values.put("apn_id", apnId);
062resolver.update(CURRENT_APN_URI, values, null, null);
063} else {
064//apn id not found, return 0.
065return 0;
066}
067} catch (SQLException e) {
068Log.e("NetCheck updateCurrentAPN",e.getMessage());
069} finally {
070if (cursor != null) {
071cursor.close();
072}
073}
074075//update success
076return 1;
077
}
078079public boolean checkNetworkInfo(Context c) {
080boolean ret=false;
081ConnectivityManager conManager= (ConnectivityManager) c.getSystemService(Context.CONNECTIVITY_SERVICE);
082NetworkInfo info = conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
083boolean internet=conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
084String oldAPN = StringUtils.null2String(info.getExtraInfo());
085String oldSQLAPN=StringUtils.null2String(getCurrentAPNFromSetting(c.getContentResolver()));
086087Log.e("NetCheck checkNetworkInfo","oldAPN:"+oldAPN+" oldSQLAPN:"+oldSQLAPN);
088if (internet==false||!"cmnet".equals(oldAPN.toLowerCase())||!"cmnet".equals(oldSQLAPN.toLowerCase())) {
089if("cmwap".equals(oldAPN.toLowerCase())&&"cmnet".equals(oldSQLAPN.toLowerCase())){
090updateCurrentAPN(c.getContentResolver(), "cmwap");
091try {
092Thread.sleep(200);
093} catch (InterruptedException e) {
094e.printStackTrace();
095}
096}
097updateCurrentAPN(c.getContentResolver(), "cmnet");
098try {
099Thread.sleep(200);
100} catch (InterruptedException e) {
101e.printStackTrace();
102}
103ret=true;
104}
105return ret;
106107}
108
}

4、HTTP请求前的判断

if (nc.checkNetworkInfo(LoginActivity.this)) {
2Thread.sleep(5000);// 设置cmnet网络
3}

Android 开发:APN网络切换之CMNET相关推荐

  1. Android开发之APN网络切换

    原文:http://www.cnblogs.com/hanyonglu/archive/2012/03/29/2423298.html 本文介绍Android平台中关于APN网络切换的相关知识以及如何 ...

  2. Android开发 关于避免切换主题时免闪屏的几种方式

    Android开发 关于避免切换主题时闪屏的几种方式 在activity中调用setTheme来切换夜间模式的方法可能大家有看过相关的文章了,但是调用setTheme设置的主题后界面并没有变化,这时需 ...

  3. android中英文切换功能,Android开发之中英文切换

    这篇文章详细介绍了Android开发之中英文切换,文中穿插有实例代码和示例程序介绍的很详细,遇到同样问题的朋友可以参考一下,如果有更好的解决方法,请留言分享帮助更多的程序员. 首先配置文件的appli ...

  4. android开发界面转换,Android开发Activity界面切换添加动画特效的方法

    释放双眼,带上耳机,听听看~! 随着互联网的快速发展,现在我们开发的界面或者动画特效效果都非常好,其实这对于程序员的挑战是非常大的,下文是技术狗小编为大家带来的Android实现Activity界面切 ...

  5. android 默认打开服务器地址,Android开发实现任意切换服务器地址

    前言 项目开发中,我们总需要连接多个不同的服务器地址访问接口,开发环境.测试环境.正式环境还有后台同事的本地地址,我经常碰到开发环境挂掉,一挂就是一天的情况,一言难尽说多都是泪~ 所以很多时候都需要切 ...

  6. android开发之网络棋牌类在线游戏开发心得(服务器端、Java) 好文章值得收藏...

    标签: android服务器 2013-10-09 17:28 3618人阅读 评论(0) 收藏 举报 分类: android (11) 转自:http://blog.csdn.net/bromon/ ...

  7. Android开发中activity切换动画的实现

    (1)我们在MainAcitvity中定义两个textview,用于点击触发切换Activity事件,下面是布局文件代码. <LinearLayoutandroid:layout_width=& ...

  8. android开发之网络棋牌类在线游戏开发心得(服务器端、Java)

    转自:http://blog.csdn.net/bromon/article/details/253330 Bromon原创 请尊重版权 一个多人在线的棋牌类网络游戏的项目临近尾声,我参与了该项目的整 ...

  9. Android开发关于网络的书记,Android开发需要了解的网络协议

    这篇文章上次修改于 835 天前,可能其部分内容已经发生变化,如有疑问可询问作者. 我们先讲个小故事理解一下. 盛唐年间,天下安定,由于疆域太大传递信件不易,就有民间的能人异士向皇帝谏言,每个州县都建 ...

最新文章

  1. 《Python数据分析与挖掘实战》一3.1 数据质量分析
  2. 如何手撸一个较为完整的RPC框架
  3. python之markdown转html
  4. 高职学计算机专业排名,海南雅典职业技术学校官网
  5. [导入]毕业的大学生的100条忠告
  6. 20165105第三周学习总结
  7. springboot activiti 配置项详解
  8. halcon 相似度_Halcon分类函数,shape模型
  9. 社交应用动态九宫格图片的规则
  10. 【Flink】Flink netty 通讯 PartitionRequestClient NettyPartitionRequestClient
  11. MySql 手动执行主从备份
  12. 今天解决了首页无头像被显示的问题
  13. bootbox api
  14. c语言程序设计流程图案例
  15. android 离线音乐播放器,5款顶级Android离线音乐播放器,哪款才是你的菜?
  16. 下行L1/L2控制信道
  17. 关于“明显没有bug的代码”的一些拙见
  18. 电磁兼容试验和测量技术标准 GB 17626 简介
  19. RCLAMP0544T 国产替代上海雷卯ULC0544T
  20. CF1364D Ehab‘s Last Corollary(思维,环,二分图,构造)

热门文章

  1. Python学习--函数调用与声明问题
  2. 12.SparkSQL概述
  3. 传智教育“大同互联网职业技术学院”奠基仪式盛大举行,开拓高等职业教育发展新版图...
  4. 华为欧拉系统服务器开接口,euleros云服务器配置
  5. 下列不是python数据类型的是_python不支持的数据类型有
  6. VS·卸载进程卡死“正在配置您的系统,这可能需要一些时间“
  7. android stuido去掉右侧中白线
  8. 年轻人要如何预防恶性肿瘤?
  9. SVN Version Control(1) --Installing SVN on CentOS
  10. 物业员工APP系统源码