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

测试结论:有差别,有效

相关参考

判断网络是否真正连通 

猜你喜欢

转载自blog.csdn.net/ly_xiamu/article/details/117690736