如何检查我的android设备是否有连接?

问题描述:

无论用户是否有活跃的互联网连接(通过活动,我的意思是用户可以打开任何网络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. 通过向服务器发出请求我正在使用。
  2. 哪个在性能方面最好。

开始=>
+1

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

+0

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

我使用下面的方法来检查用户是否通过移动数据或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设备使用提到的代码来检查活动连接 –

请勿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); 

使用这样的方法:

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