DevCorner: controlliamo la connessione ad internet

Roberto Orgiu
Roberto Orgiu
DevCorner: controlliamo la connessione ad internet

Continuiamo il nostro percorso con il progetto dell'estensione di DashClock che avevamo iniziato la scorsa puntata e aggiungiamo qualche controllo per capire ed ottenere le informazioni di base sulla nostra connessione ad internet. Pronti ad iniziare?

Alla fine di questa puntata, la nostra estensione ci dirà se siamo connessi alla rete (e in che modalità) o se siamo offline: il tutto non ci servirà immediatamente, ma chissà che non ci torni utile nel giro di qualche giorno.

La prima cosa da fare è richiedere i permessi che ci serviranno per non incappare in terribili crash, andando a dichiarare nel nostro file Manifest le stringhe relative alle autorizzazioni ACCESS_WIFI_STATEACCESS_NETWORK_STATE, in modo da avere più o meno il risultato mostrato su BitBucket.

A questo punto, dichiariamo nel nostro file String le nuove diciture che andremo ad utilizzare, soffermandoci su extension_message_online, il quale riporta questa descrizione:

Connesso tramite %1$s (%2$s)

Questa particolare sintassi, come molti di voi avranno intuito, ci serve a parametrizzare una stringa in modo da poterla adattare alle nostre esigenze: nei due parametri inseriremo infatti il tipo di connessione (mobile o wifi) e il nome della rete (o dell'operatore), in modo che siano chiaramente visibili nella nostra estensione.

Passiamo ora al Java, che abbiamo raggruppato in due comodi (e forse leggermente ripetitivi) metodi per capire meglio il funzionamento di queste istruzioni; cominciamo dal codice relativo ad isOnline:

private boolean isOnline(){
ConnectivityManager cm = ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if(cm.getActiveNetworkInfo() != null)
return cm.getActiveNetworkInfo().isConnectedOrConnecting();
else
return false;
}

Alla seconda riga notiamo la chiama a getSystemService, che è un metodo del nostro Context che ci permette di ottenere le istanze dei vari servizi (potete consultarne la lista completa sulle pagine ufficiali della guida per sviluppatori Android), mentre alla quarta riga vediamo come richiedere al nostro robottino se si sta connettendo o se è già connesso al web. Semplice, vero? Occupiamoci allora del riconoscimento del tipo di connettività.

Dichiariamo quindi un oggetto di tipo NetworkInfo, che conterrà tutto quello che ci serve sapere sulla nostra connessione attuale (cm è un oggetto ConnectivityManager come dichiarato poche righe sopra):

NetworkInfo ni = cm.getActiveNetworkInfo();

Passiamo ora alla parte più corposa, quella relativa al tipo di connessione, partendo dall'identificazione della rete WiFi cui siamo connessi

WifiManager wm = (WifiManager)getSystemService(WIFI_SERVICE);
WifiInfo wi = wm.getConnectionInfo();
message = getString(R.string.extension_message_online, ni.getTypeName(), wi.getSSID());

Notiamo subito come il fulcro dell'azione sia la riga 10, mediante la quale chiediamo le informazioni sulla rete cui siamo connessi attualmente e le salviamo in un oggetto di tipo WifiInfo, del quale richiameremo il metodo getSSID per avere il nome della rete wireless.

E la chiamata a getTypeName dell'oggetto ni dichiarato sopra? Ci serve per capire di che tipo di connessione stiamo parlando, presentandola in una stringa intelligibile da noi umani. Soffermiamoci un attimo sulla getString: notiamo che oltre all'ID della stringa, abbiamo inserito anche i due parametri di cui parlavamo durante la dichiarazione, proprio come avremmo fatto con le funzioni della famiglia printf in C.

Ora siamo pronti per passare alla connessione dati, in maniera leggermente diversa rispetto a quanto fatto dalla rete WiFi:

TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
message = getString(R.string.extension_message_online, ni.getTypeName(), tm.getNetworkOperatorName());

Come possiamo notare subito, è richiesto un altro tipo di servizio, dal quale estrarremo il nostro operatore tramite una chiamata a getNetworkOperatorName.

Una volta implementato il tutto, ci ritroveremo con un widget di DashClock aggiornato (potete dare un'occhiata al risultato finale nella galleria in fondo): se volete cimentarvi nell'impresa, troverete tutte le informazioni necessarie al link specificato nella fonte.

Buona programmazione (e buon divertimento) a tutti!

Fonte: DevCorner