你如何检查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。我已经修改了解决方案。现在更简单了:-) 别忘了将&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;添加到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: 好吧,我注意到了一件事.. 当 wifi 连接到无线调制解调器互联网覆盖范围是否存在时,它总是说是,您已连接它只检查 wifi 连接而不是互联网连接,所以如何处理这样的情况? 这不会一直有效,您需要遍历所有网络类型: NetworkInfo infos[] = conMgr.getAllNetworkInfo(); for(NetworkInfo info : infos) 在 if 周围,没有别的。 查看威廉的回复以获得更简洁和“正确”的方法。正如已经指出的那样,这种方法并不详尽。 代码错误。如果禁用网络号 0,则不会检查网络 0 的状态,但可以连接...【参考方案3】:

您可以针对各种类型的网络状态执行此操作

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 访问。

记得在 ma​​nifest 文件中声明广播接收器:

<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_WIFIConnectivityManager.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中的互联网连接? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式检查 Android 中互联网连接的可用性?

如何每隔N秒检查一次android中的Internet连接

我如何检查我的设备是否与互联网连接

如何在 iOS 设备上检查互联网连接? [复制]

检查 Android 中的 *** 连接是不是处于活动状态并显示消息? [复制]

Flutter:如何检查互联网连接? [复制]