可能的重复:
如何检查Android上的互联网接入?InetAddress从不超时
我需要检测Android设备是否连接到互联网。
NetworkInfo类提供了一个听起来很完美的非静态方法isAvailable()。
问题是:
NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
// do something
}
抛出以下错误:
The constructor NetworkInfo is not visible.
可以肯定的是,还有另一个类返回NetworkInfo对象。但我不知道是哪个。
如何让上面的代码片段工作?
我怎么能在网上文档中找到我需要的信息呢?
你能建议一种更好的检测方法吗?
步骤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应该足以判断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的getActiveNetworkInfo()方法返回一个
表示第一个连接网络的NetworkInfo实例
接口,它可以找到,如果没有,则为空。
检查此方法是否返回null应该足以判断是否有
可以上网。
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
}
你还需要:
在你的
android清单。
编辑:
请注意,有一个活动的网络接口并不能保证
特定的网络服务可用。网络问题,服务器
停机时间、低信号、专属门户、内容过滤器等等
都可以阻止你的应用到达服务器。比如你
你不能确定你的应用是否可以登陆Twitter,直到你收到一个
来自Twitter服务的有效响应。
getActiveNetworkInfo()不应该给null。我不知道他们想到这个的时候是怎么想的。它总是会给你一个对象。