Android打开WIFI或者移动网络的代码实现

来源:本站
导读:目前正在解读《Android打开WIFI或者移动网络的代码实现》的相关信息,《Android打开WIFI或者移动网络的代码实现》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《Android打开WIFI或者移动网络的代码实现》的详细说明。
简介:Android打开WIFI或者移动网络的代码实现

001packagewy.testnetwork;002003importjava.lang.reflect.Field;004importjava.lang.reflect.InvocationTargetException;005importjava.lang.reflect.Method;006importandroid.net.ConnectivityManager;007importandroid.net.wifi.WifiManager;008importandroid.os.Bundle;009importandroid.app.Activity;010importandroid.content.Context;011/**012* Demo描述:013* 通过代码打开wifi或者移动网络014*015* 学习资料:016* 1 http://blog.csdn.net/way_ping_li/article/details/8493700017* 2 http://stackoverflow.com/questions/12535101/how-can-i-turn-off-3g-data-programmatically-on-android018* 3 http://www.cnblogs.com/willyan/archive/2012/07/03/2574513.html019* 4 http://ask.csdn.net/questions/152020* 5 http://blog.csdn.net/lfdfhl/article/details/10311505021* 6 http://blog.csdn.net/tu_bingbing/article/details/8469871022* 7 http://blog.csdn.net/stevenhu_223/article/details/9052083023* Thank you very much024*025* 备注说明:026* 1 在学习资料1中还涉及到利用代码打开GPS027* 2 通过代码打开wifi和移动网络在某些机型上是不可实现的028*029*/030publicclassMainActivityextendsActivity {031@Override032protectedvoidonCreate(Bundle savedInstanceState) {033super.onCreate(savedInstanceState);034setContentView(R.layout.main);035toggleWiFi(this,false);036toggleMobileData(this,true);037}038039040//设置是否打开Wifi041privatevoidtoggleWiFi(Context context,booleanenabled) {042WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);043wifiManager.setWifiEnabled(enabled);044}045046/**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*/070privatevoidtoggleMobileData(Context context,booleanenabled) {071ConnectivityManager connectivityManager =072(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);073074//ConnectivityManager类075Class<?> connectivityManagerClass =null;076//ConnectivityManager类中的字段077Field connectivityManagerField =null;078079080//IConnectivityManager接口081Class<?> iConnectivityManagerClass =null;082//IConnectivityManager接口的对象083Object iConnectivityManagerObject =null;084//IConnectivityManager接口的对象的方法085Method setMobileDataEnabledMethod =null;086087try{088//取得ConnectivityManager类089connectivityManagerClass = Class.forName(connectivityManager.getClass().getName());090//取得ConnectivityManager类中的字段mService091connectivityManagerField = connectivityManagerClass.getDeclaredField("mService");092//取消访问私有字段的合法性检查093//该方法来自java.lang.reflect.AccessibleObject094connectivityManagerField.setAccessible(true);095096097//实例化mService098//该get()方法来自java.lang.reflect.Field099//一定要注意该get()方法的参数:100//它是mService所属类的对象101//完整例子请参见:102//http://blog.csdn.net/lfdfhl/article/details/13509839103iConnectivityManagerObject = connectivityManagerField.get(connectivityManager);104//得到mService所属接口的Class105iConnectivityManagerClass = Class.forName(iConnectivityManagerObject.getClass().getName());106//取得IConnectivityManager接口中的setMobileDataEnabled(boolean)方法107//该方法来自java.lang.Class.getDeclaredMethod108setMobileDataEnabledMethod =109iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);110//取消访问私有方法的合法性检查111//该方法来自java.lang.reflect.AccessibleObject112setMobileDataEnabledMethod.setAccessible(true);113//调用setMobileDataEnabled方法114setMobileDataEnabledMethod.invoke(iConnectivityManagerObject,enabled);115}catch(ClassNotFoundException e) {116e.printStackTrace();117}catch(NoSuchFieldException e) {118e.printStackTrace();119}catch(SecurityException e) {120e.printStackTrace();121}catch(NoSuchMethodException e) {122e.printStackTrace();123}catch(IllegalArgumentException e) {124e.printStackTrace();125}catch(IllegalAccessException e) {126e.printStackTrace();127}catch(InvocationTargetException e) {128e.printStackTrace();129}130}131132133}

AndroidManifest.xml如下:

01<?xmlversion="1.0"encoding="utf-8"?>02<manifestxmlns:android="http://schemas.android.com/apk/res/android"03package="wy.testnetwork"04android:versionCode="1"05android:versionName="1.0">0607<uses-sdk08android:minSdkVersion="10"09android:targetSdkVersion="10"/>1011<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"/>1516<application17android:allowBackup="true"18android:icon="@drawable/ic_launcher"19android:label="@string/app_name"20android:theme="@style/AppTheme">21<activity22android:name="wy.testnetwork.MainActivity"23android:label="@string/app_name">24<intent-filter>25<actionandroid:name="android.intent.action.MAIN"/>2627<categoryandroid:name="android.intent.category.LAUNCHER"/>28</intent-filter>29</activity>30</application>3132</manifest>

main.xml如下

01<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"02xmlns:tools="http://schemas.android.com/tools"03android:layout_width="match_parent"04android:layout_height="match_parent"05tools:context=".MainActivity">0607<TextView08android:layout_width="wrap_content"09android:layout_height="wrap_content"10android:text="通过代码打开wifi或者移动网络"11android:layout_centerHorizontal="true"12android:layout_marginTop="50dip"13/>1415</RelativeLayout>

提醒:《Android打开WIFI或者移动网络的代码实现》最后刷新时间 2024-03-14 01:06:57,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《Android打开WIFI或者移动网络的代码实现》该内容的真实性请自行鉴别。