繁体   English   中英

检查通过 WiFi 的互联网连接或移动数据是否可用

[英]Checking if internet connection over WiFi or mobile data available

我正在使用以下代码来检查手机是否连接到互联网(WiFi 或移动数据):

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

手机可能连接到 WiFi 但未连接到互联网。 对于我的用例,我假设当它连接到 WiFi 或移动网络(启用移动数据)时,互联网将可用。

这段代码可以吗? 特别是, activeNetworkInfo.isConnected()是否也测试移动数据或仅测试 WiFi? 我的目标是 Android 7 到 Android 10。理论上我可以将 if 子句中的这段代码也用于 Android 10 以下的设备。

首先向manifest请求这个权限。xml: android.permission.ACCESS_NETWORK_STATE

在 android 中,我们可以使用 WIFIMANAGER 轻松确定互联网连接状态。

private boolean LookForWifiOnAndConnected() {
WifiManager wifi_m = (WifiManager) 
 getSystemService(Context.WIFI_SERVICE);

if (wifi_m.isWifiEnabled()) { // if user opened wifi

    WifiInfo wifi_i = wifi_m.getConnectionInfo();

    if( wifi_i.getNetworkId() == -1 ){
        return false; // Not connected to any wifi device
    }
    return true; // Connected to some wifi device
}
else {
    return false; // user turned off wifi
}

}

//检查移动数据是否打开或关闭

  boolean mobileDataEnabled = false; // Assume disabled
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
try {
    Class cmClass = Class.forName(cm.getClass().getName());
    Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
    method.setAccessible(true); // Make the method callable
    // get the setting for "mobile data"
    mobileDataEnabled = (Boolean)method.invoke(cm);
} catch (Exception e) {
    // Some problem accessible private API
    // TODO do whatever error handling you want here
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM