2012-07-30 10 views
5

Ho un codice per determinare se v'è una connessione di rete oppure no:Detect Se non v'è alcuna connessione a internet

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 

    if (netInfo != null && netInfo.isConnected()) 
    { 
     // There is an internet connection 
    } 

Ma se c'è una connessione di rete e non internet questo è inutile. Devo ping di un sito web e attendere una risposta o timeout per stabilire la connessione a internet:

URL sourceUrl; 
    try { 
     sourceUrl = new URL("http://www.google.com"); 
     URLConnection Connection = sourceUrl.openConnection(); 
     Connection.setConnectTimeout(500); 
     Connection.connect(); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 

     // no Internet 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 

     // no Internet 
    } 

ma è un rilevamento lento. Dovrei imparare un modo buono e veloce per rilevarlo.

Grazie in anticipo.

+0

Significa che si utilizza anche la connessione WIFI. Ho ragione??? –

+0

Sì, uso solo la connessione Wifi. –

+0

Allora qual è il problema? –

risposta

2

prova a seguire il metodo per rilevare diversi tipi di collegamento:

private boolean haveNetworkConnection(Context context) 
{ 
    boolean haveConnectedWifi = false; 
    boolean haveConnectedMobile = false; 

    ConnectivityManager cm = (ConnectivityManager) Your_Activity_Name.this.getSystemService(Context.CONNECTIVITY_SERVICE); 
    // or if function is out side of your Activity then you need context of your Activity 
    // and code will be as following 
    // (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 
    for (NetworkInfo ni : netInfo) 
    { 
     if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
     { 
      if (ni.isConnected()) 
      { 
       haveConnectedWifi = true; 
       System.out.println("WIFI CONNECTION AVAILABLE"); 
      } else 
      { 
       System.out.println("WIFI CONNECTION NOT AVAILABLE"); 
      } 
     } 
     if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
     { 
      if (ni.isConnected()) 
      { 
       haveConnectedMobile = true; 
       System.out.println("MOBILE INTERNET CONNECTION AVAILABLE"); 
      } else 
      { 
       System.out.println("MOBILE INTERNET CONNECTION NOT AVAILABLE"); 
      } 
     } 
    } 
    return haveConnectedWifi || haveConnectedMobile; 
} 
+0

Grazie a voi Chintan per i vostri consigli. –

+0

Volevi questo? –

+0

non proprio. Penso che Sanjay abbia quello che voglio. –

1

Il problema con tutti questi programmi è che 'internet' non esiste come entità. C'è un motivo per cui i tentativi di connessione falliti vengono segnalati come "irraggiungibili" o "non possono connettersi al server a blahblah". Esempi:

1) Non si ha segnale. Sei connesso a Internet? PING riuscirà? Puoi connetterti al tuo server di destinazione?

2) Si dispone di un segnale, ma è stata superata la tolleranza dati del provider. Sei connesso a Internet? PING riuscirà? Puoi connetterti al tuo server di destinazione?

3) La connessione del provider è soddisfacente, ma il router della dorsale è inattivo. Sei connesso a Internet? PING riuscirà? Puoi connetterti al tuo server di destinazione?

4) La connessione del provider è soddisfacente, il loro router di dorsale è attivo ma il collegamento in fibra al paese X in cui si trova il server è stato interrotto da un capitano ubriaco e dall'ancora della sua nave. Sei connesso a Internet? PING riuscirà? Puoi connetterti al tuo server di destinazione?

5) Tutti i collegamenti al paese di destinazione sono attivi, ma Fred, con il suo JCB che scava fossi, ha tagliato il cavo di alimentazione alla server farm. Uno degli altri lavori di Fred è di servire il generatore di backup :(Sei connesso a Internet? PING riuscirà? Puoi collegarti al tuo server di destinazione?

6) Tutto l'hardware è attivo, ma il codice del server è stato scritto da Fred prima che fosse degradato a scavare nel fosso per incompetenza e ora si è schiantato di nuovo. Sei connesso a Internet? PING riuscirà? Puoi connetterti al tuo server di destinazione?

7) Fred ha avuto un giorno libero, ma il suo sostituto, l'amministratore del server competente ha bloccato il ping ICMP nei router per impedire attacchi di ping DOS. Sei connesso a Internet? PING riuscirà? Puoi connetterti al tuo server di destinazione?

Quindi, il modo migliore per essere sicuri è provare a connettersi al server di destinazione e vedere cosa succede.

È possibile rilevare alcuni casi negativi più rapidamente - sicuramente se non c'è segnale, non è possibile ottenere una connessione :) Oltre a questo, dovresti semplicemente provare a connetterti. Dì all'utente cosa sta succedendo, usa un timeout e fornisci all'utente un pulsante 'Annulla'. Questo è il meglio che puoi fare.

+0

Martin, grazie per il vostro consiglio. –

1

Che ne dici di questo?

Assicurarsi di disporre di una connessione Wi-Fi attiva, ora utilizzare WifiManager.getConnectionInfo() che restituisce informazioni dinamiche relative alla connessione Wi-Fi corrente, WifiInfo, è possibile ottenere WifiInfo.getLinkSpeed(), che ti dà la velocità di collegamento corrente e controllare che contro un certo valore minimo.

+1

E Sanjay. La soluzione a questo problema è molto logica, ma richiede un po 'di valori di soglia sperimentali; per esempio per nessuna connessione internet fornisce la velocità di collegamento 11 e se c'è una connessione internet ne fornisce 54. Non sono sicuro che funzionerà per tutte le reti del mondo. –

+0

Quando ho provato con un modem diverso, penso che non sia anche la solutin. –

+0

@CodersParadise Era una soluzione sperimentale :-) Non l'ho mai provato da solo. – COD3BOY

Problemi correlati