zoukankan      html  css  js  c++  java
  • 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.     //<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. /** 
    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

  • 相关阅读:
    商务通代码
    Ubuntu 创建快捷方式的方法
    Linux安装Nginx
    Linux安装jdk10
    Mycat实现Mysql数据库读写分离
    Mysql主从复制
    SpringBoot整合Redis集群
    Redis集群环境搭建
    SpringBoot整合redis哨兵主从服务
    redis 哨兵机制环境搭建
  • 原文地址:https://www.cnblogs.com/sunfb/p/3941967.html
Copyright © 2011-2022 走看看