package com.wpc.library.util; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; import androidx.core.content.ContextCompat; import android.telephony.TelephonyManager; import android.util.Log; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; /** * Created by weikou2015 on 2018/7/26. * 获取网络状态工具类 */ public class NetUtils { public static final String NETWORK_NONE = "没有网络连接"; // 0 public static final String NETWORK_WIFI = "WIFI"; // wifi连接 public static final String NETWORK_2G = "2G"; // 2G public static final String NETWORK_3G = "3G"; // 3G public static final String NETWORK_4G = "4G"; // 4G public static final String NETWORK_MOBILE = "手机流量"; // 手机流量 public static final String NETWORK_RUINE = "本地context为空"; // 本地context为空 /** * 获取运营商名字 * * @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 String getNetworkState(Context context) { if (context == null) { return NETWORK_RUINE;//本地context为空 } ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // 获取网络服务 if (null == connManager) { // 为空则认为无网络 return NETWORK_NONE; } NetworkInfo activeNetInfo = null; if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_NETWORK_STATE) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_NETWORK_STATE) == PackageManager.PERMISSION_GRANTED) { 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; } /** * @return * @author cat * @category 判断是否有外网连接(普通方法不能判断外网的网络是否连接,比如连接上局域网) */ public static boolean ping(String urld) { String result = null; try { String ip = urld;// 除非百度挂了,否则用这个应该没问题(也可以换成自己要连接的服务器地址) Process p = Runtime.getRuntime().exec("ping -c 1 -w 1 " + ip);// ping3次 // 读取ping的内容,可不加。 InputStream input = p.getInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(input)); StringBuffer stringBuffer = new StringBuffer(); String content = ""; while ((content = in.readLine()) != null) { stringBuffer.append(content); } Log.i("TTT", "result content : " + stringBuffer.toString()); // PING的状态 int status = p.waitFor(); if (status == 0) { result = "successful~"; return true; } else { result = "failed~ cannot reach the IP address"; return false; } } catch (IOException e) { result = "failed~ IOException"; } catch (InterruptedException e) { result = "failed~ InterruptedException"; } finally { Log.i("TTT", "result = " + result); } return false; } }