Android judges whether the connection network (wifi) is valid

Method 1 and 2 fail, Method 3 works

 

Method 1: Get NetworkInfo information

    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();
    }
​

Test result: Connect to valid wifi

connection invalid wifi

Test conclusion : no difference, invalid

 

 

Method 2: Realize the network monitoring interface

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);
        }
    }

 

Test Results: 

Connect to valid wifi

connection invalid wifi

Test conclusion : no difference, invalid

 

 

Method 3: Obtain the NetworkCapabilities describing the current network through the ConnectivityManager. When the description of NetworkCapabilities has the description of VALIDATED, the network is really available

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;
}

Test Results:

Connect to valid wifi

connection invalid wifi

Test conclusion : there is a difference, effective

 

related reference

Determine whether the network is really connected 

Guess you like

Origin blog.csdn.net/ly_xiamu/article/details/117690736