检测Android上是否有可用的Internet连接
可能重复:检测Android上是否有可用的Internet连接,android,internet-connection,android-internet,Android,Internet Connection,Android Internet,可能重复: 我需要检测Android设备是否连接到互联网 NetworkInfo类提供了一个听起来很完美的非静态方法isAvailable() 问题是: NetworkInfo ni = new NetworkInfo(); if (!ni.isAvailable()) { // do something } 抛出此错误: 构造函数NetworkInfo不可见。 可以肯定的是,还有另一个类返回NetworkInfo对象。但我不知道是哪个 如何让上述代码片段正常工作 我怎样才能在在线
我需要检测Android设备是否连接到互联网
NetworkInfo
类提供了一个听起来很完美的非静态方法isAvailable()
问题是:
NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
// do something
}
抛出此错误:
构造函数NetworkInfo不可见。
可以肯定的是,还有另一个类返回NetworkInfo
对象。但我不知道是哪个
ConnectivityManager
的getActiveNetworkInfo()
方法返回一个NetworkInfo
实例,该实例表示它可以找到的第一个连接的网络接口,如果没有连接任何接口,则返回null
。检查此方法是否返回null
,应该足以判断internet连接是否可用
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清单中
编辑:
请注意,具有活动网络接口并不保证特定的网络服务可用。网络问题、服务器宕机、低信号、外加门户、内容过滤器等都会阻止应用程序访问服务器。例如,在收到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!!!!");
}
ConnectionManager的getActiveNetworkInfo()方法返回
代表第一个连接网络的NetworkInfo实例
接口它可以找到,如果没有,则为null,如果接口已连接。
检查此方法是否返回null应该足以说明
互联网连接可用
您还需要:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在你的
android清单
编辑:
请注意,具有活动网络接口并不保证
提供特定的网络服务。网络问题,服务器
停机时间、低信号、捕获门户、内容过滤器等
所有这些都会阻止你的应用到达服务器。比如你
在收到通知之前,无法确定您的应用程序是否可以访问Twitter
来自Twitter服务的有效响应
getActiveNetworkInfo()不应提供null。我不知道他们想到这个的时候在想什么。它应该总是给你一个对象 如果没有活动网络,例如飞机模式,则
getActiveNetworkInfo()
可能会返回null。是的,它将返回null,并且这是未记录的。是的,因此首先执行null检查activeNetwork!=null&&activeNetwork.isConnectedOrConnecting();我喜欢这行:boolean isWifiConnected=activeNetwork!=null&&activeNetwork.isConnectedOrConnecting()&&activeNetwork.getType()==ConnectivityManager.TYPE\u WIFI;有人能更详细地解释这句话吗?我觉得很奇怪:first activeNetwork!=代码很好,我只是希望人们在编写Java haveConnectedWifi,haveConnectedMobile时能坚持Java编码风格。我知道这是一件小事,但一致的代码更具可读性。在良好的实践中,最好将字符串放在左边,如果不需要,最好不要使用equalsIgnoreCase:if(“WIFI”).equals(ni.getTypeName())@Stuart Axon:哦,我想这就是它的工作方式。自从20世纪70年代末开始编程以来,我已经编写了比我记忆中更多的语言,显然我已经养成了许多坏习惯。总的来说,我遵循的原则是,如果它起作用,那么……好吧,它就起作用了,这就是我所关心的。上面的代码片段是完全独立的,任何具有合理编程经验的人都可以轻松地完成,而且(最重要的是)如果有人将其剪切并粘贴到自己的代码中,这对他们来说是可行的。很抱歉,我是一个Android/Java noob。我不是在追求分数或任何东西(或者不管怎样),我发现代码很有用,但我想我的坏脾气是在试图提供一些半有用的反馈。@BoD:getType()
提供了更精细的粒度(我相信),可能会返回TYPE\u MOBILE
,TYPE\u MOBILE\u DUN
,TYPE\u MOBILE\u HIPRI
等等。我对什么类型的“mobile”连接可用的细节不感兴趣,getTypeName()
将简单地为所有连接返回“mobile”。ConnectionVityManager类的描述没有告诉我如何使用该类,它只是方法签名和常量值的列表。这个问题的答案中包含的信息比文档中包含的信息要多。没有提到getActiveNetworkInfo()可以返回null,没有提到需要访问\网络\状态权限,等等。