Detect whether there is an Internet connection available on Android
我需要检测Android设备是否已连接到Internet。
NetworkInfo类提供听起来很完美的非静态方法isAvailable()。
问题是:
1 2 3 4
| NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
// do something
} |
抛出此错误:
1
| The constructor NetworkInfo is not visible. |
安全的赌注是有另一个类返回NetworkInfo对象。 但我不知道哪个。
如何让上面的代码段工作?
我怎么能找到自己在在线文档中需要的信息?
你能为这种类型的检测提出更好的方法吗?
-
[这] [1]也可能有所帮助[1]:stackoverflow.com/questions/6179906/…
-
android.com上的文章:确定和监控连接状态
-
检查Android中的Internet连接可用性
-
这里的答案实际上都没有回答检查是否存在与互联网连接的问题,只有当您完全连接到网络时才会这样。 有关尝试建立传出TCP连接以测试此问题的示例,请参阅此答案:stackoverflow.com/a/35647792/1820510
-
看看这个:stackoverflow.com/a/39766506/3806413
-
有人试图在Kotlin上做这个尝试检查这个:github.com/vivekverma6594/Network-State-Receiver
ConnectivityManager的getActiveNetworkInfo()方法返回一个NetworkInfo实例,表示它可以找到的第一个连接的网络接口,如果没有连接,则返回null。检查此方法是否返回null应该足以判断是否有可用的Internet连接。
1 2 3 4 5 6
| private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
} |
您还需要:
1
| <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> |
在你的Android清单中。
编辑:
请注意,拥有活动网络接口并不能保证特定网络服务可用。网络问题,服务器停机,低信号,强制网络门户,内容过滤器等都可能阻止您的应用访问服务器。例如,在收到Twitter服务的有效回复之前,您无法确定您的应用是否可以访问Twitter。
-
如果有人(不必要地)在进行http调用之前尝试调用此函数,那么值得看看connectiontimeout! :-)
-
为了安全起见,我会return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting();
-
从getActiveNetworkInfo()的文档:When connected, this network is the default route for outgoing connections. You should always check isConnected() before initiating network traffic.,@ jeffAroelrod建议,也许使用isConnected()而不是isConnectedOrConnecting()。
-
我收到错误"connectivityManager无法解析"。知道我应该怎么解决这个问题?
-
如果要创建Utils方法,即不从Context引用可用的位置访问此方法,则需要传递Context作为参数。
-
注意:如果您没有所需的权限,这似乎会阻止您的代码而不是抛出错误。至少,我从来没有看到过错误,代码从未超出要求。
-
@JeffAxelrod,我猜你添加了"!= null","isConnectedOrConnecting"不正确,因为我们想知道我们是否有互联网连接,而在连接时,我们没有互联网连接。
-
这不会检查手机是否已连接到互联网。只有网络连接已经完成。
-
这让我的手机崩溃了。这仍然适用于2014年6月?
-
@AlexandreJasmin是否检查3G,GPRS,EDGE ......
-
@ Mr.Hyde不幸的是,没有。这种方式只检查是否已建立网络连接,但不检查该设备是否已连接到互联网。要真正了解有效的互联网连接,您应该将HttpURLConnection用于某些主机,ping某些主机(例如google.com)或尝试使用InetAddress.getByName(hostName).isReachable(timeOut)
-
@Dimon:如何应用这个HttpURLConnection?任何教程?
-
@ Rania-Boy上面发布的方法isNetworkAvailable()只能像前一步那样使用,有些网络连接存在。为了检查有效的互联网连接,我现在使用HttpURLConnection,这是将其用于直接IP地址的主要目标,例如非UI线程中的174.123.173.67
-
它适用于wifi吗?
-
即使没有可用的连接,它也会返回true
-
这个代码除了4.3之外到处都很好。你需要为4.3做一个实际的ping,因为它总是返回true。
-
@ngatirauks在4.3上使用samsung galaxy s3我没有这个问题
-
这有多快?我可以在每次http调用之前执行此isConnected()函数吗?
-
@Zapnologica使用调试模式在真实设备上检查了这个,似乎需要一毫秒来执行该方法,所以它真的很快
-
我做了一个简单的测试。我从路由器中取出输入以太网电缆,然后调用此方法。因此该设备已连接到WI-Fi,但Wifi本身未连接到互联网。你猜怎么着!即便如此,它仍然是真的。因此,如果我想确保设备连接到互联网,我会ping一个知名网站,而不是检查这个。
-
我测试了这个,如果你有wifi但没有互联网连接会产生误报。这个答案似乎有误导性。
-
但即使没有来自wifi的互联网连接它也会返回连接,是否真的需要ping网站?
-
connectivityManager是不够的,要知道你是否有互联网接入,你必须测试它!最好的答案是:stackoverflow.com/a/27312494/968538
-
@JeffAxelrod令人怀疑。为了安全起见,我想确切知道它是否已连接,而不是它是否正在尝试连接(而且它将无法连接)。
-
@JeffAxelrod isConnectedOrConnecting()在API级别28中已弃用。
-
这很糟糕,它在关闭我的wifi时返回false但是启用了移动网络,只有几秒后才开始返回true
我检查Wi-Fi和移动互联网如下......
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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速度才能正常工作等。
-
代码很好,我只是希望人们在编写java hasConnectedWifi,hasConnectedMobile时坚持Java编码风格。我知道这是一件小事,但一致的代码更具可读性。
-
虽然在良好的实践中最好让左边的String,如果你不需要使用equalsIgnoreCase:if("WIFI".equals(ni.getTypeName()))
-
@Stuart Axon:噢,这就是我想的。自从我在1970年代后期开始以来,我编写了比我记忆中更多的语言,我显然已经养成了许多不良习惯。总的来说,我坚持的原则是,如果它有效,那么......好吧,它有效,这就是我所关心的。上面的代码片段是完全独立的,对于任何具有合理编程经验的人来说,很容易找到并且(最重要的是)如果有人将其剪切并粘贴到他们自己的代码中,那么它们将适用于他们。很抱歉成为Android / Java菜鸟。
-
不是点数或任何东西(或者SO工作) - 我发现代码很有用,但我想以我脾气暴躁的方式试图提供一些半有用的反馈。
-
为什么不使用getType()而不是getTypeName()?
-
@BoD:getType()提供更精细的粒度级别(我相信)并可能返回TYPE_MOBILE,TYPE_MOBILE_DUN,TYPE_MOBILE_HIPRI等等。我对什么类型的"移动"连接可用的细节不感兴趣,getTypeName()只会为所有这些连接返回'MOBILE'。
-
此代码导致没有SIM卡的平板电脑出错。是否有任何替代代码告诉我们连接类型。
-
@AhmedNawaz:它在我的Nexus 7平板电脑上工作正常,没有SIM卡。
-
这让我的手机崩溃了。这仍然适用于2014年6月?
-
@FranciscoCorralesMorales:是的。因为它在2013年11月在我的Nexus 7上为我工作,是什么让你觉得它现在还不能正常工作。如果您遇到问题,请使用代码发布您自己的Stack Overflow问题,并使用logcat显示崩溃堆栈跟踪。有人会帮你找到答案。
-
我不得不在context.getSystemService中添加Context,否则它不起作用。我在这里得到了线索androidhive.info/2012/07/…
-
所以接受的答案不会检测移动互联网接入?
-
@ogen:是的,但不区分不同的网络类型。在说,我的代码也没有检查移动或无线 - 只要连接一个或其他,然后它返回true。我已经重写了我的代码,包括有线以太网和分离的方法,以允许分别检查每种类型的网络。
-
这个解决方案可能会有所帮助,但我错过的是何时运行它。换句话说,如何以编程方式检测这种状态,其中连接了wifi,但是正在使用用于互联网的移动数据?
-
用它来检查互联网连接或只是网络连接。
-
getAllNetworkInfo已被删除
-
是的,它已被弃用 - 更新的代码在这里 - > stackoverflow.com/a/32771164/1012435。
第1步:在项目中创建一个AppStatus类(您也可以给出任何其他名称)。
然后,请将以下给定的行粘贴到您的代码中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| 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步:现在检查您的设备是否具有网络连接,然后只需将此代码段添加到您要检查的位置...
1 2 3 4 5 6 7 8 9
| 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就足够了。
-
如果您将Context传递给构造函数,为什么还需要在isOnline中执行此操作?
-
这让我的手机崩溃了。这仍然适用于2014年6月?
-
@AlexanderMalakhov实际上isAvailable应该是第一次检查。我发现如果连接接口可用,则为true。有时(例如,启用"限制后台数据"设置时)isConnected可以false表示接口没有活动连接但isAvailable为真表示接口可用且您可以建立连接(例如,传输前景数据)。
-
我做了一个简单的测试。我从路由器中取出输入以太网电缆,然后调用此方法。因此该设备已连接到WI-Fi,但Wifi本身未连接到互联网。你猜怎么着!即便如此,它仍然是真的。因此,如果我想确保设备连接到互联网,我会ping一个知名网站,而不是检查这个。
-
我猜想如果设备连接到移动数据网络会发生同样的情况,但提供商只允许你使用facebook,whatsapp等,而不是其他网站。这些验证只允许您快速告诉用户他没有连接,而不是让他/她等待超时。我说,必须进行两项检查:数据连接可用性加上"Internet"可用性。
另一个重要的说明。您必须在AndroidManifest.xml中设置android.permission.ACCESS_NETWORK_STATE才能使其正常工作。
_ how could I have found myself the information I needed in the online documentation?
您只需要正确阅读课程文档,您就可以找到所需的所有答案。查看ConnectivityManager上的文档。说明会告诉您该怎么做。
-
ConnectivityManager类的描述告诉我如何使用该类,它只是方法签名和常量值的列表。这个问题的答案中的信息比该文档中的信息更多。没有提到getActiveNetworkInfo()可以返回null的事实,没有提到需要ACCESS_NETWORK_STATE权限等等。除了Android源之外,你究竟在哪里找到这个信息?
-
好点dfjacobs。 Stackoverflow似乎是缺乏正确的食谱示例的goto源。
-
Requires the ACCESS_NETWORK_STATE permission.在此处说明。
The getActiveNetworkInfo() method of ConnectivityManager returns a
NetworkInfo instance representing the first connected network
interface it can find or null if none if the interfaces are connected.
Checking if this method returns null should be enough to tell if an
internet connection is available.
1 2 3 4 5
| private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
} |
您还需要:
in your
android manifest.
Edit:
Note that having an active network interface doesn't guarantee that a
particular networked service is available. Networks issues, server
downtime, low signal, captive portals, content filters and the like
can all prevent your app from reaching a server. For instance you
can't tell for sure if your app can reach Twitter until you receive a
valid response from the Twitter service.
getActiveNetworkInfo()不应该永远不会给null。当他们提出这个问题时,我不知道他们在想什么。它应该总是给你一个对象。
-
如果没有单个活动连接,为什么还要让它返回一个对象?
可能我发现自己:
1 2
| ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting(); |
-
如果没有活动网络,则期望getActiveNetworkInfo()可以返回null飞行模式
-
是的,它将返回null,这是没有记录的。
-
是的,所以首先进行空检查activeNetwork!= null&amp;&amp; activeNetwork.isConnectedOrConnecting();
-
我喜欢这一行:boolean isWifiConnected = activeNetwork!= null&amp;&amp; activeNetwork.isConnectedOrConnecting()&amp;&amp; activeNetwork.getType()== ConnectivityManager.TYPE_WIFI;
-
任何人都可以更详细地解释这一行对我来说很奇怪:首先是activeNetwork!= null