簡體   English   中英

連接到 VPN 時檢查 WiFi 和蜂窩網絡連接

[英]Check for WiFi and cellular connection when connected to a VPN

在我的 Android 應用程序中,我使用以下兩種方法來檢查設備是否連接到 WiFi 以及網絡連接是否可用。 我假設當設備連接到 WiFi 或移動網絡時,互聯網也可用。

public static boolean wifiConnected(Context context) {
    boolean isWifiConn = false;
    ConnectivityManager connMgr = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        android.net.Network network = connMgr.getActiveNetwork();
        if (network == null) return false;
        NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(network);
        if(capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){
            isWifiConn = true;
        }
    } else {
        for (android.net.Network network : connMgr.getAllNetworks()) {
            NetworkInfo networkInfo = connMgr.getNetworkInfo(network);
            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
                isWifiConn = true;
                break;
            }
        }
    }
    return isWifiConn;
}

public static boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivityManager
            = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (connectivityManager != null) {
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
            if (capabilities != null) {
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    return true;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    return true;
                } else return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET);
            }
        } else {
            NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
            return (activeNetworkInfo != null) && activeNetworkInfo.isConnected();
        }
    }

    return false;
}

如果設備通過 VPN 連接,則方法返回 false。 是否可以擴展方法以使它們即使在設備連接到 VPN 時也返回 true?

VPN 有一個特定的傳輸類型,因此您需要做的就是添加對capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)的檢查。

您還可以將 API 級別檢查從Build.VERSION_CODES.QBuild.VERSION_CODES.M 唯一有問題的行是connectivityManager.getActiveNetwork()但這在M (API 23) 中可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM