miércoles, 28 de mayo de 2014

Obtener información del tiempo de una localización concreta.

Conseguir el tiempo actual de un lugar concreto para una aplicación Android es muy simple y útil en muchos casos.

JSON es un código accesible en algunas webs que nos permite descargar datos actualizados mediante una URL determinada sin necesidad de descargarlos ni acceder a ellos por una base de datos. Estos datos pueden ser de clima, información de tráfico, música y otra información generalmente breve para realizar consultas concretas.

Para empezar creamos una clase JSONparser, que coja los datos JSON de una dirección y devuelva  objetos JSON.

NOTA: Esto y más detalles para empezar a trabajar con JSON en Android los puedes encontrar en http://www.learn2crack.com/2013/10/android-json-parsing-url-example.html

JSONParser.java
package learn2crack.jsonparsing.library;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class JSONParser {
  static InputStream is = null;
  static JSONObject jObj = null;
  static String json = "";
  // constructor
  public JSONParser() {
  }
  public JSONObject getJSONFromUrl(String url) {
    // Making HTTP request
    try {
      // defaultHttpClient
      DefaultHttpClient httpClient = new DefaultHttpClient();
      HttpPost httpPost = new HttpPost(url);
      HttpResponse httpResponse = httpClient.execute(httpPost);
      HttpEntity httpEntity = httpResponse.getEntity();
      is = httpEntity.getContent();
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    try {
      BufferedReader reader = new BufferedReader(new InputStreamReader(
          is, "iso-8859-1"), 8);
      StringBuilder sb = new StringBuilder();
      String line = null;
      while ((line = reader.readLine()) != null) {
        sb.append(line + "n");
      }
      is.close();
      json = sb.toString();
    } catch (Exception e) {
      Log.e("Buffer Error", "Error converting result " + e.toString());
    }
    // try parse the string to a JSON object
    try {
      jObj = new JSONObject(json);
    } catch (JSONException e) {
      Log.e("JSON Parser", "Error parsing data " + e.toString());
    }
    // return JSON String
    return jObj;
  }
}

Una vez hecho esto empezamos a buscar los datos que queremos en JSON. Para ello antes pondré un pequeño ejemplo de como hacerlo.

Pongamos que obtuviésemos este JSON:

{"tiempo": [{"id": "001","grados": "12","info":{"apariencia":"nublado","viento":"fuerte"}}]}

Los objetos serían los que van definidos entre comillas antes de los puntos suspensivos y después de ellos irían los datos. Los objetos pueden contener datos simples, como "id":"001", otros objetos entre llaves {} o arrays de objetos  definidos mediante corchetes [].

Para acceder a los objetos contenidos en un Array en Android usaríamos:

      JSONArray tiempo = json.getJSONArray("tiempo");
      JSONObject c = tiempo.getJSONObject(0);
      String grados= c.getString("grados");
      String grados= c.getString("id");

Para acceder a objetos incluidos en un objeto usaríamos:

      JSONArray tiempo = json.getJSONArray("tiempo");
      JSONObject c = tiempo.getJSONObject(0);
      JSONObject  info = c.getJSONObject("info");
      String apariencia= info.getString("apariencia");

En este ejemplo, como queremos acceder al tiempo de un lugar, usé esta API http://openweathermap.org/wiki/API/JSON_API, que permite, entre otras opciones, obtener el tiempo por un nombre de localización, sus coordenadas, los registros pasados y predicciones futuras, etc. 
Creamos un nuevo JSONParser y le añadimos la dirección de donde queremos que coja la dirección, por ejemplo http://api.openweathermap.org/data/2.1/find/name?q=vigo . En este caso le pido que me muestre la información a partir del nombre de la ciudad de Vigo "name?q=vigo"

JSONParser jParser = new JSONParser();
    JSONObject json = jParser.getJSONFromUrl("http://api.openweathermap.org/data/2.1/find/name?q=vigo");

Luego dentro de un "try" incluimos todas las operaciones para coger los datos que nos interesen y al cerrarlo añadimos un catch (JSONException e) y dentro un Log.d("MIO", e.getMessage()); Así podemos guiarnos en caso de que en alguna de las operaciones JSON cometamos un error.

Ya por último, con los datos del tiempo en variables, podríamos trabajar con ellos en nuestra aplicación.

1 comentario: