繁体   English   中英

Android getActiveNetwork 总是返回 null

[英]Android getActiveNetwork always returns null

我正在使用 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"/>

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

嘿我不知道你是否真的想检查手机是否连接到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 覆盖了 Java 插件中的 xml。

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

我有点老了,但也许它可以帮助某人。 在我的情况下,当我以ACCESS_NETWORK_STATE在 INTERNET 之前的方式更改清单中的权限顺序时,它起作用了

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

奇怪但有效

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM