android 控制设备网络接入点
2013-04-18 19:22
344 查看
项目需要使用cmwap来接入网络 :
1. 判断当前设备是否有网络接入(有那么检测是什么接入方式【wifi? cmnet? cmwap?】)
2. 如果没有任何接入那么 强制使用GPRS数据接入
2.1 如果强制数据接入后为cmnet接入那么还需要强制转换为cmwap接入
2.2 如果强制数据接入后为cmwap那么不做任何操作
3. 如果当前设备为wifi接入那么关闭wifi强制GPRS数据接入【有cmnet和cmwap 两种】
3.1 如果强制数据接入后为cmnet接入那么还需要强制转换为cmwap接入
3.2 如果强制数据接入后为cmwap那么不做任何操作
4. 如果当前为GPRS数据接入那么判断是cmnet还是cmwap
4.1 如果为cmnet接入那么强制转换为cmwap接入
4.2 如果强制数据接入后为cmwap那么不做任何操作
代码实现如下:
4.0及以上的听说Google限制了WRITE_APN_SETTINGS权限需要在源码环境下编译或者使用系统签名才可通过。
需要添加权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
1. 判断当前设备是否有网络接入(有那么检测是什么接入方式【wifi? cmnet? cmwap?】)
2. 如果没有任何接入那么 强制使用GPRS数据接入
2.1 如果强制数据接入后为cmnet接入那么还需要强制转换为cmwap接入
2.2 如果强制数据接入后为cmwap那么不做任何操作
3. 如果当前设备为wifi接入那么关闭wifi强制GPRS数据接入【有cmnet和cmwap 两种】
3.1 如果强制数据接入后为cmnet接入那么还需要强制转换为cmwap接入
3.2 如果强制数据接入后为cmwap那么不做任何操作
4. 如果当前为GPRS数据接入那么判断是cmnet还是cmwap
4.1 如果为cmnet接入那么强制转换为cmwap接入
4.2 如果强制数据接入后为cmwap那么不做任何操作
代码实现如下:
package com.c; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class C extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /** * @author zc* * @data 2013-04-18* * @param context* * 判断当前设备接入网络类型 -1:无网络接入;1:wifi接入;2:cmwap接入;3:cmnet接入 * */ NetworkUtils networkUtils = new NetworkUtils(this); int apntype = networkUtils.getAPNType(this); switch (apntype) { case -1: //强制数据连接后有cmnet和cmwap networkUtils.setGprsEnabled("setMobileDataEnabled", true); Toast.makeText(this, "当前设备未连接网络开始强制数据连接", Toast.LENGTH_LONG).show(); apntype = networkUtils.getAPNType(this); if(apntype==3) { //如果强制接入的为cmnet那么执行强转为cmwap networkUtils.deletecmnet(); } break; case 1: networkUtils.setWifi(false); networkUtils.setGprsEnabled("setMobileDataEnabled", true); Toast.makeText(this, "当前wifi接入关闭wifi强制启动数据连接", Toast.LENGTH_LONG).show(); apntype = networkUtils.getAPNType(this); if(apntype==3) { //如果强制接入的为cmnet那么执行强转为cmwap networkUtils.deletecmnet(); } break; case 2: Toast.makeText(this, "当前cmwap接入无需操作", Toast.LENGTH_LONG).show(); break; case 3: Toast.makeText(this, "当前cmnet接入强制转换为cmwap", Toast.LENGTH_LONG).show(); networkUtils.deletecmnet(); break; default: break; } Button bt = (Button) findViewById(R.id.bt1); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Uri uri = Uri.parse("http://m.10086.cn/s3/channnel/cr/600902000008654943/0026291/0001/"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); } }); } }
package com.c; import java.lang.reflect.Method; import android.content.ContentResolver; import android.content.Context; import android.database.SQLException; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.net.wifi.WifiManager; public class NetworkUtils { private static Context context; protected static Uri APN_LIST_URI; private static ConnectivityManager mCM; public NetworkUtils(Context c){ this.context=c; // APN列表资源 this.APN_LIST_URI = Uri.parse("content://telephony/carriers"); } /** 1 * @author zcmain 2 * 获取当前的网络状态 -1:没有网络 1:WIFI网络2:wap网络3:net网络 3 * @param context */ public static int getAPNType(Context context){ int WIFI = 1; int CMWAP = 2; int CMNET = 3; int netType = -1; ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); if(networkInfo==null) return netType; int apnType = networkInfo.getType(); if(apnType==ConnectivityManager.TYPE_MOBILE){ if(networkInfo.getExtraInfo().toLowerCase().equals("cmnet")){ netType = CMNET; }else{ netType = CMWAP; } }else if(apnType==ConnectivityManager.TYPE_WIFI){ netType = WIFI; } return netType; } /** * 是否开启 wifi true:开启 false:关闭 * * 一定要加入权限: <uses-permission * android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> * <uses-permission * android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> * * * @param isEnable */ public void setWifi(boolean isEnable) { WifiManager mWm = null; if (mWm == null) { mWm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); } if (isEnable) { if (!mWm.isWifiEnabled()) { mWm.setWifiEnabled(true); } } else { // 关闭 wifi if (mWm.isWifiEnabled()) { mWm.setWifiEnabled(false); } } } //检测当前GPRS数据连接是否打开 public boolean gprsIsOpenMethod(String methodName) { mCM = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); Class cmClass = mCM.getClass(); Class[] argClasses = null; Object[] argObject = null; Boolean isOpen = false; try { Method method = cmClass.getMethod(methodName, argClasses); isOpen = (Boolean) method.invoke(mCM, argObject); } catch (Exception e) { e.printStackTrace(); } return isOpen; } /** * 强制设备使用数据连接 * * @param flag * @return */ //强制设备使用数据连接 public void setGprsEnabled(String methodName, boolean isEnable) { mCM = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); Class cmClass = mCM.getClass(); Class[] argClasses = new Class[1]; argClasses[0] = boolean.class; try { Method method = cmClass.getMethod(methodName, argClasses); method.invoke(mCM, isEnable); } catch (Exception e) { e.printStackTrace(); } } public void deletecmnet(){ ContentResolver localContentResolver = context.getContentResolver(); Uri localUri = this.APN_LIST_URI; int localCursor = localContentResolver.delete(localUri, "apn LIKE 'cmnet'", null); } }
4.0及以上的听说Google限制了WRITE_APN_SETTINGS权限需要在源码环境下编译或者使用系统签名才可通过。
需要添加权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
相关文章推荐
- Android学习之网络APN接入点控制
- android设备获取当前所用网络类型和获取手机ip地址
- Android判断设备网络连接状态,并判断连接方式
- 一个嵌入式web服务器项目,实现通过手机Android App实现对嵌入式设备的控制
- 判断Android设备是否连接网络
- Android中使用代码控制Wifi及数据连接网络开关
- 关于蓝牙设备之间共享网络的问题(android4.2)
- 实战:使用NAP控制DHCP客户端接入网络
- android网络设备搜寻Nsd服务基本用法
- Android开发中检测网络和获取手机设备和防暴力点击工具类
- Android判断设备网络连接状态及判断连接方式的方法
- Android下基于Iptables的一种app网络访问控制方案(二)
- 如何实现远程控制网络设备
- 实时监控Android设备网络封包
- android 使用shell command实现对设备控制,实现按坐标点击
- 关于Android设备USBHID通信控制传输相关接口说明
- Android后门GhostCtrl,完美控制设备任意权限并窃取用户数据
- Android设备是否连接网络
- Vysor – 无需 root,用 Chrome 完全控制 Android 设备
- 在嵌入式设备上实现IPv6网络的接入