在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=http://www.mamicode.com/‘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属性,直接上代码
-
- public void setPreferedNetworkType(Context context, int mode){
-
- Settings.Secure.putInt(context.getContentResolver(), "preferred_network_mode", mode);
-
- Intent intent = new Intent("com.android.phone.CHANGE_NETWORK_MODE");
- intent.putExtra("com.android.phone.NEW_NETWORK_MODE", mode);
- context.sendBroadcast(intent);
- }
-
-
- public int getPreferedNetworkType(Context context) throws SettingNotFoundException {
- return Settings.Secure.getInt(context.getContentResolver(), "preferred_network_mode");
- }
这个就很直接了,马上可以看得到效果,唯一缺陷,就是自己的apk必须具有system权限,至
于2.3以前的系统如何,我就没验证了。
需要说明的是,方法3、4、5并非本人原创,乃国外牛人之作品,借此弥补国内资料的欠缺