2012-08-10 1 views
21

Предположим, что телефон находит открытую wi-fi сеть и подключается к ней. Но wi-fi сеть «неактивна», т. Е. При открытии браузера вы видите запрос для учетных данных. У меня есть много приложений на моем телефоне (например, веб-браузер), которые не работают в таких случаях. Я хочу отправить данные с помощью мобильной сети, но система все еще пытается использовать wi-fi.Сделка с неактивными сетями wi-fi

NetworkInfo.isAvailable() и NetworkInfo.isConnected() еще возвращают true для описанных Wi-Fi сетей. Любое решение?

+0

Будет ли возможность простой пинг сайт как Google? если за точкой доступа будет страница входа в систему, это просто завершится неудачей, когда она, как правило, будет успешной. – Viezevingertjes

+0

AFAIK ping сложно. –

+0

Это похоже на http://stackoverflow.com/a/1085054/193892, но для Android это Windows. Было бы хорошо, если бы оно существовало. –

ответ

1

Попробуйте это ....

мне нужно сделать некоторые пользовательские work..but получил его и работает ...

Мой код switches from Wifi to Mobile network когда его от.

И я использую TimeService at port 37 знать, что Интернет DEAD, а соединение WiFi все еще находится на

/////////////////// /////// Подредактировано //////////////////////////////////

Теперь я положив здесь complete working code я сделал. Пожалуйста, извините меня как DRY (Не повторяйте сам принцип) был использован здесь. Поэтому, пожалуйста, рефакторинг кода и преобразовать повторяющиеся коды в метод, то есть в single sensible place, при использовании в производственной сети

/////---------------------------Intial Available Network Checking 



private boolean checkConnection(){ 


boolean connected = false; 
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 

if (cm != null) { 
NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 

for (NetworkInfo ni : netInfo) { 
if ((ni.getTypeName().equalsIgnoreCase("WIFI") 
|| ni.getTypeName().equalsIgnoreCase("MOBILE")) 
& ni.isConnected() & ni.isAvailable()) { 
connected = true; 
    } 

    } 
} 


return connected; 

} ///// ----------- ---------------- Intial Доступные сети Проверка

/////-------------------------------Check for the working Internet Connection 


public boolean inetAddr(){ 

    boolean x1 = false; 


    try { 
     Socket s = new Socket("utcnist.colorado.edu", 37); 

     InputStream i = s.getInputStream(); 

     Scanner scan = new Scanner(i); 

     while(scan.hasNextLine()){ 

      System.out.println(scan.nextLine()); 
      x1 = true; 
     } 
    } catch (Exception e) { 


      x1 = false; 
    } 

    return x1; 

} 

/////-------------------------------Check for the working Internet Connection 


////-------------------------------Check Mobile Conectivity Again 

public boolean mobileConnect(){ 

    boolean conn = false; 
    ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNet = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

    if(activeNet != null){ 

     conn = true; 
    }else{ 

     conn = false; 
    } 

    return conn; 



} 

////------------------------------Check Mobile Conectivity Again 

Здесь я с помощью указанных выше способов ....

try{  
    if (!checkConnection()){ 


     AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this); 
     myAlertDialog.setTitle("--- Connectivity Check ---"); 
     myAlertDialog.setMessage("No Internet Connectivity"); 
     myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

      public void onClick(DialogInterface arg0, int arg1) { 

      YumZingSplashActivity.this.finish(); 
      //splashHandler.removeCallbacks(launcherRunnable); 

      }}); 
      System.out.println("No Internet Connectivity"); 

      myAlertDialog.show();   




     } 
     else{ 


       if(inetAddr()){ 
      aphandle = APIHandling.getInstance(); 
      aphandle.xmlCreateSession(); 
      System.out.println("Net Connectivity is Present"); 
      DURATION = Integer.valueOf(getString(R.string.splash_duration)); 



      splashHandler = new Handler(); 

      // ================ Main Code of the Application 
      launcherRunnable = new Runnable() { 

       public void run() { 
        Intent i = new Intent(YumZingSplashActivity.this, YumZingTabHostActivity.class); 
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(i); 
        YumZingSplashActivity.this.finish(); 
       } 
      }; 
      if (DEBUG) 
      { 
       splashHandler.post(launcherRunnable); 
      } 
      else{ 


       splashHandler.postDelayed(launcherRunnable, DURATION); 
      } 

     } 
       else{ 

        if(mobileConnect()){ 


         if(inetAddr()){ 
         aphandle = APIHandling.getInstance(); 
         aphandle.xmlCreateSession(); 
         System.out.println("Net Connectivity is Present"); 
         DURATION = Integer.valueOf(getString(R.string.splash_duration)); 



         splashHandler = new Handler(); 

         // ================ Main Code of the Application 
         launcherRunnable = new Runnable() { 

          public void run() { 
           Intent i = new Intent(YumZingSplashActivity.this, YumZingTabHostActivity.class); 
           i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
           startActivity(i); 
           YumZingSplashActivity.this.finish(); 
          } 
         }; 
         if (DEBUG) 
         { 
          splashHandler.post(launcherRunnable); 
         } 
         else{ 


          splashHandler.postDelayed(launcherRunnable, DURATION); 
         } 
         }else{ 

          AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this); 
         myAlertDialog.setTitle("--- Connectivity Check ---"); 
         myAlertDialog.setMessage("No Internet Connectivity"); 
         myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

          public void onClick(DialogInterface arg0, int arg1) { 

          YumZingSplashActivity.this.finish(); 
          //splashHandler.removeCallbacks(launcherRunnable); 

          }}); 
          System.out.println("No Internet Connectivity"); 

          myAlertDialog.show();  
         } 
        }else{ 




         AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this); 
         myAlertDialog.setTitle("--- Connectivity Check ---"); 
         myAlertDialog.setMessage("No Internet Connectivity"); 
         myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

          public void onClick(DialogInterface arg0, int arg1) { 

          YumZingSplashActivity.this.finish(); 
          //splashHandler.removeCallbacks(launcherRunnable); 

          }}); 
          System.out.println("No Internet Connectivity"); 

          myAlertDialog.show();   






        } 

       } 
     } 

    //setContentView(R.layout.yumzing_splash_layout); 
    } catch(Exception ex){ 

      System.out.println("Leak ko catch"); 
     } 



    } 
+0

ni.isConnected() вернет true для этого типа сети. –

+0

Спасибо, я посмотрю. –

+0

Пожалуйста, взгляните на мой отредактированный ответ –

2

У меня была такая же проблема, и я обнаружил, что с помощью Android SDK такой возможности нет, вам нужно написать свой собственный способ сделать это.

Это зависит от того, что вы хотите сделать с сетью, и что вы подразумеваете под «неактивным» - вы можете подключиться к маршрутизатору, который не имеет подключения к Интернету, и нет метода Android для проверьте такую ​​ситуацию. Как писал MrMichael, ping - это один из способов проверить это, но в этом случае положительный тест дает вам только информацию о ping - в сети может быть какой-то тяжелый брандмауэр, который позволяет отправлять пинги, но я. е. не будет пропускать HTTP-запрос.

В этом случае вы должны написать свой собственный тест для своих нужд, увы - вот что я сделал. Я просто реализовал простой пинговый протокол (я пытаюсь подключить свой сокет на надлежащем IP-порту и отправить короткое сообщение, ожидая короткого ответа). Только это дает мне 100% гарантию того, что соединение, которое я хочу, может быть установлено.

+1

»вы можете подключиться к маршрутизатору, который не имеет подключение к Интернету "- точно –

+0

Итак, с помощью этого [метода] (http://stackoverflow.com/a/12136830/4385913), если маршрутизатор не подключен к Интернету, он вернет« истину »? потому что хост отличается от 'url.getHost()'? –

2

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

У меня одинаковые требования во многих моих приложениях, я хочу знать, есть ли у них жизнеспособное сетевое соединение, пока загружается экран заставки (например, я показываю только версию для чтения приложения, если нет).

Способ, которым я обойду это, - запустить простой сервисный вызов на мой сервер с именем isAlive, который просто возвращает истинное imedialtly. Это не только говорит мне, что я могу видеть свою услугу, но также подтверждает, что мой сервер работает в режиме онлайн (никаких проблем на моем конце). В случае, если я не получаю ответ своевременно, я сообщаю пользователю, что у них нет сетевого подключения, и «Пожалуйста, убедитесь, что у вас есть действительное соединение с данными/Wi-Fi перед продолжением». I then take isConnected Свойства для Wi-Fi и изменение этого сообщения: "Ваше текущее Беспроводное подключение - Интернет-доступ" или что-то подобное.

Не совсем ответ, на который вы надеялись, но, возможно, возможность?

+0

Спасибо, я попробую. –

+0

Как проверить сервер isAlive? Простой HTTP-запрос? –

+1

В моем случае это вызов моего веб-сервиса, который жестко закодирован для ответа с помощью ИСТИНА.Таким образом, если я не могу попасть в службу, я знаю, что это ложь. Но вы можете просто использовать HTTP-запрос, если вы получите исключение, предположим false. – melodiouscode

2

Просто предложение: Вы можете попробовать использовать requestRouteToHost(). Но сначала найдите SO для проблем с использованием этого метода.

Также вам понадобится разрешение CHANGE_NETWORK_STATE.

1

Вы можете подключиться к сети Wi-Fi, попробовать подключиться к любой странице в фоновом режиме и проверить, есть ли перенаправление. Если это так, вероятно, это страницы учетных данных. Фактически, когда я пытался найти, как реализовать решение, которое я только что описал, я нашел его описанным в HttpURLConnection class documentation на сайте разработчиков Android. Там вы можете прочитать:

Handling Вход в сеть

Некоторые сети Wi-Fi блокирует доступ в Интернет до тех пор, пока пользователь не нажмет через входа на стр. Такие входные страницы обычно представлены с помощью перенаправления HTTP. Вы можете использовать getURL(), чтобы проверить, было ли неожиданно перенаправлено ваше соединение. Эта проверка недействительна до тех пор, пока не будут получены заголовки ответа, которые вы можете вызвать, вызвав getHeaderFields() или getInputStream(). Например, чтобы проверить, что ответ не был перенаправлен к неожиданному хозяина:

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
    try { 
    InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
    if (!url.getHost().equals(urlConnection.getURL().getHost())) { 
     // we were redirected! Kick the user out to the browser to sign on? 

    ... 
    } finally { 
    urlConnection.disconnect(); 
    } 
} 
0

Попробуйте

InetAddress.getByName(host).isReachable(timeOut) 
Смежные вопросы