这个问题在这里已经有了答案:10 年前关闭。
可能重复:如何检查 Android 上的互联网访问? InetAddress 永远不会超时
我需要检测安卓设备是否连接到互联网。
NetworkInfo
类提供了一个听起来很完美的非静态方法 isAvailable()
。
问题是:
NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
// do something
}
抛出此错误:
The constructor NetworkInfo is not visible.
安全的赌注是有另一个类返回一个 NetworkInfo
对象。但我不知道是哪个。
如何让上面的代码片段工作?我怎么能在在线文档中找到我需要的信息?您能否为此类检测提出更好的方法?
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。
我检查 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 才能正常工作等。
getType()
提供了更精细的粒度(我相信)并且可能返回 TYPE_MOBILE
、TYPE_MOBILE_DUN
、TYPE_MOBILE_HIPRI
等。我对可用的“移动”连接类型的细节不感兴趣,getTypeName()
将简单地为所有这些返回“移动”。
第 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!!!!");
}
isAvailable
吗?我认为 isConnected
就足够了。
isAvailable
应该是第一个检查。我发现如果有可用的连接接口,那就是true
。有时(例如,启用 '限制后台数据' 设置时)isConnected
可以为 false
表示接口没有活动连接,但 isAvailable
为 true 表示接口处于可用,您可以建立连接(例如,传输前台数据)。
还有一个重要的注意事项。您必须在 AndroidManifest.xml 中设置 android.permission.ACCESS_NETWORK_STATE
才能使其正常工作。
_ 我怎么能在在线文档中找到我需要的信息?
您只需要正确阅读这些类的文档,您就会找到您正在寻找的所有答案。查看 ConnectivityManager 上的文档。描述告诉你该怎么做。
Requires the ACCESS_NETWORK_STATE permission.
表示为 here。
ConnectivityManager 的 getActiveNetworkInfo() 方法返回一个 NetworkInfo 实例,该实例表示它可以找到的第一个连接的网络接口,如果接口已连接,则返回 null 如果没有。检查此方法是否返回 null 应该足以判断 Internet 连接是否可用。
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
}
您还需要:
在你的 android 清单中。编辑:请注意,拥有活动的网络接口并不能保证特定的网络服务可用。网络问题、服务器停机、低信号、强制门户、内容过滤器等都会阻止您的应用程序到达服务器。例如,在您收到来自 Twitter 服务的有效响应之前,您无法确定您的应用程序是否可以访问 Twitter。
getActiveNetworkInfo() 不应该永远给 null。我不知道他们提出这个想法时在想什么。它应该总是给你一个对象。
可能我已经找到了自己:
ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();
getActiveNetworkInfo()
可以返回 null
不定期副业成功案例分享
return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting();
Utils
方法,即没有从Context
引用可用的地方访问它,您需要将Context
作为参数传递。