2014-01-13 5 views
2

У меня есть следующий код в приложении, которое будет проверять подключение к Интернету. Он работает, т. Е. Скажет, что нет Интернета, если его нет (в отличие от использования, ConnectivityManager, который будет говорить только о том, что вы подключены к маршрутизатору/3g, но на самом деле не проверяете подключение к Интернету), но только пока кто-то не подключится к точке Wi-Fi, которая перенаправляет пользователя на страницу входа. Затем приложение вернет код 200 и попробует продолжить, но в конечном итоге потерпит крах (и немного сработает). Мое приложение будет использоваться в основном в месте, где есть такое место WiFi. Как проверить, был ли перенаправлен запрос?Проверьте фактическое подключение к Интернету

class online extends AsyncTask<String, String, String> 
{ 
    boolean responded = false; 
    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     pDialog2 = new ProgressDialog(Main.this); 
     pDialog2.setMessage("Checking internet, please wait..."); 
     pDialog2.setIndeterminate(false); 
     pDialog2.setCancelable(false); 
     pDialog2.show(); 
    } 

    protected String doInBackground(String... args) 
    { 
     try 
     { 

      URL url = new URL("http://mydomain.com/connectionTest.html"); 

      HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
      urlc.setConnectTimeout(6000); // Timeout is in seconds 
      urlc.setReadTimeout(6000); 
      urlc.connect(); 
      if (urlc.getResponseCode() == 200) 
      { 
       responded = true; 
      } else 
      { 

      } 

     } catch (IOException e) 
     { 
     } 

     try 
     { 
      int waited = 0; 
      while (!responded && (waited < 5000)) 
      { 
       mHandler.postDelayed(new Runnable() 
       { 
        public void run() 
        { 
        } 
       }, 100); 
       waited += 100; 
      } 
     } 
     finally 
     { 
      if (!responded) 
      { 
       h.sendEmptyMessage(0); 
      } 
      else 
      { 
       h.sendEmptyMessage(1); 
      } 
     } 
     return null; 
    } 

    protected void onPostExecute(String file_url) 
    { 
     pDialog2.dismiss(); 
    } 
} 

ответ

4

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

Вы будете иногда видеть запрос на http://google.com/generate_204. Если вы находитесь за страницей пароля общедоступной точки доступа, вы обычно получаете 200 Ok с сервера, который перехватил веб-запрос, чтобы обслуживать страницу входа. Если пользователь уже зарегистрировался, вы получите статус HTTP 204 No Content.

Чтобы проверить, есть ли у вас доступ к общедоступной сети, вы можете запустить следующее:

URL url = new URL("http://google.com/generate_204"); 
HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection(); 
httpUrlConnection.setConnectTimeout(6000); // Timeout is in seconds 
httpUrlConnection.setReadTimeout(6000); 
httpUrlConnection.connect(); 
if (httpUrlConnection.getResponseCode() == HttpURLConnection.HTTP_NO_CONTENT) { 
    // Great you have free access to the web 
} else { 
    // Either your server is mis-configured or you are behind a hotspot login screen 
} 

В идеале вы должны провести свой собственный /generate_204 на вашем веб-сервере, то вы не будете пойманы на недокументированном смену Google. Также он может служить средством проверки доступности вашего сервера с устройства.

Использование этого в сочетании с ConnectivityManager должно начать давать вам довольно четкое представление о состоянии сети и достижимости вашего сервера.

+0

У меня есть свой собственный сайт (мое приложение подключается к нему). Итак, вы говорите, что я должен поместить на него страницу generate_204 и попытаться достичь этого? – Howli

+0

Да, это было бы лучше всего. Если вы используете Apache, вы можете создать генератор 204, используя 'RedirectMatch 204 generate_204 $' в вашей конфигурации. К сожалению, я не могу помочь за пределами Apache, и вам нужно будет проверить документацию для своего сервера, чтобы узнать, возможно ли это. В противном случае вам понадобится отступить на доступный серверный язык для генерации 204 для вас. –

+0

Прохладный. Сделать это на 100% ясным для себя. Я получаю ответ 204 (с Apache/php/безотносительно). Получите приложение (попробуйте) подключиться к этой странице, и если нет страницы входа в хот-спот, я получу 204, и все будет хорошо, если нет, тогда я распечатаю сообщение, не сообщая о доступе в интернет и т. Д. – Howli

Смежные вопросы