2012-11-15 12 views
14

In che modo esattamente Android determina la differenza tra i seguenti stati?In che modo esattamente Android determina se è online?

  1. Ha un'interfaccia di rete attiva (ad esempio Wifi o 3G), ma non è in grado di accedere a Internet.

  2. Ha un'interfaccia di rete attiva e deve chiedere all'utente di accedere a una rete su una pagina Web.

  3. Ha un'interfaccia di rete attiva e in grado di accedere a Internet.

Forse invia una semplice richiesta HTTP a un URL fisso (forse su google.com?) E controlla che il documento restituito sia quello che si aspetta? Se sì, conosciamo l'URL utilizzato?

risposta

0

Sì, è possibile anche inviare un ping :)

Le operazioni di ordine da usare in una piccola classe util rete sarebbe: - Controllare se l'interfaccia è in linea - Controllare se il suo grado di aprire un socket a Google.com o ping google.com

0

Prova questo:

public static boolean isNetworkAvailable(Context context) 
{ 
    ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo info = cm.getActiveNetworkInfo(); 

    return (info != null); 
} 
1

UPDATE: aggiornati i codici per evitare NetworkOnMainThreadException

Attualmente sto usando il seguente metodo per determinare se il dispositivo può accedere a Internet o no:

public class NetworkConnectivityHelper { 
    public void isDeviceConnectedToInternet(final Activity activity, final ResultCallback callback){ 

     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       boolean isDeviceConnectedToInternet = false; 
       NetworkInfo activeNetworkInfo = ((ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); 

       if(activeNetworkInfo != null && activeNetworkInfo.isConnected()){ 
        try { 
         InetAddress.getByName("google.com").isReachable(2); 
         isDeviceConnectedToInternet = true; 
        } catch (UnknownHostException e){ 
         isDeviceConnectedToInternet = false; 
        } catch (IOException e){ 
         isDeviceConnectedToInternet = false; 
        } 
       } 

       final boolean result = isDeviceConnectedToInternet; 
       activity.runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         callback.done(result); 
        } 
       }); 

      } 
     }).start(); 

    } 


    public static abstract class ResultCallback{ 
     public abstract void done(boolean connected); 
    } 
} 

chiamata questo:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    .... 
    //Populate 
    NetworkConnectivityHelper networkConnectivityHelper = new NetworkConnectivityHelper(); 
    networkConnectivityHelper.isDeviceConnectedToInternet(activity, new NetworkConnectivityHelper.ResultCallback() { 
     @Override 
     public void done(boolean connected) { 
      if (connected) { 
       //Yey, the device is connected. 
       //Now, do some work 
      }else{ 
       //The device is disconnected 
      } 
     } 
    }); 
    .... 

} 

speranza che questo aiuti!

+0

Questo forzerà sulle versioni successive di Android per l'utilizzo di una connessione di rete sul thread principale. Inoltre, sulla rete wifi su cui ho eseguito il test è necessario il login, questo test è stato comunque restituito come connesso quando non dovrebbe. – schwiz

Problemi correlati