Android打開WIFI或者移動網絡的代碼實現

jopen 11年前發布 | 63K 次閱讀 Android Android開發 移動開發

package wy.testnetwork;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
/**

 //設置是否打開Wifi  
private void toggleWiFi(Context context, boolean enabled) {  
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);  
    wifiManager.setWifiEnabled(enabled);  
}  

/** 
 * 設置是否打開移動網絡 
 *  
 * 但沒有直接的API可調用,但是我們發現: 
 * 在ConnectivityManager中有一隱藏的方法setMobileDataEnabled() 
 * 源碼如下: 
 * public void setMobileDataEnabled(boolean enabled) { 
 *   try { 
 *      mService.setMobileDataEnabled(enabled); 
 *   } catch (RemoteException e) { 
 *      } 
 * } 
 *  
 * 這里的重點就是mService,查看其聲明: 
 * private IConnectivityManager mService; 
 * 繼續查看源碼可知IConnectivityManager為了一個AIDL(接口interface IConnectivityManager) 
 *  
 *  
 * 調用過程: 
 * ConnectivityManager中有一隱藏的方法setMobileDataEnabled() 
 * 在setMobileDataEnabled()中調用了IConnectivityManager中的setMobileDataEnabled(boolean) 
 *  
 * 所以我們首先需要反射出ConnectivityManager類的成員變量mService(IConnectivityManager類型) 
 */  
private void toggleMobileData(Context context, boolean enabled) {    
    ConnectivityManager connectivityManager =   
    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  

    //ConnectivityManager類    
    Class<?> connectivityManagerClass = null;  
    //ConnectivityManager類中的字段    
    Field connectivityManagerField = null;  


    //IConnectivityManager接口  
    Class<?> iConnectivityManagerClass = null;  
    //IConnectivityManager接口的對象  
    Object iConnectivityManagerObject = null;  
    //IConnectivityManager接口的對象的方法  
    Method setMobileDataEnabledMethod = null;  

    try {  
        //取得ConnectivityManager類  
        connectivityManagerClass = Class.forName(connectivityManager.getClass().getName());  
        //取得ConnectivityManager類中的字段mService  
        connectivityManagerField = connectivityManagerClass.getDeclaredField("mService");  
        //取消訪問私有字段的合法性檢查   
        //該方法來自java.lang.reflect.AccessibleObject  
        connectivityManagerField.setAccessible(true);  


        //實例化mService  
        //該get()方法來自java.lang.reflect.Field  
        //一定要注意該get()方法的參數:  
        //它是mService所屬類的對象  
        //完整例子請參見:  
        //http://blog.csdn.net/lfdfhl/article/details/13509839  
        iConnectivityManagerObject = connectivityManagerField.get(connectivityManager);  
        //得到mService所屬接口的Class  
        iConnectivityManagerClass = Class.forName(iConnectivityManagerObject.getClass().getName());  
        //取得IConnectivityManager接口中的setMobileDataEnabled(boolean)方法  
        //該方法來自java.lang.Class.getDeclaredMethod  
        setMobileDataEnabledMethod =   
        iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);  
        //取消訪問私有方法的合法性檢查   
        //該方法來自java.lang.reflect.AccessibleObject  
        setMobileDataEnabledMethod.setAccessible(true);  
        //調用setMobileDataEnabled方法  
        setMobileDataEnabledMethod.invoke(iConnectivityManagerObject,enabled);  
    } catch (ClassNotFoundException e) {     
        e.printStackTrace();    
    } catch (NoSuchFieldException e) {     
        e.printStackTrace();    
    } catch (SecurityException e) {     
        e.printStackTrace();    
    } catch (NoSuchMethodException e) {     
        e.printStackTrace();    
    } catch (IllegalArgumentException e) {     
        e.printStackTrace();    
    } catch (IllegalAccessException e) {     
        e.printStackTrace();    
    } catch (InvocationTargetException e) {     
        e.printStackTrace();    
    }   
}  


}</pre>AndroidManifest.xml如下:


<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    package="wy.testnetwork"  
    android:versionCode="1"  
    android:versionName="1.0" >  

    <uses-sdk  
        android:minSdkVersion="10"  
        android:targetSdkVersion="10" />  

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  

    <application  
        android:allowBackup="true"  
        android:icon="@drawable/ic_launcher"  
        android:label="@string/app_name"  
        android:theme="@style/AppTheme" >  
        <activity  
            android:name="wy.testnetwork.MainActivity"  
            android:label="@string/app_name" >  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  

                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
    </application>  

</manifest>
main.xml如下

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    tools:context=".MainActivity" >  

    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="通過代碼打開wifi或者移動網絡"   
        android:layout_centerHorizontal="true"  
        android:layout_marginTop="50dip"  
    />  

</RelativeLayout>



 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!