如何在Android Q中检查网络连接?

4

在Android Q之前,您只需要使用NetworkUtils类就可以了。但是在API 29中,这个类已经被弃用了。 我一直在寻找替代方案,但好像找不到一个合适的。

那么,在Android Q中如何检查网络连接?

5个回答

7
如果你正在寻找简单的代码,可以使用以下内容:
public static boolean isInternetConnected(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return cm.getActiveNetwork() != null && cm.getNetworkCapabilities(cm.getActiveNetwork()) != null;
    } else {
        return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnectedOrConnecting();
    }
}

7
请提供更具体的需要翻译的内容。
@IntRange(from = 0, to = 3)
public static int getConnectionType(Context context) {
    int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (cm != null) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
            if (capabilities != null) {
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    result = 2;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    result = 1;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
                    result = 3;
                }
            }
        }
    } else {
        if (cm != null) {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (activeNetwork != null) {
                // connected to the internet
                if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                    result = 2;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                    result = 1;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_VPN) {
                    result = 3;
                }
            }
        }
    }
    return result;
}

在AndroidManifest.xml中添加以下权限。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

3
一些答案建议仅检查getNetworkCapabilities是否返回非空值,但如果您想检查该网络是否实际上可以提供互联网,您应该执行以下操作:
public boolean isNetworkAvailable() {
    try {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getNetworkCapabilities(cm.getActiveNetwork()).hasCapability(NET_CAPABILITY_INTERNET);
    } catch (Exception e) {
        return false;
    }
}

而且你仍然必须拥有这个权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

如果您想检查可用的互联网连接是否实际工作(或上次检查时是否工作),请使用NET_CAPABILITY_VALIDATED功能。


旧的答案建议使用NetworkInfo,但自Android Q/API 29起已被弃用。另外,需要做一个小修正:使用NetworkCapabilities.NET_CAPABILITY_INTERNET,否则你需要导入它。 - undefined
更多信息:您只能在Android Studio的模拟器中关闭移动数据来测试此功能。在模拟器中启用/禁用WiFi甚至拔掉电脑的局域网电缆似乎都不会有任何变化,并且始终会返回“true”,只要移动数据是开启的。 - undefined

1

ConnectivityManager仅检查智能手机在理论上是否可以建立互联网连接。实际上是否存在互联网连接,例如,如果网络质量非常差,只能通过ping或网址来确定。


0

只需使用此代码并调用isInternatAvailable(context)。

    private static final String CMD_PING_GOOGLE = "ping -w -c 1 google.com";

    public static boolean isInternetAvailable(@NonNull Context context) {
        return isConnected(context) && checkInternetPingGoogle();
    }

    public static boolean isConnected(@NonNull Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if(cm != null) {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
        } else {
            return false;
        }
    }

    public static boolean checkInternetPingGoogle(){
        try {
            int a = Runtime.getRuntime().exec(CMD_PING_GOOGLE).waitFor();
            return a == 0x0;
        } catch (IOException ioE){
            EMaxLogger.onException(TAG, ioE);
        } catch (InterruptedException iE){
            EMaxLogger.onException(TAG, iE);
        }
        return false;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接