溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于Android 如何實現mobile data on/off功能

發布時間:2020-07-30 11:10:04 來源:網絡 閱讀:1517 作者:我不會抽煙 欄目:移動開發

最近在做mobile data on/off的功能,可能我說mobile data大家沒什么概念,但是我如果說wifi on/off大家一定知道,而且也曉得如何去實現,mobile data其實就是我們不用wifi的時候,用自己手機里的SIM卡上網流量,即那個數據交換的開關。

這部分對我來說其實也是陌生的地方,不過通過上網查資料,也逐漸了解了一些,下面跟大伙分享一下:

實現這個功能,我們需要根據Android系統的版本將其分成兩個階段,分別實現。

在2.3版本以下,我們需要用所謂的Java反射機制去實現

public void switchMobileData(boolean on) throws Exception{
    try{
        Method dataConnSwitchMethod;
        Class telephonyManagerClass;
        Object ITelephonyStub;
        Class ITelephonyClass;
        TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        switch(telephonyManager.getDataState()){
        case TelephonyManager.DATA_CONNECTED:
            System.out.println("DATA_CONNECTED");
            break;
        case TelephonyManager.DATA_DISCONNECTED:
            System.out.println("DATA_DISCONNECTED");
            break;
        }
                                                                                                                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                                                                                                        
        telephonyManagerClass = Class.forName(telephonyManager.getClass().getName());
        Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony");
        getITelephonyMethod.setAccessible(true);
        ITelephonyStub = getITelephonyMethod.invoke(telephonyManager);
        ITelephonyClass = Class.forName(ITelephonyStub.getClass().getName());
                                                                                                                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                                                                                                        
        if(on){
            System.out.println("on is true" );
            dataConnSwitchMethod = ITelephonyClass.getDeclaredMethod("enableDataConnectivity");
        }
        else{
            System.out.println("on is false" );
            dataConnSwitchMethod = ITelephonyClass.getDeclaredMethod("disableDataConnectivity");
        }
        dataConnSwitchMethod.setAccessible(true);
        dataConnSwitchMethod.invoke(ITelephonyStub);
    }
    catch (Exception e) {
        // TODO: handle exception
        Log.e("Error", e.toString());
    }
}

使用時直接調用上面的函數,參數列表true/false分別代表開/關。不過2.3版本以下此功能有一個限制,就是必須在手動將數據交換圖標點亮后,才能去控制mobile data的on/off,而且,就是在off之后,數據交換圖標還是亮著的狀態,不過這個時候上不了網罷了,但是如果你不亮開數據交換圖標,再怎么調用也還是沒有用的。

在2.3版本及以上的Android系統中,可以使用 IConnectivityManager.setMobileDataEnabled() 這是個隱藏的方法,就是直接控制手機 'Settings -> Wireless & network -> Mobile network settings -> Data Enabled' 這個操作路徑下的方法,也就是我想控制的mobile data

public static  void setMobileDataEnabled(Context context, boolean enabled){
            final ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            Class cmClass = Class.forName(cm.getClass().getName());
            final Field iConnectivityManagerField = cmClass.getDeclaredField("mService");
            iConnectivityManagerField.setAccessible(true);
            final Object iConnectivityManager = iConnectivityManagerField.get(cm);
            final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
            final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled",  Boolean.TYPE );    
            setMobileDataEnabledMethod.setAccessible(true);
            setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
        }

使用時也是直接調用就可以,context傳入的是當前activity的對象,enabled傳入true/false,控制開關。

以上兩個方法就是針對 mobile data on/off的實現,大家不要忘記需要在AndroidManifest.xml中加入

<uses-permission android:name="android.permission.MODIFY_PHONE_STATE">
</uses-permission>

此權限。


說到這就順便把如何查看當前設備的網絡連接跟大伙說一下,因為通常這些都是配套使用的。

//檢查當前的網絡狀態
        public static  void checkNetworkState(Menu menu, Context context){
            ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo wifiinfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            NetworkInfo mobileinfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
                                                         
            if(wifiinfo != null && wifiinfo.isAvailable())
            {
                //如果wifi已經打開
                if(wifiinfo.isConnected())
                {
                    //wifi已經連接上
                }
                else
                {
                    //wifi可用,但是沒有進行連接
                }
            }
            else
            {
                //如果wifi為關閉狀態
            }
                                                         
            if(mobileinfo != null && mobileinfo.isAvailable())
            {
                //移動數據連接 可用
                                                             
                if(mobileinfo.isConnected())
                {
                    //移動數據已經連接
                }
                else
                {
                    //移動數據未連接
                }
            }
            else
            {
                //說明該設備并沒有移動數據連接功能
            }
                                                     
        }

上面的方法是判斷wifi連接還是正常的移動數據連接

還有一種方法就是比較全的,可以把所有的與當前設備連接或可以使用的網絡顯示出來

public void showNetworkAvailable(){
        ConnectivityManager cm = (ConnectivityManager)MainActivity.this.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] nwInfos = cm.getAllNetworkInfo();
        for(NetworkInfo nwInfo : nwInfos){
            System.out.println("network type name="+nwInfo.getTypeName());
            System.out.println("network available="+nwInfo.isAvailable());
            System.out.println("network c_or-c="+nwInfo.isConnectedOrConnecting());
            System.out.println("network connected="+nwInfo.isConnected());
        }
    }


以上資料大部分是從國外的StackOverflow上了解到的,而且我也均真正測試過,是好用的。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女