2012-08-10 10 views
21

Supponiamo che il telefono trovi una rete Wi-Fi aperta e si connetta ad esso. Ma la rete wi-fi è "inattiva", cioè quando apri il browser vedi la richiesta di credenziali. Ho molte app sul mio telefono (ad esempio il browser web), che non funzionano in questi casi. Desidero inviare i dati utilizzando la rete mobile, ma il sistema tenta comunque di utilizzare il Wi-Fi .Gestire reti Wi-Fi inattive

NetworkInfo.isAvailable() e NetworkInfo.isConnected() tornare ancora true per le descritte wi-fi reti. Qualche soluzione?

+0

sarebbe possibile semplice ping di un sito web come Google? se ci fosse una pagina di accesso dietro il punto di accesso, questo semplicemente fallirebbe dove normalmente avrebbe successo. – Viezevingertjes

+0

Il ping AFAIK è complicato. –

+0

Questo è simile a http://stackoverflow.com/a/1085054/193892 ma per Android è invece Windows. Sarebbe bello se esistesse. –

risposta

1

Prova questo ....

avevo bisogno di fare un po 'personalizzato work..but ottenuto installato e funzionante ...

Il mio codice switches from Wifi to Mobile network quando il suo off.

E sto usando la TimeService at port 37 sapere che Internet è morta, mentre la connessione wifi è ancora ON

/////////////////// /////// Modificato //////////////////////////////////

Ora sono mettendo qui un complete working code fatto. Per favore scusami se il DRY (Non ripeti il ​​tuo principio) è stato abusato qui. Quindi, per favore refactoring del codice e convertire i codici duplicati nel metodo, vale a dire in una single sensible place, quando si utilizza nella rete di produzione

/////---------------------------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 Disponibile rete Controllo

/////-------------------------------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 

Qui sto usando i metodi di cui sopra ....

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() restituirà true per quel tipo di rete. –

+0

Grazie, darò un'occhiata. –

+0

Si prega di dare un'occhiata alla mia risposta modificata –

2

Ho avuto lo stesso problema, e quello che ho trovato è che non esiste tale possibilità tramite l'SDK di Android, devi scrivere il tuo modo di farlo.

Dipende da cosa vuoi fare con la rete e cosa intendi con 'inattivo': puoi essere connesso a un router, che non dispone di connessione a Internet, e non esiste un metodo Android per controlla questa situazione Come ha scritto MrMichael, il ping è un modo per controllarlo, ma in questo caso il test positivo ti dà solo informazioni sul ping - la rete può avere un firewall pesante che ti permette di inviare ping, ma io. e. non consentirà la richiesta HTTP attraverso.

In tal caso, devi scrivere il tuo test personalizzato per le tue esigenze, ahimè - questo è quello che ho fatto. Ho appena implementato un semplice protocollo ping-like (provo a connettere il mio socket su IP/port appropriato e inviare un breve messaggio in attesa di una risposta breve). Solo questo mi garantisce al 100% che la connessione che voglio possa essere stabilita.

+1

" puoi essere connesso a un router, che non ha connessione a Internet "- esattamente –

+0

Quindi con questo [metodo] (http://stackoverflow.com/a/12136830/4385913) se il router non ha la connessione a Internet restituirà' true'? perché l'host è diverso thant 'url.getHost()'? –

2

Per quanto ne so, non c'è modo di forzare l'uso di una connessione dati tramite Wi-Fi (forse qualcosa che non si dovrebbe fare senza l'interazione dell'utente comunque).

Ho gli stessi requisiti in molte delle mie applicazioni, voglio sapere se hanno una connessione di rete valida mentre si sta caricando la schermata iniziale (ad esempio, se non visualizzo una versione di sola lettura dell'app).

Il modo in cui mi aggiro è quello di lanciare una semplice chiamata di servizio al mio server chiamato isAlive che restituisce un vero imedialtly. Questo non solo mi dice che sono in grado di vedere il mio servizio, ma conferma anche che il mio server è on-line (nessun problema alla mia fine). Nel caso in cui non ricevo una risposta in modo tempestivo, informo l'utente che non ha alcuna connessione di rete e "Assicurati di avere una connessione dati/wifi valida prima di continuare". Prendo quindi la proprietà isConnected per il wifi e modifico questo messaggio per dire "La tua attuale connessione wireless non ha accesso a Internet" o qualcosa di simile.

Non proprio la risposta che speravi ma forse una possibilità?

+0

Grazie, ci proverò. –

+0

Come si controlla il server isAlive? Richiesta http semplice? –

+1

Nel mio caso è una chiamata al mio webservice che è hardcoded per rispondere con TRUE.In questo modo, se non riesco a raggiungere il servizio, so che è falso. Ma potresti semplicemente usare una richiesta http, se ottieni un'eccezione presume false. – melodiouscode

2

Solo un suggerimento: si può provare a utilizzare requestRouteToHost(). Ma prima cerca SO per i problemi nell'utilizzo di questo metodo.

Inoltre è necessaria l'autorizzazione CHANGE_NETWORK_STATE.

1

È possibile connettersi alla rete wifi, provare a connettersi a qualsiasi pagina in background e verificare se vi è alcun reindirizzamento. Se è così, è molto probabile che siano le pagine di credenziali. Infatti quando stavo cercando di trovare come implementare la soluzione che ho appena descritto, ho trovato che fosse descritto in HttpURLConnection class documentation sul sito degli sviluppatori Android. Vi si può leggere:

Handling Sign-On

rete Alcune reti Wi-Fi bloccano l'accesso a Internet fino a quando l'utente fa clic attraverso un sign-on pagina. Tali pagine di accesso vengono in genere presentate utilizzando reindirizzamenti HTTP. È possibile utilizzare getURL() per verificare se la connessione è stata reindirizzata in modo imprevisto. Questo controllo non è valido fino a dopo la ricezione delle intestazioni di risposta, che è possibile attivare chiamando getHeaderFields() o getInputStream(). Ad esempio, per controllare che una risposta non è stato reindirizzato a un host inaspettato:

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

Prova

InetAddress.getByName(host).isReachable(timeOut) 
Problemi correlati