1. 程式人生 > >判斷網路是否可用以及當前手機的網路型別

判斷網路是否可用以及當前手機的網路型別

前言


  1. android的入門開發教程最近都沒怎麼更新,實在是抱歉,主要是最近公司的專案趕,實在是抽不出時間來寫,但最近一定會補上。公司一直都沒有配電腦,沒辦法,一個字:窮!我之前一直都用的我用了5年的華碩電腦,但是編譯專案實在是太卡了。我實在是忍不了了。所以上個星期我新換了電腦,1w5的mac,真是貴。辛辛苦苦攢了大半年的工資,上一個月就全部被我敗完了。- -真是罪過,罪過。不過換了mac我感覺我的工作效率提升了不少。所以我感覺這投資還是值得的,為自己投資嘛!呸,又扯遠了!

  2. 前幾天產品說了一個需求,需要在登陸頁面的時候判斷一下網路型別,這個問題我在之前的專案中遇到過,當時也沒怎麼想,所以就直接去百度搜來了貼上上去了,這次又遇到了這樣一個功能,於是又打算去百度搜。但是想了想,覺得總這樣也不是個辦法,所以自己就花時間總結了一下,順便也完善了一下自己的幾個工具類!

  3. 關於網路這方面的問題,我們可以使用的系統管理器有兩個,TelephonyManager和ConnectivityManager, 前者主要是判斷網路的型別,而後者主要是判斷是否連線!例如我們在ConnectivityManager中判斷網路型別常用的api主要有如下兩種,不是wifi就是手機網路:
  1. ConnectivityManager.TYPE_MOBILE –>手機網路型別為手機的網路
  2. ConnectivityManager.TYPE_WIFI –>手機網路型別為wifi
  3. 當然ConnectivityManager可以判斷的連線型別還有很多,比如藍芽連線等。有興趣的小夥伴可以查一查ConnectivityManager中其他的連線型別。這裡我就不過多敘述了。
  4. ConnectivityManager.TYPE_BLUETOOTH —>藍芽連線

關於獲取網路是否可用的問題

//判斷網路是否可用
public static boolean isNetworkConnected(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    return netInfo != null && netInfo.isConnected();
}    
備註:
  1. 如果僅僅是用來判斷網路連線,則可以使用 cm.getActiveNetworkInfo().isAvailable();
  2. 需要新增訪問網路狀態許可權

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

判斷當前的網路型別,可判斷wifi型別,2G,3G以及4G型別

   // 判斷網路型別
public static String getNetWorkType(Context context){
    String netWorkState = "";
    TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);
    ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE));
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if(networkInfo != null && networkInfo.isAvailable()){
        if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI){
            //網路狀態為wifi
            netWorkState = "WIFI";
            return netWorkState;
        }
        else if(networkInfo.getType() == ConnectivityManager.TYPE_MOBILE){
            //網路狀態為手機
            //判斷手機網路是2g , 3g, 以及4g
            //String subtypeName = networkInfo.getSubtypeName();
            //System.out.println("網路型別: subtypeName:" + subtypeName);
            //這裡我根據的是電話管理器中的型別來進行判斷,
            //當然你也可以根據subtuypeName來判斷,這個是從連線管理器中拿到的
            int type = telephonyManager.getNetworkType();
            System.out.println("網路型別: type:" + type);
            switch (type){
                case TelephonyManager.NETWORK_TYPE_GPRS:
                case TelephonyManager.NETWORK_TYPE_EDGE:
                case TelephonyManager.NETWORK_TYPE_CDMA:
                case TelephonyManager.NETWORK_TYPE_1xRTT:
                case TelephonyManager.NETWORK_TYPE_IDEN:
                    netWorkState = "2G";
                    return netWorkState;
                case TelephonyManager.NETWORK_TYPE_UMTS:
                case TelephonyManager.NETWORK_TYPE_EVDO_0:
                case TelephonyManager.NETWORK_TYPE_EVDO_A:
                case TelephonyManager.NETWORK_TYPE_HSDPA:
                case TelephonyManager.NETWORK_TYPE_HSUPA:
                case TelephonyManager.NETWORK_TYPE_HSPA:
                case TelephonyManager.NETWORK_TYPE_EVDO_B:
                case TelephonyManager.NETWORK_TYPE_EHRPD:
                case TelephonyManager.NETWORK_TYPE_HSPAP:
                    netWorkState = "3G";
                    return netWorkState;
                case TelephonyManager.NETWORK_TYPE_LTE:
                    netWorkState = "4G";
                    return netWorkState;
                case TelephonyManager.NETWORK_TYPE_UNKNOWN:
                default:
                    netWorkState = "unknown network type";
                    return netWorkState;

            }

        }
    }
    return "";
}

總結

該封裝的我已經都封裝好了,我也測試了部分機器,我自己的手機和公司的測試機都能夠識別所屬網路型別,我覺得這個工具類應該可以滿足大部分情況了,當然我自己也有考慮不周全的情況,如果發現了錯誤,請各位大神不吝指正,萬分感謝!