2011-06-15 33 views
4

我已经使用Google地图创建了一个Android应用程序。现在我想检查一下互联网连接是否可用。我在谷歌搜索,最后我通过了#1解决方法:Android中检测Internet连接时的问题

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; 
    } 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

我写我的网上谷歌地图的代码,如果它返回true和离线码,如果它返回false。

我的问题是它显示互联网连接是可用的,即使它不是。我在哪里犯了一个错误?

回答

11

尝试使用NetworkInfo ni = cm.getActiveNetworkInfo();而不是NetworkInfo ni = cm.getAllNetworkInfo();。一次只能有一个活动的数据网络,因为Android会使用最好的可用并关闭其他节点来保存电池。

此外,我倾向于使用ni.isConnectedOrConnecting();而不是ni.isConnected();,因为它可以更好地捕捉转换状态。

我也使用ni.getType() == ConnectivityManager.TYPE_WIFI而不是ni.getTypeName().equalsIgnoreCase("WIFI"),因为比较两个int值要比比较两个字符串要高效得多。

下面的代码对我的作品:

boolean HaveConnectedWifi = false; 
boolean HaveConnectedMobile = false; 
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo ni = cm.getActiveNetworkInfo(); 
if (ni != null) 
{ 
    if (ni.getType() == ConnectivityManager.TYPE_WIFI) 
     if (ni.isConnectedOrConnecting()) 
      HaveConnectedWifi = true; 
    if (ni.getType() == ConnectivityManager.TYPE_MOBILE) 
     if (ni.isConnectedOrConnecting()) 
      HaveConnectedMobile = true; 
} 
+0

感谢您的快速回复Sir..code当它的网络连接工作正常连接,但是当我在我的系统中关闭我的互联网时,它通过模拟器运行时在ConnectivityManager.TYPE_MOBILE中返回true。在哪里我犯了错误? – deepa 2011-06-15 12:57:59

+0

我不确定我了解你的新问题。尝试将设备/仿真器置于飞行模式,并且都应返回false。我不认为模拟器实际上支持WIFI模式,它总是假定网络连接是MOBILE。如果你需要正确地测试,你需要在设备上进行测试,而不是仿真器。 – 2011-06-15 13:07:00

+0

我已经在飞行模式下更改我的模拟器,并在if(ni.getType()== ConnectivityManager.TYPE_WIFI)中运行应用程序并显示空指针异常。我有一个更多的疑问,当我在手机上运行我的谷歌地图时,是否需要获取释放密钥?如果是这样,我怎么能得到释放钥匙?请详细解释。我在这个API密钥中感到困惑。 – deepa 2011-06-15 13:10:21

0
/** 
* Checking whether net connection is available or not. 
* 
* @param nContext 
* @return true if net connection is avaible otherwise false 
*/ 
public static boolean isNetworkAvailable(Context nContext) { 
    boolean isNetAvailable = false; 
    if (nContext != null) { 
     ConnectivityManager mConnectivityManager = (ConnectivityManager) nContext 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (mConnectivityManager != null) { 
      boolean mobileNetwork = false; 
      boolean wifiNetwork = false; 
      boolean mobileNetworkConnecetd = false; 
      boolean wifiNetworkConnecetd = false; 
      NetworkInfo mobileInfo = mConnectivityManager 
        .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
      NetworkInfo wifiInfo = mConnectivityManager 
        .getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
      if (mobileInfo != null) 
       mobileNetwork = mobileInfo.isAvailable(); 
      if (wifiInfo != null) 
       wifiNetwork = wifiInfo.isAvailable(); 
      if (wifiNetwork == true || mobileNetwork == true) { 
       if (mobileInfo != null) 
        mobileNetworkConnecetd = mobileInfo 
          .isConnectedOrConnecting(); 
       wifiNetworkConnecetd = wifiInfo.isConnectedOrConnecting(); 
      } 
      isNetAvailable = (mobileNetworkConnecetd || wifiNetworkConnecetd); 
     } 
    } 
    return isNetAvailable; 

} 

此外,在清单的权限下面添加标签:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />