Salve a tutti,
avevo precedentemente annunciato che avrei postato una lezione sul Bluetooth di Android: purtroppo , causa alcuni problemi riscontrati , ho deciso di trascurare tale guida a data da destinarsi. Nell’articolo di oggi invece illustrerò un metodo semplice per ottnere previsioni del tempo su Android grazie alle API di Yahoo e presenterò una mia applicazione basata su ciò.

Obiettivo: realizzare un app meteo che mostri le condizioni del tempo attuale e future di una data località passata come input.


Ovviamente tale oggetto necessiterà di una connessione su Internet per poter prelevare i vari dati sul meteo da mostrare all’utente; inoltre non viene richiesto il salvataggio di alcun dato ( niente Database SQLite o salvataggio in sharedPreferences o altre strutture dati), per cui la struttura di tale progettto sarà davvero semplice.

A grandi linee i passaggi per ottenere tali informazioni sono assai semplici: ci basterà creare un HttpClient,passarli l’url con dentro l’informazione sulla località , eseguire una richiesta ed elaborare i dati che il server di Yahoo ci invierà come risposta. Di sotto riporto la funzione solitamente usata per lo scopo:


public InputStream getJSONData(String url){
DefaultHttpClient httpClient = new DefaultHttpClient();
URI uri;
InputStream data = null;
try {
uri = new URI(url);
HttpGet method = new HttpGet(uri);
HttpResponse response = httpClient.execute(method);
data = response.getEntity().getContent();
} catch (Exception e) {
e.printStackTrace();
}

return data;
}

Se siete già andati a leggere il foglio delle specifiche delle APi di Yahoo, l’indirizzo a cui fare la richiesta è:

http://weather.yahooapis.com/forecastjson?w=’woeid_number’&u=c

il parametro GET ‘u’ serve solo per decidere in che formato ricevere la temperatura ( Farenheit o Celsius, al momento preferisco la seconda opzione).
Notiamo nell’indirizzo la parola chiave forecastjson: grazio a ciò riceveremo i dati secondo la Standard Json, inizialmente nato per Javascript , ora è praticamente usato come sostituto dell’XML.
Ed il parametro woied_number? Esso è un identificatore unico usato per definire la località.

Il problema attualmente da risolvere è calcolare tale numero in relazione alla località inserita dall’utente.
Uno dei possibili metodi è utilizzare una seconda API di Yahoo, che ci restituirà il woied di una data località prendendo come input una stringa identificativa ( che può essere il CAP del luogo, il nome della città, l’indirizzo). Questo rallentà un pò l’applicazione ma la maggior parte delle volte il servizio riconoscerà il luogo da noi descritto.Riportiamo l’url della seconda API:

http://where.yahooapis.com/geocode?location=’stringa’&flags=J

stringa dovrà contenere l’indirizzo, il cap o il nome della città di cui vogliamo sapere il woeid. Ovviamente è possibile ricevere più di un risultato se la località non è abbastanza definita.
flag è un semplice parametro per definire la struttura della risposta, è valorizzata a J perchè trovavo più comodo farmi restituire i dati in formato JSON ma è sempre possibile lavorare con gli XML.
Ci sono svariate soluzioni per gestire i dati in formato JSON, io ad esempio ho scelto una vecchia release della libreria google-gson perchè l’avevo precedentemente usata per un altro progetto ma siete liberi di sfruttare qualunque tipo di script.
Gli strumenti sono tutti pronti, come esempio di una possibile applicazione basata sul processo appena descritto, posterà APL Weather: la struttura è a dir poco banale, una semplice editText dove inserire la località ed un pulsante per attivare la ricerca.
Esso genererà una ListView con i risultati ottenuti, cliccando sopra uno di essi verrà generata la seconda richiesta per le condizioni climatiche, che verrano a loro volta inseriti in una Lista e mostrati all’utente.Riportiamo alcune screenshot:

Potete scaricare l’applicazione meteo direttamente cliccando sul link seguente o collegandovi al solito repository Lab.

Grazie per l’attenzione,

Andrea