首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在android设备的省电模式下以编程方式检查网络信息

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

Stack Overflow用户
提问于 2018-08-16 21:37:27
回答 2查看 350关注 0票数 3

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

代码语言:javascript
复制
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。那么,如何解决这个问题,如何在省电模式下检查网络连接,并获得真实的真假值--是否连接到互联网?

EN

回答 2

Stack Overflow用户

发布于 2018-08-16 21:43:28

检查互联网的最好方法实际上是连接到互联网。有时可以连接互联网,但不能访问网络。

代码语言:javascript
复制
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连接权限:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-08-16 21:56:56

您可以使用此方法:

代码语言:javascript
复制
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();
}

如果有互联网,还可以继续工作

代码语言:javascript
复制
private void startWork(boolean b) {
     if(b){
         // do whatever you want when the internet is available    
     } else {
         // No Internet.
     }
}

希望它能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51878434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档