ConnectivityManager getActiveNetworkInfo空指针异常

时间:2013-05-06 11:10:49

标签: android android-service android-networking

我在连接管理器中偶尔会看到空指针异常。从意图服务我通过isOnWIFI(this)检查网络状态。在cm.getActiveNetworkInfo()行发生异常。这很奇怪,因为我在调用之前检查了null。 注意:权限已设置。

public static boolean isOnWIFI(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        return cm != null
                //here occurs NullPointerException
                && cm.getActiveNetworkInfo() != null
                && ((cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null && cm.getNetworkInfo(
                        ConnectivityManager.TYPE_WIFI).isConnected()));

}

为什么会发生这种情况?我无法调试它,因为它只是偶尔出现错误报告。我看到的唯一解决方案是将其放入try catch块。感谢。

6 个答案:

答案 0 :(得分:6)

你检查api是否提到他们如果没有活动连接他们只是返回null我认为这是你的问题。

http://developer.android.com/reference/android/net/ConnectivityManager.html #getActiveNetworkInfo()

答案 1 :(得分:6)

android_dev是对的。代码中的问题来自cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()));

是的!您之前检查cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null,但是第二次调用getNetworkInfo(),android会再次获取网络信息,但这次它不会遇到第二次返回null的活动网络。 问题是,不是因为你之前毫微秒调用getNetworkInfo()并且没有得到空值,意味着你不会在一毫秒之后得到它

答案 2 :(得分:3)

Try this. Read more here

http://developer.android.com/training/basics/network-ops/managing.html

public static boolean isOnWIFI(Context context) {

 ConnectivityManager cm = (ConnectivityManager) this.getSystemService(context.CONNECTIVITY_SERVICE);

 if(cm != null){

   NetworkInfo networkInfo = cm.getActiveNetworkInfo();

   boolean isWiFi = networkInfo.getType() == ConnectivityManager.TYPE_WIFI;

   // if user is connected to network
   if (isWifi) {  
      return true;

   }else {
     return false;

   }

 }
 else{
    //cm is null 
    return false

 }  
}

答案 3 :(得分:2)

getActiveNetworkInfo 如果没有根据文档>>没有可用的默认连接,则返回null getActiveNetworkInfo。所以我建议你做的是检查网络,每个网络如下所示

NetworkInfo WiFiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobileInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

然后检查它们是否可用

if(mobileInfo != null &  mobileInfo.isConnectedOrConnecting() || WiFiInfo != null  & WiFiInfo.isConnectedOrConnecting())
    {
        //do your task here
    }
else {
     //show an alert dialog or something    
}

答案 4 :(得分:0)

当我使用服务时,这解决了我的问题..在我刚刚使用之前!info.isConnected()但这还不够

 ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();

        if(info==null || !info.isConnected()) {
            stopSelf();
            return;

        }

答案 5 :(得分:-1)

我刚刚制作了一个有这种问题的模板,现在效果很好。你可以尝试这个代码,我在很多设备上试过它,没有问题。 getActiveNetworkInfo() problem。在我尝试getAllNetworkInfo()之前,我不明白出了什么问题,但是getAllNetworkInfo()在某些设备上运行起来很愚蠢。