1. 程式人生 > >Android開發之獲取網路型別(WIFI、2G、3G、4G)和運營商名稱

Android開發之獲取網路型別(WIFI、2G、3G、4G)和運營商名稱

  在Android開發中,常常使用到網路,可能需要針對不同的網路(WIFI或者流量),需要做不同的處理,那麼怎麼獲取當前網路呢?為此寫了個工具類,以後需要使用,直接拿來用就行(就喜歡拿來主義,哈哈)。

package com.wangguifa.phonestate;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;

/**
 * Created by wangguifa on 2017/5/22
 * 獲取網路狀態工具類
 */
public class NetUtils { public static final int NETWORK_NONE = 0; // 沒有網路連線 public static final int NETWORK_WIFI = 1; // wifi連線 public static final int NETWORK_2G = 2; // 2G public static final int NETWORK_3G = 3; // 3G public static final int NETWORK_4G = 4; // 4G public static final int
NETWORK_MOBILE = 5; // 手機流量 /** * 獲取運營商名字 * * @param context context * @return int */ public static String getOperatorName(Context context) { /* * getSimOperatorName()就可以直接獲取到運營商的名字 * 也可以使用IMSI獲取,getSimOperator(),然後根據返回值判斷,例如"46000"為移動 * IMSI相關連結:http://baike.baidu.com/item/imsi */
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); // getSimOperatorName就可以直接獲取到運營商的名字 return telephonyManager.getSimOperatorName(); } /** * 獲取當前網路連線的型別 * * @param context context * @return int */ public static int getNetworkState(Context context) { ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // 獲取網路服務 if (null == connManager) { // 為空則認為無網路 return NETWORK_NONE; } // 獲取網路型別,如果為空,返回無網路 NetworkInfo activeNetInfo = connManager.getActiveNetworkInfo(); if (activeNetInfo == null || !activeNetInfo.isAvailable()) { return NETWORK_NONE; } // 判斷是否為WIFI NetworkInfo wifiInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (null != wifiInfo) { NetworkInfo.State state = wifiInfo.getState(); if (null != state) { if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) { return NETWORK_WIFI; } } } // 若不是WIFI,則去判斷是2G、3G、4G網 TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); int networkType = telephonyManager.getNetworkType(); switch (networkType) { /* GPRS : 2G(2.5) General Packet Radia Service 114kbps EDGE : 2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps UMTS : 3G WCDMA 聯通3G Universal Mobile Telecommunication System 完整的3G移動通訊技術標準 CDMA : 2G 電信 Code Division Multiple Access 分碼多重進接 EVDO_0 : 3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution - Data Only (Data Optimized) 153.6kps - 2.4mbps 屬於3G EVDO_A : 3G 1.8mbps - 3.1mbps 屬於3G過渡,3.5G 1xRTT : 2G CDMA2000 1xRTT (RTT - 無線電傳輸技術) 144kbps 2G的過渡, HSDPA : 3.5G 高速下行分組接入 3.5G WCDMA High Speed Downlink Packet Access 14.4mbps HSUPA : 3.5G High Speed Uplink Packet Access 高速上行鏈路分組接入 1.4 - 5.8 mbps HSPA : 3G (分HSDPA,HSUPA) High Speed Packet Access IDEN : 2G Integrated Dispatch Enhanced Networks 整合數字增強型網路 (屬於2G,來自維基百科) EVDO_B : 3G EV-DO Rev.B 14.7Mbps 下行 3.5G LTE : 4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G過渡,升級版 LTE Advanced 才是4G EHRPD : 3G CDMA2000向LTE 4G的中間產物 Evolved High Rate Packet Data HRPD的升級 HSPAP : 3G HSPAP 比 HSDPA 快些 */ // 2G網路 case TelephonyManager.NETWORK_TYPE_GPRS: case TelephonyManager.NETWORK_TYPE_CDMA: case TelephonyManager.NETWORK_TYPE_EDGE: case TelephonyManager.NETWORK_TYPE_1xRTT: case TelephonyManager.NETWORK_TYPE_IDEN: return NETWORK_2G; // 3G網路 case TelephonyManager.NETWORK_TYPE_EVDO_A: case TelephonyManager.NETWORK_TYPE_UMTS: case TelephonyManager.NETWORK_TYPE_EVDO_0: 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: return NETWORK_3G; // 4G網路 case TelephonyManager.NETWORK_TYPE_LTE: return NETWORK_4G; default: return NETWORK_MOBILE; } } /** * 判斷網路是否連線 * * @param context context * @return true/false */ public static boolean isNetConnected(Context context) { ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo info = connectivity.getActiveNetworkInfo(); if (info != null && info.isConnected()) { if (info.getState() == NetworkInfo.State.CONNECTED) { return true; } } } return false; } /** * 判斷是否wifi連線 * * @param context context * @return true/false */ public static synchronized boolean isWifiConnected(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivityManager != null) { NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null) { int networkInfoType = networkInfo.getType(); if (networkInfoType == ConnectivityManager.TYPE_WIFI || networkInfoType == ConnectivityManager.TYPE_ETHERNET) { return networkInfo.isConnected(); } } } return false; } }

  上面的註釋已經很清楚了,應該都能看懂。講此工具類直接複製到專案即可,複製完了以後別忘了加許可權,獲取網路狀態是需要許可權的:

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

  這樣就大功告成,下面來測試一下吧:


4G網路狀態
4G網路狀態

無網路狀態
無網路狀態

WIFI狀態
WIFI狀態

  通過上面測試,可以看出可以獲得運營商和網路狀態,證明是可以使用的。由於手機卡有限,只測試了樓主自己的,若有獲取錯誤的請聯絡我及時增加。
  將自己工作和學習中的常用工具整理出來,以後直接用就行,不用再去寫,以後還會不定期增加各種常用的工具類,也歡迎提出你需要的工具類,由我來整理。