检测Android上是否有可用的Internet连接

可能重复:
如何检查Android的互联网接入? InetAddress从不超时

我需要检测Android设备是否连接到Internet。

NetworkInfo类提供了一个非静态方法isAvailable() ,听起来很完美。

问题是:

 NetworkInfo ni = new NetworkInfo(); if (!ni.isAvailable()) { // do something } 

抛出这个错误:

 The constructor NetworkInfo is not visible. 

安全的赌注是有另一个类返回一个NetworkInfo对象。 但我不知道是哪一个。

  1. 如何让上面的代码片段工作?
  2. 我怎么能find我在线文档中需要的信息?
  3. 你能提出一个更好的方法来进行这种types的检测吗?

ConnectivityManagergetActiveNetworkInfo()方法返回一个NetworkInfo实例,表示可以find的第一个连接的networking接口,如果没有接口ConnectivityManager返回null 。 检查这个方法是否返回null应该足以说明互联网连接是否可用。

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

您还需要:

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

在你的Android清单。

编辑:

请注意,拥有活动的networking接口并不能保证特定的networking服务可用。 networking问题,服务器停机时间,低信号,强制门户,内容filter等都可以阻止你的应用程序到达服务器。 例如,您无法确定您的应用是否可以访问Twitter,直到您收到来自Twitter服务的有效回复。

我检查无线上网和移动互联网如下…

 private boolean haveNetworkConnection() { boolean haveConnectedWifi = false; boolean haveConnectedMobile = false; ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo[] netInfo = cm.getAllNetworkInfo(); for (NetworkInfo ni : netInfo) { if (ni.getTypeName().equalsIgnoreCase("WIFI")) if (ni.isConnected()) haveConnectedWifi = true; if (ni.getTypeName().equalsIgnoreCase("MOBILE")) if (ni.isConnected()) haveConnectedMobile = true; } return haveConnectedWifi || haveConnectedMobile; } 

显然,它可以很容易地修改,以检查个别特定的连接types,例如,如果您的应用程序需要Wi-Fi的潜在更高的速度正常工作等。

第1步:在你的项目中创build一个类AppStatus(你也可以给其他名字)。 那么请把下面的代码粘贴到你的代码中:

 import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.util.Log; public class AppStatus { private static AppStatus instance = new AppStatus(); static Context context; ConnectivityManager connectivityManager; NetworkInfo wifiInfo, mobileInfo; boolean connected = false; public static AppStatus getInstance(Context ctx) { context = ctx.getApplicationContext(); return instance; } public boolean isOnline() { try { connectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); connected = networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected(); return connected; } catch (Exception e) { System.out.println("CheckConnectivity Exception: " + e.getMessage()); Log.v("connectivity", e.toString()); } return connected; } } 

第2步:现在检查您的设备是否具有networking连接,然后只要添加此代码段,你想检查的地方…

 if (AppStatus.getInstance(this).isOnline()) { Toast t = Toast.makeText(this,"You are online!!!!",8000).show(); } else { Toast t = Toast.makeText(this,"You are not online!!!!",8000).show(); Log.v("Home", "############################You are not online!!!!"); } 

另外一个重要的说明。 你必须在你的AndroidManifest.xml中设置android.permission.ACCESS_NETWORK_STATE才能工作。

_我怎么能在网上文件中find我需要的信息?

你只需要正确地阅读类的文档,你会发现你正在寻找的所有答案。 查看ConnectivityManager上的文档。 描述告诉你该怎么做。

ConnectivityManager的getActiveNetworkInfo()方法返回一个NetworkInfo实例,表示可以find的第一个连接的networking接口,如果接口连接,则返回null。 检查这个方法是否返回null应该足以说明互联网连接是否可用。

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

您还需要:

在你的Android清单。

编辑:

请注意,拥有活动的networking接口并不能保证特定的networking服务可用。 networking问题,服务器停机时间,低信号,强制门户,内容filter等都可以阻止你的应用程序到达服务器。 例如,您无法确定您的应用是否可以访问Twitter,直到您收到来自Twitter服务的有效回复。

getActiveNetworkInfo()不应该永远不会给null。 当他们提出这个问题时,我不知道他们在想什么。 它总是给你一个对象。

也许我发现自己:

 ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();