您的位置:首页 > 理论基础 > 计算机网络

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

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

源码复制打印?

7 = Global

6 = EvDo only

5 = CDMA w/o EvDo

4 = CDMA / EvDo auto

3 = GSM / WCDMA auto

2 = WCDMA only

1 = GSM only

0 = GSM / WCDMA preferred

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

源码复制打印?

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,可以直接执行

源码复制打印?

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命令,以下命令为飞行模式设置,具体可参照下
一个方式修改

源码复制打印?

settings put global airplane_mode_on 1

am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true

settings put global airplane_mode_on 0

am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false

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

源码复制打印?

/**

* 设置网络模式

* @param context

* @param mode

*/

public void setPreferedNetworkType(Context context, int mode){

//<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>

Settings.Secure.putInt(context.getContentResolver(), "preferred_network_mode", mode);

// change mode

Intent intent = new Intent("com.android.phone.CHANGE_NETWORK_MODE");

intent.putExtra("com.android.phone.NEW_NETWORK_MODE", mode);

context.sendBroadcast(intent);

}

/**

* 获取当前网络模式

* @param context

* @return

* @throws SettingNotFoundException

*/

public int getPreferedNetworkType(Context context) throws SettingNotFoundException {

return Settings.Secure.getInt(context.getContentResolver(), "preferred_network_mode");

}

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

源码复制打印?
http://www.clearevo.com/blog/howto/2012/10/10/android_force_wcdma_or_gsm_or_auto_from_shell.html http://forum.xda-developers.com/showthread.php?t=2230207
转:http://hmxingkong.ddjava.com/blog/blog.html?blogId=662
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: