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

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

我需要检测 Android 设备是否连接到互联网。

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

问题是:

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

抛出以下错误:

The constructor NetworkInfo is not visible.

可以肯定的是,还有另一个类返回 NetworkInfo对象,但我不知道是哪个类。

  1. 如何让上面的代码片段工作?
  2. 我怎样才能在网上文档中找到我需要的信息呢?
  3. 你能提出一种更好的检测方法吗?
618315 次浏览

ConnectivityManagergetActiveNetworkInfo()方法返回一个NetworkInfo实例,表示它可以找到的第一个连接的网络接口,如果没有连接接口,则返回null。检查此方法是否返回null应该足以判断Internet连接是否可用。

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

您还需要:

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

在你的Android清单中。

编辑:

请注意,具有活动网络接口并不能保证特定的网络服务可用。网络问题、服务器停机、低信号、专属门户、内容过滤器等都可能阻止您的应用程序到达服务器。例如,在收到Twitter服务的有效响应之前,您无法确定您的应用程序是否可以到达Twitter。

也许我发现自己:

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

还有一个重要的注意事项。您必须在AndroidManifest.xml中设置android.permission.ACCESS_NETWORK_STATE才能正常工作。

_我如何能找到自己的信息,我需要在网上留档?

你只需要正确地阅读这些类的留档,你就会找到你想要的所有答案。查看连接管理类上的留档。描述告诉你该怎么做。

我检查Wi-Fi和移动互联网如下…

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

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

第1步:在项目中创建一个类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步:现在要检查您的设备是否具有网络连接,然后只需将此代码片段添加到您想要检查的位置…

if (AppStatus.getInstance(this).isOnline()) {


Toast.makeText(this,"You are online!!!!",8000).show();


} else {


Toast.makeText(this,"You are not online!!!!",8000).show();
Log.v("Home", "############################You are not online!!!!");
}

ConnectivityManager的getActiveNetworkInfo()方法返回一个 表示第一个连接网络的NetworkInfo实例 如果接口已连接,则它可以找到或null。 检查此方法是否返回null应该足以判断 互联网连接可用。

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

您还需要:

在你 android清单。

编辑:

请注意,具有活动网络接口并不能保证 特定的网络服务可用。网络问题,服务器 停机时间、低信号、专属门户、内容过滤器等 都可以阻止您的应用程序到达服务器。例如,您 无法确定您的应用程序是否可以访问Twitter,直到您收到 来自Twitter服务的有效响应。

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