首页 > 解决方案 > 无法在 android 设备的省电模式下以编程方式检查网络信息

问题描述

我想检查我的 android 应用程序中的连接状态。我调用下一个方法onResume

public boolean isThereInternetConnection() {
        boolean isConnected = false;
        ConnectivityManager connectivityManager =
                (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = (connectivityManager != null) ? connectivityManager.getActiveNetworkInfo() : null;
        if (networkInfo != null) {
            isConnected = networkInfo.isConnected();
        }
        return isConnected;
    }

在正常模式下它工作得很好。但是当我的设备处于节电模式并且我从后台打开我的活动时,方法isThereInternetConnection()有时会返回 false(互联网连接良好)。为此我检查networkInfo.getDetailedState()并在省电模式下DetailedState.BLOCKED即使我有良好的互联网连接它也会返回。那么如何解决这个错误,如何在省电模式下检查互联网连接并获得真实值真或假 - 是否连接到互联网?

标签: androidnetwork-connectionandroid-connectivitymanager

解决方案


检查互联网的最佳方法实际上是 ping 到互联网。有时互联网已连接但无法访问网络。

public boolean isOnline() {
    try {
        int timeoutMs = 1500;
        Socket sock = new Socket();
        SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);

        sock.connect(sockaddr, timeoutMs);
        sock.close();

        return true;
    } catch (IOException e) { return false; }
}

上述代码不会在主线程上运行,需要互联网连接权限。

下面的代码有点慢,但可以在主线程上运行。需要互联网连接权限:

public boolean isOnline() {
    Runtime runtime = Runtime.getRuntime();
    try {
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int     exitValue = ipProcess.waitFor();
        return (exitValue == 0);
    }
    catch (IOException e)          { e.printStackTrace(); }
    catch (InterruptedException e) { e.printStackTrace(); }

    return false;
}

参考:如何在 Android 上检查互联网访问


推荐阅读