Android 判断连接网络(wifi)是否有效

方法一 二失败 方法三可行

方法一:获取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

测试结论:有差别,有效

相关参考

判断网络是否真正连通


共享电动车十大品牌排行榜
《怀归》杜牧 翻译、赏析和诗意