Проверьте интернет-соединение, а не состояние сети
Мое приложение также работает в автономном режиме и работает нормально, когда интернет доступен. Я использую следующий код для проверки интернет-соединения.
ConnectivityManagercm = (ConnectivityManager) ConnectivityClass.getInstance().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
Проблема в том, что если мы подключили сеть Wi-Fi, которая не включает доступ в Интернет или требует аутентификации на основе браузера, она все равно возвращает true Должно возвращать false, если интернет недоступен. Мне нужно проверить подключение к интернету, а не состояние подключения к мобильной сети.
minSdkVersion 15
3 ответа
Вы можете пинговать URL. Тогда вы можете знать, что Интернет точно доступен.
public Boolean isInternetAvailable() {
try {
Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
boolean avaiablility = (p1.waitFor()==0);
return avaiablility;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
Надеюсь, используя этот код, вы можете проверить сетевое соединение
public class InternetCheckerTask extends AsyncTask<Void, Void, Void> {
private OnInternetCheckListener listener;
private int authStatus;
private boolean running;
public InternetCheckerTask(OnInternetCheckListener listener) {
this.listener = listener;
}
@Override
protected Void doInBackground(Void... voids) {
running = true;
if(isInternetReallyAvailable()) {
authStatus = AuthConstants.CONNECTED;
} else {
authStatus = AuthConstants.NOT_CONNECTED;
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
if(listener != null) {
listener.onResponse(authStatus);
}
running = false;
}
// should not be called from ui thread, can be called only from background service
private boolean isInternetReallyAvailable() {
ConnectivityManager cm = (ConnectivityManager) App.getInstance().getBaseContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if(activeNetwork == null || !activeNetwork.isAvailable() || !activeNetwork.isConnected()) {
return false;
} else {
// TCP/HTTP/DNS (depending on the port, 53=DNS, 80=HTTP, etc.)
try {
int timeoutMs = 1500;
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);
sock.connect(sockaddr, timeoutMs);
sock.close();
return true;
} catch (IOException e) {
return false;
}
}
}
public boolean isRunning() {
return running;
}
public interface OnInternetCheckListener {
void onResponse(int status);
}
}
создать класс и определить следующее постоянное значение
public class AuthConstants {
public static final int CONNECTED = 1;
public static final int NOT_CONNECTED = 2;
}
и вот как вы должны использовать эту функцию везде, где вам нужно
new InternetCheckerTask(new InternetCheckerTask.OnInternetCheckListener() {
@Override
public void onResponse(int status) {
switch (status) {
case AuthConstants.CONNECTED:
// connection is available
break;
default:
// no connection
break;
}
}
}).execute();
public static boolean isOnline(Context ctx) {
ConnectivityManager cm = (ConnectivityManager) ctx
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm != null
? cm.getActiveNetworkInfo()
: null;
return netInfo != null && netInfo.isConnectedOrConnecting();
}
- Проверьте мой ответ,чтобы обработать изменение сети между Wi-Fi и мобильными данными.