Android打开WIFI或者移动网络的代码实现
时间:03-25 10:41 阅读:1230次
*温馨提示:点击图片可以放大观看高清大图
简介:Android打开WIFI或者移动网络的代码实现
001
packagewy.testnetwork;
002
003
importjava.lang.reflect.Field;
004
importjava.lang.reflect.InvocationTargetException;
005
importjava.lang.reflect.Method;
006
importandroid.net.ConnectivityManager;
007
importandroid.net.wifi.WifiManager;
008
importandroid.os.Bundle;
009
importandroid.app.Activity;
010
importandroid.content.Context;
011
/**
012
* Demo描述:
013
* 通过代码打开wifi或者移动网络
014
*
015
* 学习资料:
016
* 1 http://blog.csdn.net/way_ping_li/article/details/8493700
017
* 2 http://stackoverflow.com/questions/12535101/how-can-i-turn-off-3g-data-programmatically-on-android
018
* 3 http://www.cnblogs.com/willyan/archive/2012/07/03/2574513.html
019
* 4 http://ask.csdn.net/questions/152
020
* 5 http://blog.csdn.net/lfdfhl/article/details/10311505
021
* 6 http://blog.csdn.net/tu_bingbing/article/details/8469871
022
* 7 http://blog.csdn.net/stevenhu_223/article/details/9052083
023
* Thank you very much
024
*
025
* 备注说明:
026
* 1 在学习资料1中还涉及到利用代码打开GPS
027
* 2 通过代码打开wifi和移动网络在某些机型上是不可实现的
028
*
029
*/
030
publicclassMainActivityextendsActivity {
031
@Override
032
protectedvoidonCreate(Bundle savedInstanceState) {
033
super.onCreate(savedInstanceState);
034
setContentView(R.layout.main);
035
toggleWiFi(this,false);
036
toggleMobileData(this,true);
037
}
038
039
040
//设置是否打开Wifi
041
privatevoidtoggleWiFi(Context context,booleanenabled) {
042
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
043
wifiManager.setWifiEnabled(enabled);
044
}
045
046
/**
047
* 设置是否打开移动网络
048
*
049
* 但没有直接的API可调用,但是我们发现:
050
* 在ConnectivityManager中有一隐藏的方法setMobileDataEnabled()
051
* 源码如下:
052
* public void setMobileDataEnabled(boolean enabled) {
053
* try {
054
* mService.setMobileDataEnabled(enabled);
055
* } catch (RemoteException e) {
056
* }
057
* }
058
*
059
* 这里的重点就是mService,查看其声明:
060
* private IConnectivityManager mService;
061
* 继续查看源码可知IConnectivityManager为了一个AIDL(接口interface IConnectivityManager)
062
*
063
*
064
* 调用过程:
065
* ConnectivityManager中有一隐藏的方法setMobileDataEnabled()
066
* 在setMobileDataEnabled()中调用了IConnectivityManager中的setMobileDataEnabled(boolean)
067
*
068
* 所以我们首先需要反射出ConnectivityManager类的成员变量mService(IConnectivityManager类型)
069
*/
070
privatevoidtoggleMobileData(Context context,booleanenabled) {
071
ConnectivityManager connectivityManager =
072
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
073
074
//ConnectivityManager类
075
Class<?> connectivityManagerClass =null;
076
//ConnectivityManager类中的字段
077
Field connectivityManagerField =null;
078
079
080
//IConnectivityManager接口
081
Class<?> iConnectivityManagerClass =null;
082
//IConnectivityManager接口的对象
083
Object iConnectivityManagerObject =null;
084
//IConnectivityManager接口的对象的方法
085
Method setMobileDataEnabledMethod =null;
086
087
try{
088
//取得ConnectivityManager类
089
connectivityManagerClass = Class.forName(connectivityManager.getClass().getName());
090
//取得ConnectivityManager类中的字段mService
091
connectivityManagerField = connectivityManagerClass.getDeclaredField("mService");
092
//取消访问私有字段的合法性检查
093
//该方法来自java.lang.reflect.AccessibleObject
094
connectivityManagerField.setAccessible(true);
095
096
097
//实例化mService
098
//该get()方法来自java.lang.reflect.Field
099
//一定要注意该get()方法的参数:
100
//它是mService所属类的对象
101
//完整例子请参见:
102
//http://blog.csdn.net/lfdfhl/article/details/13509839
103
iConnectivityManagerObject = connectivityManagerField.get(connectivityManager);
104
//得到mService所属接口的Class
105
iConnectivityManagerClass = Class.forName(iConnectivityManagerObject.getClass().getName());
106
//取得IConnectivityManager接口中的setMobileDataEnabled(boolean)方法
107
//该方法来自java.lang.Class.getDeclaredMethod
108
setMobileDataEnabledMethod =
109
iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
110
//取消访问私有方法的合法性检查
111
//该方法来自java.lang.reflect.AccessibleObject
112
setMobileDataEnabledMethod.setAccessible(true);
113
//调用setMobileDataEnabled方法
114
setMobileDataEnabledMethod.invoke(iConnectivityManagerObject,enabled);
115
}catch(ClassNotFoundException e) {
116
e.printStackTrace();
117
}catch(NoSuchFieldException e) {
118
e.printStackTrace();
119
}catch(SecurityException e) {
120
e.printStackTrace();
121
}catch(NoSuchMethodException e) {
122
e.printStackTrace();
123
}catch(IllegalArgumentException e) {
124
e.printStackTrace();
125
}catch(IllegalAccessException e) {
126
e.printStackTrace();
127
}catch(InvocationTargetException e) {
128
e.printStackTrace();
129
}
130
}
131
132
133
}
AndroidManifest.xml如下:
01
<?xmlversion="1.0"encoding="utf-8"?>
02
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
03
package="wy.testnetwork"
04
android:versionCode="1"
05
android:versionName="1.0">
06
07
<uses-sdk
08
android:minSdkVersion="10"
09
android:targetSdkVersion="10"/>
10
11
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
12
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
13
<uses-permissionandroid:name="android.permission.CHANGE_NETWORK_STATE"/>
14
<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>
15
16
<application
17
android:allowBackup="true"
18
android:icon="@drawable/ic_launcher"
19
android:label="@string/app_name"
20
android:theme="@style/AppTheme">
21
<activity
22
android:name="wy.testnetwork.MainActivity"
23
android:label="@string/app_name">
24
<intent-filter>
25
<actionandroid:name="android.intent.action.MAIN"/>
26
27
<categoryandroid:name="android.intent.category.LAUNCHER"/>
28
</intent-filter>
29
</activity>
30
</application>
31
32
</manifest>
main.xml如下
01
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
02
xmlns:tools="http://schemas.android.com/tools"
03
android:layout_width="match_parent"
04
android:layout_height="match_parent"
05
tools:context=".MainActivity">
06
07
<TextView
08
android:layout_width="wrap_content"
09
android:layout_height="wrap_content"
10
android:text="通过代码打开wifi或者移动网络"
11
android:layout_centerHorizontal="true"
12
android:layout_marginTop="50dip"
13
/>
14
15
</RelativeLayout>