【问题标题】:How to programmatically check availibilty of internet connection in Android?如何以编程方式检查 Android 中互联网连接的可用性?
【发布时间】:2011-05-30 16:08:42
【问题描述】:

我想以编程方式检查 Android 手机/模拟器中是否有互联网连接。因此,一旦我确定存在互联网连接,我就会拨打互联网电话。

所以它就像“嘿模拟器!如果你有互联网连接,那么请打开这个页面,否则 doSomeThingElse();”

【问题讨论】:

    标签: java android android-emulator android-manifest internet-connection


    【解决方案1】:

    此代码必须在后台线程中运行

    fun hasActiveInternetConnection(): Boolean {
        return try {
            val ipAddr: InetAddress = InetAddress.getByName("google.com")
            !ipAddr.equals("")
        } catch (e: java.lang.Exception) {
            false
        }
    }
    

    【讨论】:

      【解决方案2】:

      我一直在使用这两种方法来检查互联网状态 有时 https 协议不起作用尝试 http 协议

      // Check if network is available
      public static boolean isNetworkAvailable() {
          ConnectivityManager cm = (ConnectivityManager)
                  AppGlobals.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
          NetworkInfo networkInfo = cm.getActiveNetworkInfo();
          return networkInfo != null && networkInfo.isConnected();
      }
      
      // ping the google server to check if internet is really working or not
      public static boolean isInternetWorking() {
          boolean success = false;
          try {
              URL url = new URL("https://google.com");
              HttpURLConnection connection = (HttpURLConnection) url.openConnection();
              connection.setConnectTimeout(10000);
              connection.connect();
              success = connection.getResponseCode() == 200;
          } catch (IOException e) {
              e.printStackTrace();
          }
          return success;
      }
      

      如果由于新的 android 安全性,http 无法正常工作,他们现在不允许纯文本通信。现在只是绕过它。

      android:usesCleartextTraffic="true"

      【讨论】:

        【解决方案3】:

        来自我的OLD Answer here

        试试这个

        我已经应用了@Levit提供的解决方案,并创建了不会调用额外Http请求的函数。

        它将解决错误Unable to Resolve Host

        public static boolean isInternetAvailable(Context context) {
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (activeNetwork == null) return false;
        
            switch (activeNetwork.getType()) {
                case ConnectivityManager.TYPE_WIFI:
                    if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
                            activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
                            isInternet())
                        return true;
                    break;
                case ConnectivityManager.TYPE_MOBILE:
                    if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
                            activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
                            isInternet())
                        return true;
                    break;
                default:
                    return false;
            }
            return false;
        }
        
        private static boolean isInternet() {
        
            Runtime runtime = Runtime.getRuntime();
            try {
                Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
                int exitValue = ipProcess.waitFor();
                Debug.i(exitValue + "");
                return (exitValue == 0);
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        
            return false;
        }
        

        现在这样称呼它,

        if (!isInternetAvailable(getActivity())) {
             //Show message
        } else {
             //Perfoem the api request
        }
        

        【讨论】:

        • 什么是“/system/bin/ping -c 1 8.8.8.8”?
        【解决方案4】:

        至于问题标题,你要检查互联网访问,

        所以是最快的方法,至少目前是有效的,

        thnx to levit 基于他的回答 https://stackoverflow.com/a/27312494/3818437

        如果您只想检查与任何网络的连接 - 不在乎 如果互联网可用 - 那么这里的大部分答案(包括 已接受),实现 isConnectedOrConnecting() 将运行良好。 如果您想知道您是否有互联网连接(如 问题标题表示)请在 Ping 上阅读主要名称 服务器

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

        就是这样!是的,很短,是的,它很快,不,它不需要在后台运行,不,你不需要root权限。

        可能的问题

        这真的够快吗?

        是的,非常快!

        真的没有可靠的方法来检查互联网是否可用, 除了在互联网上测试一些东西吗?

        据我所知,但请告诉我,我会编辑我的答案。

        我不能直接 ping 自己的页面吗?无论如何我都想请求它?

        当然!如果您想区分两者,您甚至可以同时检查两者 “互联网连接可用”并且您自己的服务器可以访问

        如果 DNS 出现故障怎么办?

        Google DNS(例如 8.8.8.8)是全球最大的公共 DNS 服务 世界。截至 2013 年,它每天处理 1300 亿次请求。让我们只是 比如说,您的应用程序没有响应可能不会成为话题 天。

        需要哪些权限?

        只是 互联网访问 - 多么惊喜^^(顺便说一句,你有没有想过, 这里建议的一些方法甚至可以有一个远程胶水 关于互联网的可用性,未经此许可?)

        【讨论】:

          【解决方案5】:

          连接到网络并不能保证互联网连接。

          您可能已连接到您家的 wifi,但您可能没有互联网连接。 或者,您可能在一家可以连接到 wifi 的餐厅,但仍需要热点密码才能使用互联网。在这种情况下,上述方法将返回 true,但设备无法连接互联网,如果没有正确的尝试和捕获,应用程序可能会崩溃。

          归根结底,网络连接并不意味着互联网连接,它仅意味着您设备的无线硬件可以连接到另一台主机并且两者都可以建立连接。

          下面是一种方法,可以检查设备是否可以连接到网站并相应地返回答案。

          if (networkConnectivity())
          {
              try
              {
                  HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.anywebsiteyouthinkwillnotbedown.com").openConnection());
                  urlc.setRequestProperty("User-Agent", "Test");
                  urlc.setRequestProperty("Connection", "close");
                  urlc.setConnectTimeout(3000); //choose your own timeframe
                  urlc.setReadTimeout(4000); //choose your own timeframe
                  urlc.connect();
                  networkcode2 = urlc.getResponseCode();
                  return (urlc.getResponseCode() == 200);
              } catch (IOException e)
              {
                  return (false);  //connectivity exists, but no internet.
              }
          } else
          {
              return false;  //no connectivity
          }
          

          【讨论】:

          • 你能解释一下你的代码吗?为什么要设置这些请求属性?这是检查互联网连接是否非常慢/弱连接的合适方法,从而最大限度地减少检查连接可用性的数据传输?
          • @remi。它应该可以正常工作。看不到不这样做的理由。还没有在非常慢的连接上测试它。
          • 它可以工作,但在此解决方案中存在 DNS 请求挂起的风险。设备将尝试解析网址,但可能无法访问 DNS 服务器本身。
          【解决方案6】:

          因为您连接到网络并不能保证您有互联网,所以我只是在 try catch 块内拨打互联网电话。然后捕获 UnknownHostException 以处理没有互联网。

          【讨论】:

            【解决方案7】:

            我自己实现的方法:

            /*
             * isOnline - Check if there is a NetworkConnection
             * @return boolean
             */
            protected boolean isOnline() {
                ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo netInfo = cm.getActiveNetworkInfo();
                if (netInfo != null && netInfo.isConnected()) {
                    return true;
                } else {
                    return false;
                }
            }
            

            请注意,这是一个 NetworkConnection-Check。如果有 NetworkConnection,它不一定是 InternetConnection。

            【讨论】:

            • 返回码可以简化为:return netInfo != null && netInfo.isConnected();
            【解决方案8】:

            试试这个:

            ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
            
            if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING  ) {
               text.setText("hey your online!!!")     ;               
               //Do something in here when we are connected   
            } else if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED ||  connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED   ) {
               text.setText("Look your not online");           
            }
            

            【讨论】:

              猜你喜欢
              • 2015-03-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-02-02
              • 1970-01-01
              • 2014-10-13
              • 2013-07-26
              相关资源
              最近更新 更多