【问题标题】:How do you check the internet connection in android? [duplicate]你如何检查android中的互联网连接? [复制]
【发布时间】:2011-01-20 13:42:00
【问题描述】:

我想检查每个活动中的互联网连接。如果丢失,应显示一条消息。

谁能指导我如何实现这一目标?

【问题讨论】:

标签: android android-activity network-state


【解决方案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_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...
          }  
          

          【讨论】:

            猜你喜欢
            • 2019-07-27
            • 2013-02-02
            • 2017-11-30
            • 2012-03-23
            • 1970-01-01
            • 1970-01-01
            • 2012-06-12
            • 1970-01-01
            • 2016-01-16
            相关资源
            最近更新 更多