方法一 二失败 方法三可行
方法一:获取NetworkInfo信息
private NetworkInfo getCurNetworkInfo() {
ConnectivityManager connectivityManager = (ConnectivityManager) mContext
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo()
CoolLogger.d("lixiongjun", "info.isAvailable(): " + info.isAvailable());
CoolLogger.d("lixiongjun", "info.isConnected(): " + info.isConnected());
CoolLogger.d("lixiongjun", "info.isConnectedOrConnecting(): " + info.isConnectedOrConnecting());
CoolLogger.d("lixiongjun", "info.isFailover(): " + info.isFailover());
CoolLogger.d("lixiongjun", "info.isRoaming(): " + info.isRoaming());
return cm.getActiveNetworkInfo();
}
测试结果: 连接有效wifi
连接无效wifi
测试结论:没有差别,无效
方法二:实现联网监听接口
package com.yulong.android.coolmart.utils.network;
import android.net.ConnectivityManager;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.os.Build;
import android.support.annotation.RequiresApi;
import com.yulong.android.coolmart.common.log.CoolLogger;
/**
* @author lixiongjun
* @date 2021/6/7
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class NetworkCallbackImpl extends ConnectivityManager.NetworkCallback {
private static final String TAG = "NetworkCallbackImpl";
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
CoolLogger.i(TAG, "网络已链接");
}
public NetworkCallbackImpl() {
super();
CoolLogger.i(TAG, "NetworkCallbackImpl");
}
@Override
public void onLosing(Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
CoolLogger.i(TAG, "onLosing");
}
@Override
public void onUnavailable() {
super.onUnavailable();
CoolLogger.i(TAG, "onUnavailable");
}
@Override
public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
super.onLinkPropertiesChanged(network, linkProperties);
;
CoolLogger.i(TAG, "onLinkPropertiesChanged isPrivateDnsActive : " + linkProperties.isPrivateDnsActive());
CoolLogger.i(TAG, "onLinkPropertiesChanged");
}
@Override
public void onLost(Network network) {
super.onLost(network);
CoolLogger.i(TAG, "网络已断开");
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
CoolLogger.i(TAG, "wifi已经连接");
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
CoolLogger.i(TAG, "数据流量已经连接");
} else {
CoolLogger.i(TAG, "其他网络");
}
}
}
}
//在Application 中注册该监听
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void initNetworkCallBack(){
NetworkCallbackImpl networkCallback = new NetworkCallbackImpl();
NetworkRequest.Builder builder = new NetworkRequest.Builder();
NetworkRequest request = builder.build();
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (connMgr != null) {
connMgr.registerNetworkCallback(request, networkCallback);
}
}
测试结果:
连接有效wifi
连接无效wifi
测试结论:没有差别,无效
方法三:通过ConnectivityManager获得描述当前网络的NetworkCapabilities,当NetworkCapabilities的描述中有VALIDATED这个描述时,此网络是真正可用的
public static boolean isNetworkOnline(Context context) {
boolean isOnline = false;
try {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkCapabilities capabilities = null; // need ACCESS_NETWORK_STATE permission
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
capabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
isOnline = capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
}
} catch (Exception e) {
e.printStackTrace();
}
return isOnline;
}
测试结果:
连接有效wifi
连接无效wifi
测试结论:有差别,有效
相关参考