Android getActiveNetwork 总是 returns 空
Android getActiveNetwork always returns null
我正在使用 Unity 和 Tango SDK 开发 Tango 应用程序,但是,我需要能够检查设备的 Wifi 连接并相应地连接到 Wifi 网络。
考虑到这一点,我开始研究 Android Unity 网络插件,但我在检查设备的连接性时遇到了麻烦;即使 Wifi 已打开并且设备确实已连接到 Wifi 网络,getActiveNetwork 仍会返回 null。
我花了几天时间寻找解决方法或替代实现,但我找不到任何有效的方法,下面是我在浏览了许多 Android 我查看了与连接相关的问题,以及我在清单中使用的所有权限。
(我想指出,我目前返回一个整数作为通过 Unity C# 脚本调用时快速调试函数的一种方式,现在函数总是 returns 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;
}
在Android清单文件中:
<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"/>
非常感谢任何建议或指导,谢谢。
嘿,我不知道你是否真的要检查 phone 是否已连接到 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;
}
我已经在带有 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 进行过比较,但不记得它的效果如何。
经过进一步调试和查看类似案例,发现并解决了问题。
我会在这里留下我的解决方案,以防其他人遇到类似问题。
基本上,getActiveNetwork 根本没有真正返回 null,事实证明即使权限列在 xml、"android.permission.ACCESS_NETWORK_STATE"从未被授予并且函数抛出异常。问题的原因是,正如我之前提到的,我正在使用 Tango SDK for Unity 开发 Tango 应用程序,而 Tango SDK 提供的 xml 覆盖了 xml 来自Java 插件。
解决方法很简单;我只是将权限添加到 Tango SDK 的 xml 中。
我有点老了,但也许它对某人有帮助。在我的例子中,当我 更改 permissions 在 manifest 中的顺序 ACCESS_NETWORK_STATE 在 INTERNET 之前就可以了
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
奇怪但有效
我正在使用 Unity 和 Tango SDK 开发 Tango 应用程序,但是,我需要能够检查设备的 Wifi 连接并相应地连接到 Wifi 网络。
考虑到这一点,我开始研究 Android Unity 网络插件,但我在检查设备的连接性时遇到了麻烦;即使 Wifi 已打开并且设备确实已连接到 Wifi 网络,getActiveNetwork 仍会返回 null。
我花了几天时间寻找解决方法或替代实现,但我找不到任何有效的方法,下面是我在浏览了许多 Android 我查看了与连接相关的问题,以及我在清单中使用的所有权限。
(我想指出,我目前返回一个整数作为通过 Unity C# 脚本调用时快速调试函数的一种方式,现在函数总是 returns 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;
}
在Android清单文件中:
<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"/>
非常感谢任何建议或指导,谢谢。
嘿,我不知道你是否真的要检查 phone 是否已连接到 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;
}
我已经在带有 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 进行过比较,但不记得它的效果如何。
经过进一步调试和查看类似案例,发现并解决了问题。
我会在这里留下我的解决方案,以防其他人遇到类似问题。
基本上,getActiveNetwork 根本没有真正返回 null,事实证明即使权限列在 xml、"android.permission.ACCESS_NETWORK_STATE"从未被授予并且函数抛出异常。问题的原因是,正如我之前提到的,我正在使用 Tango SDK for Unity 开发 Tango 应用程序,而 Tango SDK 提供的 xml 覆盖了 xml 来自Java 插件。
解决方法很简单;我只是将权限添加到 Tango SDK 的 xml 中。
我有点老了,但也许它对某人有帮助。在我的例子中,当我 更改 permissions 在 manifest 中的顺序 ACCESS_NETWORK_STATE 在 INTERNET 之前就可以了
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
奇怪但有效