У меня есть приложение для Android, которое проверяет наличие активного доступа в Интернет при первом запуске на устройстве пользователя.Это связано с тем, что приложение выполняет вызовы API, а затем загружает некоторое соответствующее содержимое, и я хотел, чтобы приложение не получало какого-либо ненужного содержимого.
Есть некоторые вещи, которые я хочу определить и объяснить здесь:
Я знаю, как проверить подключение к Интернету.Но настоящая проблема заключается в том, что пользователь открывает / получает доступ к приложению в точке доступа Wi-Fi, например, в Starbucks или в корпоративной организации, где телефон указывает, что он подключен к Интернету, но пользователю придетсяЧтобы получить доступ к Интернету, введите пароль или согласитесь с некоторыми условиями через браузер.Я хочу знать, можно ли получить доступ к Интернету без каких-либо препятствий.Есть ли способ проверить, есть ли такой активный доступ в Интернет?
Я пробовал следующее, но это не надежное решение:
Сделать запрос на http://www.google.com. Если есть перенаправление, предупредите пользователя, что нет активного доступа в Интернет.Это, вероятно, потерпит неудачу, если к приложению обращаются за пределами США, где перенаправление будет, например, на http://www.google.co.cr.Но у телефона все еще есть доступ к Интернету.
ОБНОВЛЕНИЕ ОДНОГО: Я попытался выполнить эту проверку так, как это было описано в ссылке, предоставленной @CommonsWare.Тем не менее, та же проблема, определенная выше, кажется, сохраняется.Более того, проверка занимает 3-4 секунды, и, учитывая, что это нужно делать каждый раз, когда меняется подключение, такая проверка будет вредна для приложения.Следовательно, если у кого-то есть эффективное решение этой проблемы, пожалуйста, дайте мне знать.Тем временем, однако, чтобы мое приложение не зависало в таких ситуациях, я провел некоторую обработку, чтобы убедиться, что полученные данные имеют правильный формат при выполнении вызовов API
ОБНОВЛЕНИЕ ВТОРОЕ: Вот решение, основанное на предложении @ CommonsWare.Это может занять 0,5 - 15 секунд, в зависимости от силы соединения:
public class InternetCheck {
public static boolean ActiveInternetExists() {
boolean internetAccessExists = false;
//make the android homepage as the requested url
//this is a critical decision point.
//the belief here is that this url can be accessed all around the world
String urlToBeAccessed = "http://www.android.com/";
final int TIMEOUT_VALUE_IN_MILLISECONDS = 6000;
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL(urlToBeAccessed);
urlConnection = (HttpURLConnection) url.openConnection();
//set the respective timeouts for the connection
urlConnection.setConnectTimeout(TIMEOUT_VALUE_IN_MILLISECONDS);
urlConnection.setReadTimeout(TIMEOUT_VALUE_IN_MILLISECONDS);
//the redirect check is valid only after the response headers have been received
//this is triggered by the getInputStream() method
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
//check if the urls of the requested and landing pages are equal
//if yes, then we don't have a redirect
if (url.getHost().equals(urlConnection.getURL().getHost()))
internetAccessExists = true;
}
//any sort of exception is considered as a redirect.
//more specific exceptions such as SocketTimeOutException and IOException can be handled as well
catch (Exception e) {
}
finally {
urlConnection.disconnect();
}
return internetAccessExists;
}
}
Еще больше информации для Android ...