Android getActiveNetwork 总是返回 null
Posted
技术标签:
【中文标题】Android getActiveNetwork 总是返回 null【英文标题】:Android getActiveNetwork always returns null 【发布时间】:2018-01-16 18:56:01 【问题描述】:我正在使用 Unity 和 Tango SDK 开发 Tango 应用程序,但是,我需要能够检查设备的 Wifi 连接并相应地连接到 Wifi 网络。
考虑到这一点,我开始开发 android Unity 网络插件,但在检查设备的连接性时遇到了麻烦;即使 Wifi 已打开并且设备确实已连接到 Wifi 网络,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"/>
非常感谢任何建议或指导,谢谢。
【问题讨论】:
【参考方案1】:我有点老,但也许它可以帮助某人。在我的情况下,当我以 ACCESS_NETWORK_STATE 位于 INTERNET 之前的方式 更改 manifest 中 permissions 的顺序时工作过
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
奇怪但有效
【讨论】:
这真的很重要吗?【参考方案2】:嘿,我不知道你是否真的要检查手机是否连接到 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;
【讨论】:
您好,谢谢您的回复!我刚刚测试了代码,但是结果是一样的,getActiveNetworkInfo即使设备连接到网络也一直返回null,并且由于nf始终为null,因此该函数也返回false。 @Geoab 你正在检查模拟器或真实设备!你连接到WIFI了吗? 我正在查看一个真实的设备,并且该设备已连接到WIFI【参考方案3】:我已经在带有 kitkat 及更高版本的设备中成功使用了它:
public static boolean isConnectedWifi(Context context)
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);
我过去也将它与 ConnectivityManager.TYPE_MOBILE 进行过比较,但不记得它的好坏。
【讨论】:
感谢您的回复。我正在尝试测试您的代码,但出现“无法解析连接符号”错误,连接不是 android.net.ConnectivityManager 包的一部分吗?我需要导入不同的包吗? 我的错,我确定这是普通的 android 代码,但实际上连接是在我的项目中创建的。它最终的作用是像您一直在尝试的那样调用 getActiveNetworkInfo 。我会尽快删除此答案,因为它没有添加任何内容。【参考方案4】:经过进一步调试和查看类似案例,我发现并解决了问题。
我将把我的解决方案留在这里,以防其他人遇到类似问题。
基本上,getActiveNetwork 根本没有真正返回 null,事实证明,即使在 xml 中列出了权限,“android.permission.ACCESS_NETWORK_STATE”也从未被授予,并且该函数是抛出异常。问题的原因是,正如我之前提到的,我正在使用 Tango SDK for Unity 开发 Tango 应用程序,而 Tango SDK 提供的 xml 覆盖了 Java 插件中的 xml。
解决方案很简单;我只是将权限添加到 Tango SDK 的 xml 中。
【讨论】:
以上是关于Android getActiveNetwork 总是返回 null的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )