溫馨提示×

溫馨提示×

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

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

關(guān)于Android 如何實現(xiàn)mobile data on/off功能

發(fā)布時間:2020-07-30 11:10:04 來源:網(wǎng)絡 閱讀:1495 作者:我不會抽煙 欄目:移動開發(fā)

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

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

實現(xiàn)這個功能,我們需要根據(jù)Android系統(tǒng)的版本將其分成兩個階段,分別實現(xiàn)。

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

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());
    }
}

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

在2.3版本及以上的Android系統(tǒng)中,可以使用 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);
        }

使用時也是直接調(diào)用就可以,context傳入的是當前activity的對象,enabled傳入true/false,控制開關(guān)。

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

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

此權(quán)限。


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

//檢查當前的網(wǎng)絡狀態(tài)
        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已經(jīng)打開
                if(wifiinfo.isConnected())
                {
                    //wifi已經(jīng)連接上
                }
                else
                {
                    //wifi可用,但是沒有進行連接
                }
            }
            else
            {
                //如果wifi為關(guān)閉狀態(tài)
            }
                                                         
            if(mobileinfo != null && mobileinfo.isAvailable())
            {
                //移動數(shù)據(jù)連接 可用
                                                             
                if(mobileinfo.isConnected())
                {
                    //移動數(shù)據(jù)已經(jīng)連接
                }
                else
                {
                    //移動數(shù)據(jù)未連接
                }
            }
            else
            {
                //說明該設(shè)備并沒有移動數(shù)據(jù)連接功能
            }
                                                     
        }

上面的方法是判斷wifi連接還是正常的移動數(shù)據(jù)連接

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

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問一下細節(jié)

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

AI