你如何检查android中的互联网连接? [复制]
Posted
技术标签:
【中文标题】你如何检查android中的互联网连接? [复制]【英文标题】:How do you check the internet connection in android? [duplicate] 【发布时间】:2011-01-20 13:42:00 【问题描述】:我想检查每个活动中的互联网连接。如果丢失,应显示一条消息。
谁能指导我如何实现这一目标?
【问题讨论】:
试试我写的这个库。 github.com/muddassir235/connection_checker 它为监听器提供了 onConnected、onConnectionSlow 和 onDisconnected 方法。 【参考方案1】:在任何一点上只能有一个连接处于活动状态。所以一个更简单的答案是:
final ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isConnected())
// notify user you are online
else
// notify user you are not online
它还适用于任何新类型的网络,例如 ConnectivityManager#TYPE_WIMAX
还要确保您拥有监控网络状态所需的权限。您需要将此权限添加到您的 androidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
【讨论】:
有一个方法名称isConnected()
用于网络信息,可以替换您的行.getState() == ...
并使其更简单吗?
不错的选择#bytebender。我已经修改了解决方案。现在更简单了:-)
别忘了将<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
添加到AndroidManifest.xml【参考方案2】:
您可以使用ConnectivityManager查看网络状态。
ConnectivityManager conMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if ( conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED
|| conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED )
// notify user you are online
else if ( conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.DISCONNECTED
|| conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.DISCONNECTED)
// notify user you are not online
请注意,常量 ConnectivityManager.TYPE_MOBILE 和 ConnectivityManager.TYPE_WIFI 表示连接类型,这两个值并不详尽。有关详尽列表,请参阅 here。
还要确保您拥有监控网络状态所需的权限。您需要将此权限添加到您的 AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
【讨论】:
您必须将此行添加到您的 AndroidManifest.xml:您可以针对各种类型的网络状态执行此操作
public void checkNetworkStatus()
final ConnectivityManager connMgr = (ConnectivityManager)
this.getSystemService(Context.CONNECTIVITY_SERVICE);
final android.net.NetworkInfo wifi =
connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
final android.net.NetworkInfo mobile =
connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if( wifi.isAvailable() )
Toast.makeText(this, "Wifi" , Toast.LENGTH_LONG).show();
else if( mobile.isAvailable() )
Toast.makeText(this, "Mobile 3G " , Toast.LENGTH_LONG).show();
else
Toast.makeText(this, "No Network " , Toast.LENGTH_LONG).show();
【讨论】:
【参考方案4】:您可以直接使用
检查移动和 wi-fi 的网络覆盖范围和数据可用性对于网络覆盖范围可用性,
private boolean isNetworkAvailable()
ConnectivityManager conxMgr = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo mobileNwInfo = conxMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiNwInfo = conxMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return ((mobileNwInfo== null ? false : mobileNwInfo.isAvailable()) || (wifiNwInfo == null ? false : wifiNwInfo.isAvailable()));
对于数据可用性(如果网络可用)
private boolean isDataAvailable()
ConnectivityManager conxMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo mobileNwInfo = conxMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiNwInfo = conxMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return ((mobileNwInfo== null? false : mobileNwInfo.isConnected() )|| (wifiNwInfo == null? false : wifiNwInfo.isConnected()));
【讨论】:
【参考方案5】:修正
if ( conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED
|| conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING )
//notify user you are online
应该是
if ( conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED
|| conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED )
//notify user you are online
【讨论】:
好吧,我注意到了一件事.. 当 wifi 连接到无线调制解调器互联网覆盖范围是否存在时,它总是说是,您已连接它只检查 wifi 连接而不是互联网连接,所以如何处理这样的情况?【参考方案6】:注册广播接收器以处理CONNECTIVITY_ACTION。请参阅此full example。您应该更新一个静态变量“connectionAvailable”,该变量可以随时随地通过其各自的 getter 访问。
记得在 manifest 文件中声明广播接收器:
<receiver android:name=".NetworkConnectivityReceiver" android:enabled="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
关于“检查每个活动”的问题,您可能有兴趣使用 由您的活动扩展的 BaseActivity 并管理连接测试并显示消息。
另外,请注意使用事件(不是从活动中轮询)会更有效。
【讨论】:
【参考方案7】:您没有正确使用 ConnectivityManager.getNetworkInfo(0).getState()
和 ConnectivityManager.getNetworkInfo(1).getState()
,而不是硬编码值 (1) 和 (0) 使用 ConnectivityManager.TYPE_WIFI
和 ConnectivityManager.TYPE_MOBILE
【讨论】:
【参考方案8】:这是一个布尔检查,看看您是否有网络访问权限。它不会确定哪种网络访问方式 - 移动设备、wifi...,它只是检查您是否在线。
boolean mobileNwInfo = false;
ConnectivityManager conxMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
try mobileNwInfo = conxMgr.getActiveNetworkInfo().isConnected();
catch (NullPointerException e) mobileNwInfo = false;
if ( mobileNwInfo == false )
// Your code goes here...
【讨论】:
以上是关于你如何检查android中的互联网连接? [复制]的主要内容,如果未能解决你的问题,请参考以下文章