Android中使用代码控制Wifi及数据连接网络开关
2017-08-22 15:58
656 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[-]
控制WIFI开关
控制数据连接开关
有时我们需要在APP中控制WIFI和数据连接的开关,在Android中,是有相应的接口可以实现这一功能的。
控制WIFI开关需要使用WifiManager这一系统服务。首先我们通过代码获取到它:
1
通过WifiManager提供的接口,我们就可以实现控制WIFI的开关——我们首先判断当前WIFI的状态,如果是打开状态,则调用接口关闭;反之如果当前是关闭状态,则调用接口打开:
2
3
4
5
1
2
3
4
5
编写代码之后,我们还需要在AndroidManifest中声明相应的权限才能使代码正确生效,否则会抛出 Java.lang.SecurityException 异常。其中
isWifiEnabled接口需要申请 android.permission.ACCESS_WIFI_STATE 权限
setWifiEnabled接口需要申请android.permission.CHANGE_WIFI_STATE权限:
2
1
2
控制数据连接开关的情况稍复杂一些——首先Android 5.0以后的版本与4.4及以前版本接口不同;其次这些接口没有公开出来,我们需要通过反射的方法调用它们。
Android 4.4及以前版本
在Android 4.4及以前版本中,控制数据连接开关的接口隐藏在ConnectivityManager系统服务中,因此我们还是要先获取到相应系统服务:
1
在这个服务中,有getMobileDataEnabled和setMobileDataEnabled两个接口,分别是获取连接状态和设置连接的状态。
这两个接口的声明如下:
2
1
2
因此我们分别通过反射方法调用这些接口,并同样先判断状态,再进行开关控制:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
同样的,调用这些接口需要相应权限:
getMobileDataEnabled需要android.permission.ACCESS_NETWORK_STATE权限
setMobileDataEnabled需要android.permission.CHANGE_NETWORK_STATE权限
2
1
2
Android 5.0及以后版本
以上的代码在Android 5.0中运行没有任何效果,并且还会抛出“NoSuchMethod”异常。这是因为在Andrfoid 5.0中,原有的两个方法被废弃掉了,新的接口转移到了TelephonyManager系统服务中,因此我们先获得它:
1
新的接口是getDataEnabled和setDataEnabled,形式和以前完全类似(实际还有两个参数更多的方法,这里就省略了,后面会说明):
2
1
2
我们同样使用反射方法去调用:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
这两个接口同样也需要特定权限,其中
getDataEnabled需要权限android.permission.READ_PHONE_STATE
setDataEnabled需要权限android.permission.MODIFY_PHONE_STATE
添加权限以后会发现IDE会报错,说MODIFY这个权限Permission is only granted to system apps。这样看来Android 5.0以后只有系统APP才可以控制手机数据连接的开关了。
总结一下:
1.控制WIFI开关需要WifiManager系统服务,直接调用相关接口即可,此外还需要声明相应权限。
2.控制数据连接开关无论Android版本,由于系统没有公开这一API,因此都需要通过反射调用来实现。同时还要声明相应权限。此外对于Android 4.4以前版本,这一隐藏方法在ConnectivityManager系统服务中,系统/非系统应用均可调用;在Android 5.0以后版本中,更改连接状态则需要系统级APP的权限才可支持。
目录(?)[-]
控制WIFI开关
控制数据连接开关
有时我们需要在APP中控制WIFI和数据连接的开关,在Android中,是有相应的接口可以实现这一功能的。
控制WIFI开关
控制WIFI开关需要使用WifiManager这一系统服务。首先我们通过代码获取到它:WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);1
1
通过WifiManager提供的接口,我们就可以实现控制WIFI的开关——我们首先判断当前WIFI的状态,如果是打开状态,则调用接口关闭;反之如果当前是关闭状态,则调用接口打开:
if (wifiManager.isWifiEnabled()) { wifiManager.setWifiEnabled(false); } else { wifiManager.setWifiEnabled(true); }1
2
3
4
5
1
2
3
4
5
编写代码之后,我们还需要在AndroidManifest中声明相应的权限才能使代码正确生效,否则会抛出 Java.lang.SecurityException 异常。其中
isWifiEnabled接口需要申请 android.permission.ACCESS_WIFI_STATE 权限
setWifiEnabled接口需要申请android.permission.CHANGE_WIFI_STATE权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>1
2
1
2
控制数据连接开关
控制数据连接开关的情况稍复杂一些——首先Android 5.0以后的版本与4.4及以前版本接口不同;其次这些接口没有公开出来,我们需要通过反射的方法调用它们。 Android 4.4及以前版本
在Android 4.4及以前版本中,控制数据连接开关的接口隐藏在ConnectivityManager系统服务中,因此我们还是要先获取到相应系统服务:
ConnectivityManager conManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);1
1
在这个服务中,有getMobileDataEnabled和setMobileDataEnabled两个接口,分别是获取连接状态和设置连接的状态。
这两个接口的声明如下:
public boolean getMobileDataEnabled() public void setMobileDataEnabled(boolean enabled)1
2
1
2
因此我们分别通过反射方法调用这些接口,并同样先判断状态,再进行开关控制:
Class[] getArgArray = null; Class[] setArgArray = new Class[] {boolean.class}; Object[] getArgInvoke = null; try { Method mGetMethod = conManager.getClass().getMethod("getMobileDataEnabled", getArgArray); Method mSetMethod = conManager.getClass().getMethod("setMobileDataEnabled", setArgArray); boolean isOpen = (Boolean) mGetMethod.invoke(conManager, getArgInvoke); if (isOpen) { mSetMethod.invoke(conManager, false); } else { mSetMethod.invoke(conManager, true); } } catch (Exception e) { e.printStackTrace(); }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
同样的,调用这些接口需要相应权限:
getMobileDataEnabled需要android.permission.ACCESS_NETWORK_STATE权限
setMobileDataEnabled需要android.permission.CHANGE_NETWORK_STATE权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>1
2
1
2
Android 5.0及以后版本
以上的代码在Android 5.0中运行没有任何效果,并且还会抛出“NoSuchMethod”异常。这是因为在Andrfoid 5.0中,原有的两个方法被废弃掉了,新的接口转移到了TelephonyManager系统服务中,因此我们先获得它:
TelephonyManager teleManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);1
1
新的接口是getDataEnabled和setDataEnabled,形式和以前完全类似(实际还有两个参数更多的方法,这里就省略了,后面会说明):
public boolean getDataEnabled() public void setDataEnabled(boolean enable)1
2
1
2
我们同样使用反射方法去调用:
Class[] getArgArray = null; Class[] setArgArray = new Class[] {boolean.class}; Object[] getArgInvoke = null; try { Method mGetMethod = teleManager.getClass().getMethod("getDataEnabled", getArgArray); Method mSetMethod = teleManager.getClass().getMethod("setDataEnabled", setArgArray); boolean isOpen = (Boolean) mGetMethod.invoke(teleManager, getArgInvoke); if (isOpen) { mSetMethod.invoke(teleManager, false); } else { mSetMethod.invoke(teleManager, true); } } catch (Exception e) { e.printStackTrace(); }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
这两个接口同样也需要特定权限,其中
getDataEnabled需要权限android.permission.READ_PHONE_STATE
setDataEnabled需要权限android.permission.MODIFY_PHONE_STATE
添加权限以后会发现IDE会报错,说MODIFY这个权限Permission is only granted to system apps。这样看来Android 5.0以后只有系统APP才可以控制手机数据连接的开关了。
总结一下:
1.控制WIFI开关需要WifiManager系统服务,直接调用相关接口即可,此外还需要声明相应权限。
2.控制数据连接开关无论Android版本,由于系统没有公开这一API,因此都需要通过反射调用来实现。同时还要声明相应权限。此外对于Android 4.4以前版本,这一隐藏方法在ConnectivityManager系统服务中,系统/非系统应用均可调用;在Android 5.0以后版本中,更改连接状态则需要系统级APP的权限才可支持。
相关文章推荐
- Android中使用代码控制Wifi及数据连接网络开关
- Android中使用代码开关GPS、移动网络(GPRS)、WiFi
- Android中使用代码开关GPS、移动网络(GPRS)、WiFi
- Android中使用代码开关GPS、移动网络(GPRS)、WiFi
- Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程
- Android 判断当前网络状态及代码更改数据连接状态
- 浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power电源控制
- Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程
- 代码控制android手机的网络开关。
- 代码控制android手机网络的开关
- Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程
- Android建立网络连接,利用JSON数据获取百度图片搜索结果及GSON的简单使用
- 浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power电源控制
- android下如何通过jni监控wifi网络连接、dhcpcd执行和power电源控制
- 浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power电源控制
- 浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power电源控制
- 浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power电源控制
- 浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power电源控制
- 浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power电源控制
- 浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power电源控制