Android getActiveNetwork всегда возвращает ноль

Я занимаюсь разработкой приложения Tango с Unity и Tango SDK, однако мне нужно иметь возможность проверять подключение Wi-Fi устройства и подключаться к сети Wi-Fi соответственно.

Имея это в виду, я начал работать над сетевым плагином Android Unity, но у меня возникают проблемы с проверкой подключения устройства; даже если Wi-Fi включен, а устройство действительно подключено к сети Wifi, getActiveNetwork продолжает возвращать ноль.

Я потратил пару дней на поиски обходного пути или альтернативной реализации, но я не смог найти ничего, что работает, ниже приведен код, который я использовал для проверки после просмотра множества вопросов, связанных с подключением 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"/>

Буду очень признателен за любые советы или рекомендации, спасибо.

4 ответа

Решение

После дальнейшей отладки и просмотра похожих случаев я нашел и решил проблему.

Я оставлю свое решение здесь на случай, если кто-то еще столкнется с подобной проблемой.

По сути, getActiveNetwork на самом деле вообще не возвращал null, оказывается, что даже при том, что разрешение было указано в xml, "android.permission.ACCESS_NETWORK_STATE" никогда не предоставлялось, и функция вызывала исключение. Причиной проблемы был тот факт, что, как я упоминал ранее, я работаю над приложением Tango, использующим Tango SDK для Unity, а XML, предоставляемый Tango SDK, переписывает xml из плагина Java.

Решение было простым; Я просто добавил разрешения в xml Tango SDK.

Я немного стар, но, возможно, это поможет кому-то. В моем случае, когда я изменил порядок разрешений в манифесте таким образом, что ACCESS_NETWORK_STATE стоит перед INTERNET, тогда это сработало .

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

странно но работает

Эй, я не знаю, действительно ли вы хотите проверить, подключен ли телефон к 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 в прошлом, но не могу вспомнить, насколько он хорош или плох.

Другие вопросы по тегам