Проверьте подключение к сети
В моем приложении, которое я тестирую на эмуляторе, я использую следующий код для проверки сетевого подключения (WIFI):
public boolean isOnline() {
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}
Этот метод возвращает всегда true
, даже если я отключу беспроводное соединение моего компьютера...
Это вызвано эмулятором или это что-то еще?
Если это неверный способ проверить подключение к сети, как я могу это сделать?
Ответы
Ответ 1
Лучше (1) передать контекст, чтобы каждое действие могло вызывать эти функции, и (2) Сделать эту функцию static:
public boolean isNetworkOnline() {
boolean status=false;
try{
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getNetworkInfo(0);
if (netInfo != null && netInfo.getState()==NetworkInfo.State.CONNECTED) {
status= true;
}else {
netInfo = cm.getNetworkInfo(1);
if(netInfo!=null && netInfo.getState()==NetworkInfo.State.CONNECTED)
status= true;
}
}catch(Exception e){
e.printStackTrace();
return false;
}
return status;
}
Ответ 2
Чтобы получить getActiveNetworkInfo() для работы, вам нужно добавить в манифест следующее.
1. uses-permission android:name="android.permission.INTERNET"
2. uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE"
лучше использовать netInfo.isConnected(), а не netInfo.isConnectedOrConnecting
а также попробуйте это
Context.getSystemService(Context.CONNECTIVITY_SERVICE).getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
или
Context.getSystemService(Context.CONNECTIVITY_SERVICE).requestRouteToHost(TYPE_WIFI, int hostAddress)
Ответ 3
В моем случае я отключил Wi-Fi, но забыл об отключении подключения к сети Data/Mobile. Как только я это сделал, код в исходном сообщении для этого потока работал у меня.
Повторить:
- Перейдите в Настройки
- Отключить Wi-Fi
- Перейдите в Настройки- > Использование данных
- Отключить Мобильные данные
![Настройки]()
![Настройки-> Использование данных]()
Ответ 4
Мы можем проверить состояние подключения к Интернету, используя функцию ниже.
Google Android обновил функцию Android API, чтобы проверить состояние сети. Теперь в последних API Android, getAllNetworkInfo() устарел. но функция getAllNetworks() разрешена только для Build.VERSION.SDK_INT >= 21. У меня есть код для всех случаев.
Чтобы проверить подключение к Интернету, вы можете вызвать эту функцию.
public static boolean checkInternetConnection(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity == null) {
return false;
} else if(Build.VERSION.SDK_INT >= 21){
Network[] info = connectivity.getAllNetworks();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i] != null && connectivity.getNetworkInfo(info[i]).isConnected()) {
return true;
}
}
}
} else {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
final NetworkInfo activeNetwork = connectivity.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isConnected()) {
return true;
}
}
return false;
}
Ответ 5
Вот как я собрал это вместе в проекте:
Файл манифеста:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Статическая функция:
public static boolean isNwConnected(Context context) {
if (context == null) {
return true;
}
ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo nwInfo = connectivityManager.getActiveNetworkInfo();
if (nwInfo != null && nwInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}