在android手机‘设置’-‘移动网络类型’里可以看到有关网络类型的选项,一般默认为3G优先。 
如果有需要在程序中切换网络类型的朋友,不妨试试下面的方法。这里提供了几种思路,虽然可能对待 
手机的方式不太友好。 
0)NetworkMode 
来自Android源码,The preferred network mode

  1. 7 = Global
  2. 6 = EvDo only
  3. 5 = CDMA w/o EvDo
  4. 4 = CDMA / EvDo auto
  5. 3 = GSM / WCDMA auto
  6. 2 = WCDMA only
  7. 1 = GSM only
  8. 0 = GSM / WCDMA preferred

1)HardCode 
可以使用Intent唤起设置的网络类型选择界面,先获取指定选项的坐标,通过该坐标结合sendevent或 
者monkey实现点击切换。至于如何唤起界面这里面有尝试,给不出代码,对于坐标点击,可结合本人之 
前的关于android测试的文章实现。 
2)Phone test 
与方式1类似,不同的是需要在拨号界面输入 *#*#4636#*#* 唤出测试界面,进入手机信息一栏即可 
找到相关选项,不多说。 
3)Database 
在shell中执行数据库修改语句,更改完有关网络类型的值之后触发加载

  1. sqlite3 /data/data/com.android.providers.settings/databases/settings.db "update secure set value='2' where name='preferred_network_mode'"

然后重启手机或者直接kill掉进程com.android.phone,如果执行kill需设备具有root权限 
如果手机有装busybox,可以直接执行

  1. ps|grep -v 'grep '| grep com.android.phone | awk '{FS=" "} {print $2}' | while read s; do kill -9  $s;  done

此方法本人觉得成功系数不太高,至少在自己设备上尝试是这样,一说是修改global表,未验证 
4)settings 
如果你的系统在4.2或以上,可以直接使用settings命令,以下命令为飞行模式设置,具体可参照下 
一个方式修改

  1. settings put global airplane_mode_on 1
  2. am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true
  3. settings put global airplane_mode_on 0
  4. am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false

5)AirplaneMode 
模仿飞行模式设置的方式,修改系统Secure属性,直接上代码

  1. /**
  2. * 设置网络模式
  3. * @param context
  4. * @param mode
  5. */
  6. public void setPreferedNetworkType(Context context, int mode){
  7. //<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
  8. Settings.Secure.putInt(context.getContentResolver(), "preferred_network_mode", mode);
  9. // change mode
  10. Intent intent = new Intent("com.android.phone.CHANGE_NETWORK_MODE");
  11. intent.putExtra("com.android.phone.NEW_NETWORK_MODE", mode);
  12. context.sendBroadcast(intent);
  13. }
  14. /**
  15. * 获取当前网络模式
  16. * @param context
  17. * @return
  18. * @throws SettingNotFoundException
  19. */
  20. public int getPreferedNetworkType(Context context) throws SettingNotFoundException {
  21. return Settings.Secure.getInt(context.getContentResolver(), "preferred_network_mode");
  22. }

这个就很直接了,马上可以看得到效果,唯一缺陷,就是自己的apk必须具有system权限,至 
于2.3以前的系统如何,我就没验证了。 
需要说明的是,方法3、4、5并非本人原创,乃国外牛人之作品,借此弥补国内资料的欠缺

  1. http://www.clearevo.com/blog/howto/2012/10/10/android_force_wcdma_or_gsm_or_auto_from_shell.html
  2. http://forum.xda-developers.com/showthread.php?t=2230207

转:http://hmxingkong.ddjava.com/blog/blog.html?blogId=662

android网络类型之2G-3G切换的更多相关文章

  1. Android网络类型判断(2g、3g、wifi)

    判断网络类型是wifi,还是3G,还是2G网络,对不同 的网络进行不同的处理,现将判断方法整理给大家,以供参考   说明:下面用到的数据移动2G,联通2G,联通3G,wifi我都已经测试过,暂时手上 ...

  2. android 获取网络类型名称2G 3G 4G wifi

    首先工程Manifest文件要引用: <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" ...

  3. Android: 网络随时需要在3G和Wifi切换,网络程序需要注意

    平时,3G和WIFI 都开着的时候,Android默认使用Wifi,但现实环境中不可能到处都有wifi,所以手机会经常自动切换网络. 有的时候,手机一开始使用wifi上网,当进入待机后10-30分钟, ...

  4. iOS中利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G)

    前言: 在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验. 但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也 ...

  5. 利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G)

    前言: 在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验. 但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也 ...

  6. iOS中利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G) by徐文棋

    前言: 在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验. 但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也 ...

  7. iOS:关于获取网络类型和运营商信息

    目录 1. 获取运营商网络类型 2. 获取运营商信息 返回目录 1. 获取运营商网络类型 Apple的Reachability Sample看起来不错,但是只可以判断是否连接到互联网和是否连接Wifi ...

  8. iOS 中如何判断当前是2G/3G/4G/5G/WiFi

    5G 什么的,还得等苹果API更新啊,不过将来还是这个处理过程就是了. 关于判断当前的网络环境是2G/3G/4G,这个问题以前经常看到,最近在一工程里看到了如果判断的API.而在撸WebRTC音视频通 ...

  9. android判断正在使用的网络类型 0.不知道网络类型;1、2G;2、3G;3、4g;4、wifi

    判断正在使用的网络类型 0.不知道网络类型:1.2G:2.3G:3.4g:4.wifi /** Unknown network class. {@hide} */ public static fina ...

随机推荐

  1. android 细节之 menu 之 invalidateOptionsMenu

    menu 在 android中是个很经常使用的控件,曾经自己做项目的时候通常都是将系统的menu相关方法在activity中直接删去.而且将主题换为fullscreen,然后再在layout中引入自己 ...

  2. 【POJ 1201】 Intervals(差分约束系统)

    [POJ 1201] Intervals(差分约束系统) 11 1716的升级版 把原本固定的边权改为不固定. Intervals Time Limit: 2000MS   Memory Limit: ...

  3. Framebuffer子系统【转】

    本文转载自:http://blog.csdn.net/av_geek/article/details/40897115 本文将介绍Framebuffer子系统 目标平台:TQ2440 CPU:s3c2 ...

  4. 基于Angular4+ server render(服务端渲染)开发教程

    目标: 1.更好的 SEO,方便搜索爬虫抓取页面内容 2.更快的内容到达时间(time-to-content) 影响: 1.用户:比原来更快的看到渲染的页面,提升用户体验 2.开发人员:某些代码可能需 ...

  5. HDU1043 Eight

    题目: 简单介绍一下八数码问题:        在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 1 2 3 4 5 6 7 8           在上图中,由于右下角位置是空的 ...

  6. 关于Vue.js去掉#号路由

    正常启动后访问路由: 中间会自动加入一个#号 去掉#号: 在route文件夹下的index.js中加入mode: 'history', ①: ②: 关于mode说明: 默认值: ‘hash‘(浏览器) ...

  7. HTML+CSS+JS总结

    ==================HTML(超文本标记语言)========== <!DOCTYPE> 声明位于文档中的最前面的位置,处于 <html> 标签之前.此标签可告 ...

  8. 如何使用Visual Studio调试C#程序

    当代码不能正常运行时,可以通过调试定位错误.常用的程序调试操作包括设置断点.开始.中断和停止程序的执行.单步执行程序以及使程序运行到指定的位置.下面将对这几种常用的程序调试操作进行详细地介绍. 1.断 ...

  9. oracle中sum求和问题

    如列表所示:都是选填字段name   age salary weight张三     18      20李四     17王五     21燕小六  15      22 sum(age+salar ...

  10. 从Hive1.0升级到Hive2.0(删除hive1.x中的元数据, 并不是数据迁移)

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...