【问题标题】:Can not check network info programmatically in battery save mode in android device无法在 android 设备的省电模式下以编程方式检查网络信息
【发布时间】:2019-01-23 11:53:41
【问题描述】:

我想在我的 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,即使我有良好的互联网连接。那么如何解决这个错误,如何在省电模式下检查互联网连接并获得真实值true或false - 是否连接到互联网?

【问题讨论】:

  • 你试过 activeNetworkInfo.isConnectedOrConnecting() 吗?
  • Curious Mind,isConnectedOrConnecting() 方法现已弃用
  • 如何将 conMgr.getActiveNetworkInfo().isAvailable() 添加到条件中,如下所示: if (conMgr.getActiveNetworkInfo() != null && conMgr.getActiveNetworkInfo().isAvailable() && conMgr. getActiveNetworkInfo().isConnected())
  • 好奇的头脑,方法 isAvailable() 也被弃用了:)

标签: android network-connection android-connectivitymanager


【解决方案1】:

检查互联网的最佳方法实际上是 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;
}

参考:How to check internet access on Android

【讨论】:

    【解决方案2】:

    你可以用这个方法:

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

    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 2014-09-23
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多