2016-08-25 60 views
-3

无论用户是否有活跃的互联网连接(通过活动,我的意思是用户可以打开任何网络URl),下面所述情况下的最佳解决方案是什么。如何检查我的android设备是否有连接?

  1. 通过使http请求到google.com并检查respose代码,或
HttpURLConnection urlc = (HttpURLConnection) 
         (new URL("http://clients3.google.com/generate_204") 
           .openConnection()); 
       urlc.setRequestProperty("User-Agent", "Android"); 
       urlc.setRequestProperty("Connection", "close"); 
       urlc.connect(); 
       Log.d("reqcode",""+urlc.getResponseCode()); 
       return (urlc.getResponseCode() == 204 && 
         urlc.getContentLength() == 0); 
  • 通过向服务器发出请求我正在使用。
  • 哪个在性能方面最好。

    +1

    可能是最好看的Android文档张贴在这里了。[确定和监控连接状态](https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html) –

    +0

    [如何检查Android上的互联网访问? InetAddress永不超时](http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-times-out) –

    回答

    0

    我使用下面的方法来检查用户是否通过移动数据或wi-fi有活动的互联网连接。

    public static boolean isInternetConnected() { 
         ConnectivityManager connectivityManager = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE); 
         if (connectivityManager != null) { 
          NetworkInfo[] info = connectivityManager.getAllNetworkInfo(); 
          if (info != null) { 
           for (int i = 0; i < info.length; i++) { 
            if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
             return true; 
            } 
           } 
          } 
         } 
         return false; 
        } 
    

    并在清单文件中添加权限。

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    有没有办法来确定用户是否具有有效连接或没有。如果用户没有活动连接并在一段时间后抛出SocketTimeOutException,则在您的问题中建议的方法会导致您进入漫长的等待期。

    所以,如果你想检查用户是否有互联网连接,那么只检查它已启用Wi-Fi和/或数据连接,并假设数据包打开。

    +0

    不工作,我想知道如果设备有一个活动的连接(不只是连接到无线网络)我已经实施它,它总是会返回true,除非我的wifi关闭。 –

    +0

    @AmanVerma检查我更新的答案。 –

    +0

    是的,这是事情,我用我的问题中所述的方法,我必须等待约20秒才能得到响应代码。虽然有另一种使用套接字的方法,但它速度很快,但在许多设备上无法工作。 Android设备使用提到的代码来检查活动连接 –

    0

    请勿ping网站以检查互联网连接。这是一个非常糟糕的做法,因为该网站可能会永久封锁您的应用,或者只是一台服务器可能关闭。

    改为使用BroadCastReceiver来收听互联网连接Intent。从BradcastReceiver和你onReceive使用

    private boolean isConnectedToInternet(){ 
        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
         if (connectivity != null) 
         { 
          NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
          if (info != null) 
           for (int i = 0; i < info.length; i++) 
            if (info[i].getState() == NetworkInfo.State.CONNECTED) 
            { 
             return true; 
            } 
         } 
         return false; 
    } 
    

    内扩展您的类来检查连接状态。

    您可能还需要注册和注销的接收器在ActivityonResume()onPause()

    registerReceiver(networkChangeListener, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); 
    ... 
    unregisterReceiver(networkChangeListener); 
    
    1

    使用这样的方法:

    private boolean isNetworkAvailable() { 
         ConnectivityManager connectivityManager 
           = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
         NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
         return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
        } 
    

    然后,只需:

    if(isNetworkAvailable()) { 
        //Do what you want with internet 
    } else { 
        //Do something wothout internet 
    } 
    

    您还需要在您的清单文件:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
    

    总之:Question

    相关问题