2012-08-28 18 views
25

Sto lavorando all'app per Android che rimarrà continuamente connessa a Internet. Se Internet non funziona, dovrebbe fornire un messaggio appropriato all'utente.Listener Internet Esempio Android

C'è qualcosa come Internet Listener? o come implementare questo evento che quando mai la connessione Internet non è disponibile dovrebbe dare avviso.

+0

Quest'altra Q & A potrebbe aiutare: http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts – helios

+0

http: // sviluppatore .android.com/training/monitoring-device-state/connettività-monitoring.html –

risposta

48

Creare un ricevitore Broadcast per quello e registrarlo nel file manifest.

Creare innanzitutto una nuova classe NetworkStateReceiver ed estendere BroadcastReceiver.

public class NetworkStateReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
    Log.d("app","Network connectivity change"); 
    if(intent.getExtras()!=null) { 
     NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO); 
     if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) { 
      Log.i("app","Network "+ni.getTypeName()+" connected"); 
     } 
    } 
    if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) { 
      Log.d("app","There's no network connectivity"); 
    } 
    } 
} 

Mettete questo codice nel tuo AndroidManifest.xml sotto l'elemento di "applicazione":

<receiver android:name=".NetworkStateReceiver"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 

E aggiungere questa autorizzazione

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

EDIT

Questo codice solo rileva il cambiamento di connettività ma non può dire se la rete a cui è connesso ha un accesso a Internet. Utilizzare questo metodo per verificare che -

public static boolean hasActiveInternetConnection(Context context) { 
    if (isNetworkAvailable(context)) { 
     try { 
      HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection()); 
      urlc.setRequestProperty("User-Agent", "Test"); 
      urlc.setRequestProperty("Connection", "close"); 
      urlc.setConnectTimeout(1500); 
      urlc.connect(); 
      return (urlc.getResponseCode() == 200); 
     } catch (IOException e) { 
     Log.e(LOG_TAG, "Error checking internet connection", e); 
     } 
    } else { 
    Log.d(LOG_TAG, "No network available!"); 
    } 
    return false; 
} 
+0

Esempi: http://stackoverflow.com/questions/6176570/check-the-networking-connectivity-using-broadcastreceiver-in-android – helios

+0

Ho provato questa soluzione ma questo non funzionante. dà anche errori a super.onReceive (context, intent); –

+0

qual è l'errore? –

1

Il codice da Chirag Raval sopra funziona sicuramente. Il problema è che il listener verrà richiamato anche quando l'applicazione non è in esecuzione in primo piano.

IMHO, l'approccio migliore è registrare/annullare la registrazione del ricevitore nei metodi onResume()/onPause() di tutte le attività dell'applicazione. Questo codice dovrebbe farlo:

private final NetworkStateReceiver stateReceiver = new NetworkStateReceiver(); 

@Override 
protected void onResume() { 
    super.onResume(); 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); 
    registerReceiver(stateReceiver, filter); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(stateReceiver); 
} 

Ovviamente, rimuovere la registrazione dal file AndroidManifest.xml.

Utilizzando questa soluzione, il ricevitore verrà chiamato anche quando si passa da un'attività all'altra dell'applicazione (supponendo che le si chiuda). In tal caso, utilizzare un flag statico (condivisa tra tutte le attività), come nell'esempio che segue (chiamato online):

public class NetworkStateReceiver extends BroadcastReceiver { 

    private static boolean online = true; // we expect the app being online when starting 

    public static final String TAG = NetworkStateReceiver.class.getSimpleName(); 

    public void onReceive(Context context, Intent intent) { 
     Log.d(TAG,"Network connectivity change"); 
     ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo ni = manager.getActiveNetworkInfo(); 
     if (ni == null || ni.getState() != NetworkInfo.State.CONNECTED) { 
      Log.d(TAG,"There's no network connectivity"); 
      if (online) // don't show the message if already offline 
       Toast.makeText(context, R.string.noInternet, Toast.LENGTH_SHORT).show(); 
      online = false; 
     } else { 
      Log.d(TAG,"Network "+ni.getTypeName()+" connected"); 
      if (!online) // don't show the message if already online 
       Toast.makeText(context, R.string.backOnline, Toast.LENGTH_SHORT).show(); 
      online = true; 
     } 
    } 
} 

Se iniziare la vostra applicazione in cui essere non in linea, verrà visualizzato il messaggio di Brindisi; altrimenti appare solo quando si perde/ristabilisce la connessione.