android网络类型之2G-3G切换

在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.   
  4. settings put global airplane_mode_on 0  
  5. 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.     //  
  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. /** 
  17.     * 获取当前网络模式 
  18.     * @param context 
  19.     * @return 
  20.     * @throws SettingNotFoundException  
  21.     */  
  22.    public int getPreferedNetworkType(Context context) throws SettingNotFoundException {  
  23.     return Settings.Secure.getInt(context.getContentResolver(), "preferred_network_mode");  
  24.     }  


这个就很直接了,马上可以看得到效果,唯一缺陷,就是自己的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.   
  3. http://forum.xda-developers.com/showthread.php?t=2230207  



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



你可能感兴趣的:(android)