无法在android设备的电池节省模式下以编程方式检查网络信息

无法在android设备的电池节省模式下以编程方式检查网络信息,android,network-connection,android-connectivitymanager,Android,Network Connection,Android Connectivitymanager,我想检查android应用程序中的连接状态。我调用onResume中的下一个方法: public boolean isThereInternetConnection() { boolean isConnected = false; ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_

我想检查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(internet连接正常)。为此,我选中了
networkInfo.getDetailedState()
,在节电模式下,它返回
DetailedState.BLOCKED
,即使我有良好的internet连接。那么,如何解决这个错误,如何在电池节电模式下检查互联网连接,并获得真实值真或假-是否连接到互联网?

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

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; }
}
上面的代码不会在主线程上运行,需要internet 连接权限

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

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

参考:

您可以使用以下方法:

public void checkInternetAndContinue() {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                int timeoutMs = 1500;
                Socket sock = new Socket();
                SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);

                sock.connect(sockaddr, timeoutMs);
                sock.close();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        startWork(true);
                    }
                });
            } catch (IOException e) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        startWork(false);

                    }
                });
            }
        }
    });
    thread.start();
}
如果有互联网,继续工作

private void startWork(boolean b) {
     if(b){
         // do whatever you want when the internet is available    
     } else {
         // No Internet.
     }
}

希望能有帮助

您是否尝试过activeNetworkInfo.IsConnectedorConnection()?奇怪的是,IsConnectedorConnection()方法现在已被弃用,如何将conMgr.getActiveNetworkInfo().isAvailable()添加到条件中,如下所示:if(conMgr.getActiveNetworkInfo()!=null&&conMgr.getActiveNetworkInfo().isAvailable()&&conMgr.getActiveNetworkInfo()).isConnected())好奇的头脑,方法isAvailable()也被弃用:)