PREVISIONI DEL TEMPO SU ANDROID GRAZIE A YAHOO
Posted by Aplgen 2
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




4 comments
Commento by Paolo on 19 marzo 2012 at 22:48
ciao sto provando a fare l’esempio che citavi tu su un tuo articolo. quello delle api di yahoo,
ma quando recupero l’oggetto jsono mi va in exception quando cerco di fare il get dell’array
JSONObject json=getJSONObject(url);
//JSONArray jsonArray = json.getJSONArray(“result”);
JSONArray jArray=json.getJSONArray(“Results”);
for (int i = 0; i < jArray.length(); i++){
JSONObject jsonObject = jArray.getJSONObject(i);
//System.out.println();
setCap(jsonObject.getString("uzip"));
// jason.append(jsonObject.getString("condition"));
}
in pratica mi va in exception quando faccio getJSONArray("Results") e non capisco come mai visto che esaminando l'ogetto JSON l'array Results esiste.. puoi aiutarmi?
Commento by Apl on 20 marzo 2012 at 09:58
Ciao Paolo, immagino che il problema sia ricevere i risultati quando cerchi il valore woeid.
A prima vista direi che il problema è che la chiamata non rispetta la struttura gerarchica del JSON.
il file Json che riceviamo ha una struttura simile:
“ResultSet”:{“version”:”1.0″,”Error”:0,”ErrorMessage”:”No error”,”Locale”:”us_US”,”Quality”:40,”Found”:1,”Results”:{} }
Quello che a noi interessa ( in caso di mancanza di errori ) è l’Array Results. Io uso altre librerie per JSon ma il concetto è lo stesso: dobbiamo prima facci ritornare l’oggetto ResultSet , partendo da esso ci faremo ritornare l’Array Results. Posto il codice java che ho utilizzato per fare il test veloce.
JSONObject resultset=json.getJSONObject("ResultSet");
JSONArray jArray=resultset.getJSONArray("Results");
for (int i = 0; i < jArray.length(); i++){
{JSONObject jsonObject = jArray.getJSONObject(i);
...
}
Spero che ti sia stato d'aiuto, bye!
Apl
Commento by Paolo on 15 aprile 2012 at 11:59
ciao grazie ho risolto quel problema.. ora pero ottengo tutte le informazioni correttamente, per visualizare questa le condizioni di oggo faccio getCode() e ottengo un id che identifica l’imagine corrispondente alle condizioni atmosferiche attuale e mi visualizzo una imagine a partire da un url con questo code, vorrei fare lo stesso per visualizare le condizioni del giorno successivo come faccio… nel jsono ho le condizioni successice solo sotto forma di stringa tu come fai??
cia grazie
Commento by Apl on 3 maggio 2012 at 12:11
Ciao Paolo, scusa il ritardo della risposta ma il lavoro ultimamente mi sta togliendo il poco tempo a disposizione. Per questioni di tempo, ho dovuto optare per un volgarissimo switch nel qualche, a seconda del valore della stringa che rappresenta la condizione meteorologica ( sunny, foggy, cloudy,…), mostro una determinata immagine.
Per semplificare il tutto, ho raggruppato il più possibile ( anche perchè non avevo il tempo di procurarmi un immagine per ogni tipo di condizione ).
Apl