判斷網路是否可用以及當前手機的網路型別
阿新 • • 發佈:2019-01-23
前言
android的入門開發教程最近都沒怎麼更新,實在是抱歉,主要是最近公司的專案趕,實在是抽不出時間來寫,但最近一定會補上。公司一直都沒有配電腦,沒辦法,一個字:窮!我之前一直都用的我用了5年的華碩電腦,但是編譯專案實在是太卡了。我實在是忍不了了。所以上個星期我新換了電腦,1w5的mac,真是貴。辛辛苦苦攢了大半年的工資,上一個月就全部被我敗完了。- -真是罪過,罪過。不過換了mac我感覺我的工作效率提升了不少。所以我感覺這投資還是值得的,為自己投資嘛!呸,又扯遠了!
前幾天產品說了一個需求,需要在登陸頁面的時候判斷一下網路型別,這個問題我在之前的專案中遇到過,當時也沒怎麼想,所以就直接去百度搜來了貼上上去了,這次又遇到了這樣一個功能,於是又打算去百度搜。但是想了想,覺得總這樣也不是個辦法,所以自己就花時間總結了一下,順便也完善了一下自己的幾個工具類!
- 關於網路這方面的問題,我們可以使用的系統管理器有兩個,TelephonyManager和ConnectivityManager, 前者主要是判斷網路的型別,而後者主要是判斷是否連線!例如我們在ConnectivityManager中判斷網路型別常用的api主要有如下兩種,不是wifi就是手機網路:
- ConnectivityManager.TYPE_MOBILE –>手機網路型別為手機的網路
- ConnectivityManager.TYPE_WIFI –>手機網路型別為wifi
- 當然ConnectivityManager可以判斷的連線型別還有很多,比如藍芽連線等。有興趣的小夥伴可以查一查ConnectivityManager中其他的連線型別。這裡我就不過多敘述了。
- 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(); }
- 如果僅僅是用來判斷網路連線,則可以使用 cm.getActiveNetworkInfo().isAvailable();
需要新增訪問網路狀態許可權
<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 "";
}
總結
該封裝的我已經都封裝好了,我也測試了部分機器,我自己的手機和公司的測試機都能夠識別所屬網路型別,我覺得這個工具類應該可以滿足大部分情況了,當然我自己也有考慮不周全的情況,如果發現了錯誤,請各位大神不吝指正,萬分感謝!