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 в прошлом, но не могу вспомнить, насколько он хорош или плох.