【问题标题】:How exactly does Android determine whether it's online?Android究竟是如何判断是否在线的?
【发布时间】:2012-11-04 05:38:39
【问题描述】:

Android究竟是如何判断以下状态的区别的?

  1. 网络接口处于活动状态(例如 Wifi 或 3G),但无法访问互联网。

  2. 网络接口处于活动状态,需要要求用户在网页上登录网络。

  3. 网络接口处于活动状态并能够访问互联网。

它是否可能向固定 URL(可能在 google.com 上?)发送一个简单的 HTTP 请求并检查返回的文档是否符合预期?如果有,我们是否知道使用的 URL?

【问题讨论】:

    标签: android networking connectivity


    【解决方案1】:

    更新:更新了代码以避免NetworkOnMainThreadException

    我目前正在使用以下方法来判断设备是否可以上网:

    public class NetworkConnectivityHelper {
        public void isDeviceConnectedToInternet(final Activity activity, final ResultCallback callback){
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    boolean isDeviceConnectedToInternet = false;
                    NetworkInfo activeNetworkInfo = ((ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
    
                    if(activeNetworkInfo != null && activeNetworkInfo.isConnected()){
                        try {
                            InetAddress.getByName("google.com").isReachable(2);
                            isDeviceConnectedToInternet = true;
                        } catch (UnknownHostException e){
                            isDeviceConnectedToInternet = false;
                        } catch (IOException e){
                            isDeviceConnectedToInternet = false;
                        }
                    }
    
                    final boolean result = isDeviceConnectedToInternet;
                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            callback.done(result);
                        }
                    });
    
                }
            }).start();
    
        }
    
    
        public static abstract class ResultCallback{
            public abstract void done(boolean connected);
        }
    }
    

    通过以下方式调用:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ....
        //Populate
        NetworkConnectivityHelper networkConnectivityHelper = new NetworkConnectivityHelper();
        networkConnectivityHelper.isDeviceConnectedToInternet(activity, new NetworkConnectivityHelper.ResultCallback() {
            @Override
            public void done(boolean connected) {
                if (connected) {
                    //Yey, the device is connected. 
                    //Now, do some work
                }else{
                    //The device is disconnected
                }
            }
        });
        ....
    
    }
    

    希望这会有所帮助!

    【讨论】:

    • 这将在更高版本的 android 上强制关闭,以便在主线程上使用网络连接。此外,在我测试的需要登录的 wifi 网络上,此测试在不应该连接时仍返回为已连接。
    【解决方案2】:

    是的,您也可以发送 ping :)

    您应该在小型网络实用程序类中使用的订单操作是: - 检查接口是否在线 - 检查它是否能够打开到 Google.com 的套接字或 ping google.com

    【讨论】:

      【解决方案3】:

      试试这个:

      public static boolean isNetworkAvailable(Context context)
      {
          ConnectivityManager cm = (ConnectivityManager) context
                  .getSystemService(Context.CONNECTIVITY_SERVICE);
          NetworkInfo info = cm.getActiveNetworkInfo();
      
          return (info != null);
      }
      

      【讨论】:

        猜你喜欢
        • 2019-08-12
        • 1970-01-01
        • 2015-02-26
        • 2012-06-12
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        相关资源
        最近更新 更多