判断网络状态工具类
2023-09-14 08:59:11 时间
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.os.Build;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class NetworkStateHelp {
public static final String MODE_WIFI = "wifi";
public static final String MODE_4G_ = "4g";
public static final String MODE_3G = "3g";
public static final String MODE_2G = "2g";
public static final String MODE_UNKNOWN = "unknown";
public static String getNetWorkModel(Context context) {
if (isWifiAvailable(context)) {
return MODE_WIFI;
} else if (isNetwork4G(context)) {
return MODE_4G_;
} else if (isNetwork3G(context)) {
return MODE_3G;
} else if (isNetwork2G(context)) {
return MODE_2G;
} else {
return MODE_UNKNOWN;
}
}
/**
* 准确判断sim类别 必须流量开关是打开状态,wifi开关为关闭状态 判断手机卡 是4G,3G,还是2G卡 返回0表示无法判断
*
* @param context
* @return
*/
public static String getSimNetworkType(Context context) {
String type = "";
switch (getMobileNetworkType(context)) {
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:
type = "2g";
break;
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:
type = "3g";
break;
case TelephonyManager.NETWORK_TYPE_LTE:
type = "4g";
break;
default:
type = isWifiAvailable(context) ? "wifi" : "0";
break;
}
return type;
}
;
/**
* gprs开关是否打开
*
* @return
*/
public static boolean getMobileDataStatus(Context context) {
ConnectivityManager cm;
cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
Class cmClass = cm.getClass();
Class[] argClasses = null;
Object[] argObject = null;
Boolean isOpen = false;
try {
Method method = cmClass.getMethod("getMobileDataEnabled",
argClasses);
isOpen = (Boolean) method.invoke(cm, argObject);
} catch (Exception e) {
e.printStackTrace();
}
return isOpen;
}
/**
* 打开或者关闭 移动数据流量
*
* @param context
* @param enabled
*/
public static void toggleMobileData(Context context, boolean enabled) {
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
Method setMobileDataEnabl;
try {
setMobileDataEnabl = connectivityManager.getClass()
.getDeclaredMethod("setMobileDataEnabled", boolean.class);
setMobileDataEnabl.invoke(connectivityManager, enabled);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 检查WIFI是否已经连接
*/
public static boolean isWifiAvailable(Context ctx) {
ConnectivityManager conMan = (ConnectivityManager) ctx
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (conMan == null) {
return false;
}
NetworkInfo wifiInfo = conMan
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return (wifiInfo != null && wifiInfo.getState() == State.CONNECTED);
}
public static State getNetWorkInfoState(Context ctx) {
ConnectivityManager conMan = (ConnectivityManager) ctx
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiInfo = conMan
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (wifiInfo == null) {
return State.UNKNOWN;
}
return wifiInfo.getState();
}
/**
* 检查网络是否连接,WIFI或者手机网络其一
*/
public static boolean isNetworkAvailable(Context ctx) {
ConnectivityManager conMan = (ConnectivityManager) ctx
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (conMan == null) {
return false;
}
NetworkInfo activeInfo = conMan.getActiveNetworkInfo();
if (null == activeInfo) {
return false;
}
if (activeInfo.getState() == State.CONNECTED) {
return true;
}
return false;
}
/**
* 检查网络状态并返回当前状态,网络不可用时提示
*/
public static boolean checkNetworkStat(Context ctx) {
boolean isAvailable = isNetworkAvailable(ctx);
return isAvailable;
}
public static boolean isNetwork2G(Context context) {
int subType = getMobileNetworkType(context);
return (subType == TelephonyManager.NETWORK_TYPE_CDMA
|| subType == TelephonyManager.NETWORK_TYPE_EDGE
|| subType == TelephonyManager.NETWORK_TYPE_GPRS
|| subType == TelephonyManager.NETWORK_TYPE_1xRTT || subType == TelephonyManager.NETWORK_TYPE_IDEN);
}
public static boolean isNetwork3G(Context context) {
int subType = getMobileNetworkType(context);
boolean ret = (subType == TelephonyManager.NETWORK_TYPE_UMTS
|| subType == TelephonyManager.NETWORK_TYPE_HSDPA
|| subType == TelephonyManager.NETWORK_TYPE_EVDO_0
|| subType == TelephonyManager.NETWORK_TYPE_EVDO_A
|| subType == TelephonyManager.NETWORK_TYPE_EVDO_B
|| subType == TelephonyManager.NETWORK_TYPE_HSPA
|| subType == TelephonyManager.NETWORK_TYPE_EHRPD || subType == TelephonyManager.NETWORK_TYPE_HSUPA); // TODO:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
ret = ret || subType == TelephonyManager.NETWORK_TYPE_HSPAP;
}
return ret; // 移动3G如何判断?
}
public static boolean isNetwork4G(Context context) {
int subType = getMobileNetworkType(context);
return subType == TelephonyManager.NETWORK_TYPE_LTE;
}
public static int getMobileNetworkType(Context context) {
ConnectivityManager connectMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = connectMgr.getActiveNetworkInfo();
if (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE) {
return info.getSubtype();
}
return -1;
}
/**
* 获取当前的网络状态 null:没有网络 wifi:WIFI网络 wap:wap网络 net:net网络
*
* @param context
* @return
*/
public static String getAPNType(Context context) {
String netType = null;
ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo == null) {
return netType;
}
int nType = networkInfo.getType();
if (nType == ConnectivityManager.TYPE_MOBILE) {
if (!TextUtils.isEmpty(networkInfo.getExtraInfo())
&& networkInfo.getExtraInfo().toLowerCase().equals("cmnet")) {
netType = "net";
} else {
netType = "wap";
}
} else if (nType == ConnectivityManager.TYPE_WIFI) {
netType = "wifi";
} else {
netType = "其它";
}
return netType;
}
public static NetworkInfo getNetWorkInfo(Context context) {
ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
return connMgr.getActiveNetworkInfo();
}
public static interface WifiStateListener {
void onWifiStateChanged(State networkState);
}
private static List<WeakReference<WifiStateListener>> mListeners = new ArrayList<WeakReference<WifiStateListener>>();
public static void addWifiStateListener(WifiStateListener listener) {
if (null == listener) {
return;
}
if (null == mListeners) {
mListeners = new ArrayList<WeakReference<WifiStateListener>>();
}
synchronized (mListeners) {
for (WeakReference<WifiStateListener> ref : mListeners) {
if (ref.get() == listener) {
return;
}
}
WeakReference<WifiStateListener> ref = new WeakReference<WifiStateListener>(
listener);
mListeners.add(ref);
}
}
public static void removeWifiStateListener(WifiStateListener listener) {
if (null == listener || null == mListeners) {
return;
}
synchronized (mListeners) {
Iterator<WeakReference<WifiStateListener>> iter = mListeners
.iterator();
while (iter.hasNext()) {
WeakReference<WifiStateListener> ref = iter.next();
if (null == ref.get()) {
iter.remove();
continue;
}
if (ref.get() == listener) {
ref.clear();
iter.remove();
break;
}
}
}
}
public static void notifyWifiStateChange(NetworkInfo wifiInfo) {
synchronized (mListeners) {
for (WeakReference<WifiStateListener> ref : mListeners) {
final WifiStateListener listener = ref.get();
if (null != listener) {
listener.onWifiStateChanged(wifiInfo.getState());
}
}
}
}
}
相关文章
- Linux的Namespace(网络命名空间)
- DFP 数据转发协议应用实例 4.修改网络中指定设备的参数
- 如何使用xnLinkFinder发现目标网络中的节点
- 【PPT】国内外网络靶场发展状态演进与分析
- 【Android 逆向】Android 逆向通用工具开发 ( PC 端工程分析 | 网络初始化操作 | PC 端工程核心业务逻辑 )
- Windows网络调优工具:TCPOptimizer
- java代码实现访问网络外部接口并获取数据的工具类详解编程语言
- 测试测试Linux系统网络吞吐量的方法(linux网络吞吐量)
- Linux网络编程面试:突破技术难关,攻克技术高峰!(linux网络编程面试)
- 管理Linux网络流程控制:优化网络性能(linux网络流程)
- Linux虚拟机网络设置指南(linux虚拟机上网设置)
- 网Linux构建企业级网络的最佳实践(linux建组)
- 四个 Linux 上的网络信息嗅探工具
- Konqueror过去一直是KDE桌面默认工具,因为它既是文件管理器也是网络浏览器。Konqueror有希望成为Linux桌面之王。KDE团队希望将Dolphin作为默认的文件管理器。但是Konqueror的浏览功能很强大,可以用默认的KHTML或WebKit安装且使用。
- 深入探索:ntop Linux网络监控工具的功能及使用方法(ntoplinux)
- Linux下如何查看系统的网络监听状态?(linux查看监听)
- Linux下IP命令详解:一次性解决网络问题(linux下ip命令)
- 和netstatMySQL Ping和Netstat:检查网络状态的必备工具。(mysqlping)
- Monitorix:一款面向Linux的轻型系统和网络监测工具
- Linux网络配置:使用工具实现更简易快捷(linux网络配置工具)
- java网络编程中向指定URL发送GETPOST请求示例