Android getActiveNetwork总是返回null

问题描述:

我正在用Unity和Tango SDK开发一个Tango应用程序,但是,我需要能够检查设备的Wifi连接并相应地连接到Wifi网络。由于这一点,我开始研究Android Unity网络插件,但我在检查设备的连接性时遇到麻烦;即使Wifi已打开且设备已连接至Wifi网络,getActiveNetwork仍会返回空值。Android getActiveNetwork总是返回null

我花了几天的时间搜索解决方法或替代实现,但找不到任何可行的代码,下面是我查看了许多Android连接相关后用于执行检查的代码我看过的问题以及我在清单中使用的所有权限。

(我想指出的是,目前我正在返回一个整数为手段,以快速调试功能时,通过Unity C#脚本调用,而现在该函数总是返回0)

public int IsConnectedToWifi(){ 

     //SCCActivity activity = new SCCActivity(); 
     ConnectivityManager cm = (ConnectivityManager) this.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); 
     if(cm == null) return -2; 
     NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 


     if (activeNetwork != null) { // connected to the internet 
      if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { 
       // connected to wifi 
       DebugToast(activeNetwork.getTypeName()); 
       return 1; 
       //return activeNetwork.isConnected(); 
      } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { 
       // connected to the mobile provider's data plan 
       DebugToast(activeNetwork.getTypeName()); 
       return 2; 
       //return false; 
      } 
     } 
     else { 
      DebugToast("There is no active Network"); 
      return 0; 
      //return false; 
     } 

     DebugToast("Failed to get a Connectivity Manager"); 
     return -1; 
     //return false; 
    } 

在AndroidManifest文件中:

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

我真的很感激任何建议或指导,谢谢。

在进一步调试并查看类似案例后,我发现并解决了该问题。

我会在这里留下我的解决方案,以防其他人遇到类似问题。

基本上,getActiveNetwork是不是真的返回null可言,事实证明,即使该权限是对XML列,“android.permission.ACCESS_NETWORK_STATE”从未授权和功能被扔了一个异常。问题的原因是,正如我之前提到的,我正在使用Tango SDK for Unity开发Tango应用程序,Tango SDK提供的xml覆盖了Java插件中的xml。

解决方案很简单;我只是将权限添加到了Tango SDK的xml中。

嘿,我不知道你是否真的想检查手机是连接到WIFI还是MOBILE_INTERNET。

但如果你只是要检查,如果手机有连接 比下面的代码为我工作得很好

public static final boolean isNetworkAvailable(Context context) { 

    boolean connected = false; 
    ConnectivityManager connectivityManager = 
      (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo nf = connectivityManager.getActiveNetworkInfo(); 
    if (nf != null && (nf.isConnected() || nf.isConnectedOrConnecting())) { 
     // we are connected to a network 
     connected = true; 
    } else 
     connected = false; 

    return connected; 
} 
+0

嘿,谢谢你的回复!我只是测试了代码,但结果相同,即使设备连接到网络,getActiveNetworkInfo仍然返回null,并且由于nf始终为空,函数也会返回false。 – Geoab

+0

@Geoab您在模拟器或真实设备中检查!你连接到WIFI? – AJay

+0

我正在检查真实设备,并且设备已连接到WIFI – Geoab

我一直在与奇巧及更高版本的设备成功地利用这一点:

public static boolean isConnectedWifi(Context context){ 
    NetworkInfo info = Connectivity.getNetworkInfo(context); 
    return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI); 
} 

我也在过去将它与ConnectivityManager.TYPE_MOBILE进行了比较,但不记得它的工作效果有多好。

+0

感谢您的回复。我试图测试你的代码,但我得到了“无法解析连接符号”错误,连接不是android.net.ConnectivityManager包的一部分吗?我需要导入一个不同的包吗? – Geoab

+0

我的不好,我确定这是香草android代码,但实际上连接是在我的项目中创建的。它最终所做的就是像您尝试的那样调用getActiveNetworkInfo。我将很快删除这个答案,因为它没有添加任何东西。 – Fabio