martes, 5 de febrero de 2013

Listado de latitud y longitud de ciudades

Introducción:

En este tutorial vamos a crear una aplicación que nos permita leer las latitudes y longitudes de las diferentes ciudades que se encuentran en un fichero json.

Para ello la aplicación leerá todos los datos del fichero json y listará todas las ciudades en un listView, después el usuario podrá seleccionar una ciudad y la aplicación mostrará al usuario  las latitudes y longitudes almacenadas en el fichero json.

Espero que os guste y os resulte fácil. No dude en comentar.

¡ Saludos !


Enlaces de interés:

Código Fuente
Puede descargar si lo desea el código fuente de este proyecto.


Pasos a seguir:

1. Creamos la interfaz de la actividad principal en donde se mostrará las ciudades almacenadas en el fichero json, un ejemplo de interfaz sería el siguiente.


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/lstvCiudades" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" > </ListView> </RelativeLayout>

2. Creamos la interfaz de la segunda actividad donde vamos a mostrar los datos de la latitud y de la longitud de la ciudad que hemos seleccionado en la actividad principal.


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/TextView04" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/ciudad" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtNombreCiudad" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/latitud" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtLatitud" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/longitud" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtLongitud" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> </LinearLayout> </RelativeLayout>

3. Creamos la clase modelo de ciudad la cual utilizaremos para guardar las ciudades que hemos extraido del fichero json.

package com.ACDAT.ejercicio8.Ciudad; import java.io.Serializable; /** * Crea una ciudad * * @author José Miguel Acosta Martín * */ @SuppressWarnings("serial") public class Ciudad implements Serializable{ /////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // /////////////////////////////////////////////////////////////////////////////////////////////// private String ciudad; // Almacena el nombre de la ciudad private String latitud; // Almacena la latidud de la ciudad private String longitud; // Almacena la longitud de la ciudad /////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // /////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// // CONSTRUCTOR // /////////////////////////////////////////////////////////////////////////////////////////////// /** * Crea una nueva instancia de la clase * * @param ciudad Nombre de la ciudad * @param latitud Latitud de la ciudad * @param longitud Longitud de la ciudad */ public Ciudad(String ciudad, String latitud, String longitud) { super(); this.ciudad = ciudad; this.latitud = latitud; this.longitud = longitud; } /////////////////////////////////////////////////////////////////////////////////////////////// // FIN CONSTRUCTOR // /////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// // PROPIEDADES // /////////////////////////////////////////////////////////////////////////////////////////////// /** * @return El nombre de la ciudad */ public String getCiudad() { return ciudad; } /** * @return La latitud de la ciudad */ public String getLatitud() { return latitud; } /** * @return La longitud de la ciudad */ public String getLongitud() { return longitud; } /////////////////////////////////////////////////////////////////////////////////////////////// // FIN PROPIEDADES // /////////////////////////////////////////////////////////////////////////////////////////////// }

4. Definimos los campos en la actividad principal de la aplicación, que será en la clase en donde se van a listar las ciudades extraídas.

/** * Muestra un listado de ciudades alamacenadas en un fichero JSON * Se puede seleccionar para ver más detalles * * @author José Miguel Acosta Martín * */ public class LatitudesActivity extends Activity { /////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // /////////////////////////////////////////////////////////////////////////////////////////////// // Campos gráficos private ListView lstvCiudades; // Campo gráfico donde se muestran los nombre de las ciudades // Otros campos private ArrayList<Ciudad> ciudades; // Almacena un listado de ciudades private String[] nombreCiudades; // Almacena los nombre de las ciudades private ArrayAdapter<String> adaptador; // Adaptador /////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // ///////////////////////////////////////////////////////////////////////////////////////////////

5. Iniciamos los campos necesarios en el método onCreate() además de subscribirse a los eventos.

/** * Al iniciar la aplicación ... */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_latitudes); // INICIALIZACIÓN DE CAMPOS //////////////////////////////////////////////////////////////// // Inicialización campos gráficos lstvCiudades = (ListView) findViewById(R.id.lstvCiudades); // Inicialización de otros campos ciudades = new ArrayList<Ciudad>(); // FIN INICIALIZACIÓN DE CAMPOS //////////////////////////////////////////////////////////// // Obtiene y almacena las ciudadades leerCiudades(obtenerJson()); // Obtiene y almacena el nombre de las ciudades leerNombreCiudades(); // Adaptador para la lista adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, nombreCiudades); // Asigna el adaptador a la lista lstvCiudades.setAdapter(adaptador); ///////////////////////////////////////////////////////////////////////////////////////////////// // EVENTOS // ///////////////////////////////////////////////////////////////////////////////////////////////// lstvCiudades.setOnItemClickListener(new OnItemClickListener() { /** * Muestra información detallada de la ciudad seleccionada */ public void onItemClick(AdapterView<?> adaptador, View vista, int posicion, long arg3) { // CAMPOS ////////////////////////////////////////////////////////////////////////// Intent intent; // FIN CAMPOS ////////////////////////////////////////////////////////////////////// // EJECUCIÓN /////////////////////////////////////////////////////////////////////// // Obtiene la ciudad seleccionada intent = new Intent(LatitudesActivity.this, CiudadActivity.class); intent.putExtra("CIUDAD", ciudades.get(posicion)); // Inicia la actividad CiudadActivity donde se mostrarán los datos de la ciudad startActivity(intent); // FIN EJECUCIÓN /////////////////////////////////////////////////////////////////// } }); ///////////////////////////////////////////////////////////////////////////////////////////////// // FIN EVENTOS // ///////////////////////////////////////////////////////////////////////////////////////////////// }

6. Necesitamos un método para obtener el contenido del fichero json.

/** * Obtiene el contenido del fichero JSON que tiene almacenada * las latitudes * * @return El objeto JSON */ public JSONObject obtenerJson(){ // CAMPOS ///////////////////////////////////////////////////////////////////////////////// JSONObject json = null; // Almacena el objeto JSON StringBuilder stringBuilder; // Almacena el contenido del fichero JSON String linea; // Almacena la línea leida del fichero JSON // FIN CAMPOS ///////////////////////////////////////////////////////////////////////////// // EJECUCIÓN /////////////////////////////////////////////////////////////////////////////// try { // Inicialización de campos stringBuilder = new StringBuilder(); linea = null; // Obtiene el fichero JSON InputStream fichero = getResources().openRawResource(R.raw.latitudes); // Prepara el fichero para su lectura BufferedReader bfreader = new BufferedReader(new InputStreamReader(fichero)); // Lee el fichero JSON while ((linea = bfreader.readLine()) != null){ // Añade el contenido líena a línea stringBuilder.append(linea + "\n"); } // Cierra el fichero fichero.close(); // Crea el objeto JSON json = new JSONObject(stringBuilder.toString()); } catch (Exception ex) { } return json; // FIN EJECUCIÓN /////////////////////////////////////////////////////////////////////////// }
7. Y también necesitamos un método que extraigas las ciudades con todos sus datos.

/** * Lee las ciuades almacenadas en un fichero JSON * * @param json Fichero JSON */ public void leerCiudades (JSONObject json){ // CAMPOS ////////////////////////////////////////////////////////////////////////////////// String ciudad; // Almacena el nombre de la ciudad String latitud; // Almacena la latitud de la ciudad String longitud; // Almacena la longitud de la ciudad JSONArray arrayCiudades; // Almacena las ciudades JSONObject objeto; // Almacena un objeto JSONObject objetoCiudad; // Almacena el objeto ciudad // FIN CAMPOS ////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN //////////////////////////////////////////////////////////////////////////////// // Inicialización de variables ciudad = ""; latitud = ""; longitud = ""; try { // Inicialización de campos objeto = new JSONObject(); objetoCiudad = new JSONObject(); // Almacena las ciudades arrayCiudades = new JSONArray(json.getJSONArray("ciudades").toString()); // Recorre las ciudades for (int i = 0; i < arrayCiudades.length(); i++){ // Obtine la ciudad objeto = arrayCiudades.getJSONObject(i); objetoCiudad = objeto.getJSONObject("ciudad"); // Almacena los datos de la ciudad ciudad = objetoCiudad.getString("nombre"); // Almacena el nombre de la ciudad latitud = objetoCiudad.getString("latitud"); // Almacena la latidud de la ciudad longitud = objetoCiudad.getString("longitud"); // Almacena la longitud de la ciudad // Almacena la ciudad obtenida ciudades.add(new Ciudad(ciudad, latitud, longitud)); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } // FIN EJECUCIÓN //////////////////////////////////////////////////////////////////////////// }

8. Y almacenamos el nombre de las ciudades en el arraylist.

/** * Almacena el nombre de las ciudades */ public void leerNombreCiudades(){ // Inicializa el array nombreCiudades = new String[ciudades.size()]; // Recorre las ciudades almacenadas for (int i = 0; i < nombreCiudades.length; i++){ // Almacena el nombre de la ciudad nombreCiudades[i] = ciudades.get(i).getCiudad(); } }

9. Declaramos los campos que vamos a utilizar en la clase de la segunda actividad.

/** * Muestra el contenido de una ciudad * * @author José Miguel Acosta Martín * */ public class CiudadActivity extends Activity { ///////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // ///////////////////////////////////////////////////////////////////////////////////////////////// private TextView txtNombreCiudad; // Campo gráfico que muestra el nombre de la ciudad private TextView txtLatitud; // Campo gráfico que muestra la latitud de la ciudad private TextView txtLongitud; // Campo gráfico que muestra la longitud de la ciudad ///////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // /////////////////////////////////////////////////////////////////////////////////////////////////
10. Iniciamos los campos en el método onCreate().

/** * Al iniciar la aplicación ... */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ciudad); // INICIALIZACIÓN DE CAMPOS ////////////////////////////////////////////////////////////////// // Incialización de campos gráficos txtNombreCiudad = (TextView) findViewById(R.id.txtNombreCiudad); txtLatitud = (TextView) findViewById(R.id.txtLatitud); txtLongitud = (TextView) findViewById(R.id.txtLongitud); // FIN INICIALIZACIÓN DE CAMPOS ////////////////////////////////////////////////////////////// // Lee y muestra los datos de la ciudad leerDatos(); }

11. Leemos los datos que recibimos de la actividad principal y los mostramos.

/** * Lee y muestra los datos de la ciudad */ public void leerDatos(){ // CAMPOS //////////////////////////////////////////////////////////////////////////////////// Intent intent; Ciudad ciudad; // Almacena la ciudad obtenida // FIN CAMPOS //////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN ///////////////////////////////////////////////////////////////////////////////// // Obtiene la ciudad intent = getIntent(); ciudad = (Ciudad) intent.getSerializableExtra("CIUDAD"); // Muestra los datos de la ciudad txtNombreCiudad.setText(ciudad.getCiudad()); txtLatitud.setText(ciudad.getLatitud()); txtLongitud.setText(ciudad.getLongitud()); // FIN EJECUCIÓN ////////////////////////////////////////////////////////////////////////////// }


FIN

lunes, 4 de febrero de 2013

Lector de tweets para Android

Introducción:

En este tutorial vamos a explicar como crear una aplicación que nos permite leer los tweets de cualquier usuario y guardarlos en formatos xml y json.

Para ello la aplicación utilizará la API que twiter facilita, permitirá al usuario introducir el nombre de un usuario y la aplicación descargará los últimos tweets del usuario introducido y los guardará en formato xml y json.

Espero que le guste y le sea fácil de entender. No dude en comentar.

¡ Saludos !


Enlaces de interés:

Código Fuente
Puede descargar si lo desea el código fuente de este proyecto.



Pasos a seguir:

1. Creamos la interfaz de la actividad principal en donde se mostrará los tweets.


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <EditText android:id="@+id/edtxtBuscar" android:layout_width="228dp" android:layout_height="wrap_content" android:ems="10" > <requestFocus /> </EditText> <Button android:id="@+id/btnAceptar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/aceptar" /> </LinearLayout> <TextView android:id="@+id/txtInformacion" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" /> <ScrollView android:id="@+id/scrollView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="22dp" > <TextView android:id="@+id/txtTweets" android:layout_width="match_parent" android:layout_height="match_parent" android:textAppearance="?android:attr/textAppearanceMedium" /> </ScrollView> </LinearLayout> </RelativeLayout>


2. Declaramos los campos que vayamos a utilizar en la clase de la actividad principal.

/** * Muestra y almacena los tweets del nombre que se indique en ficheros * xml y json * * @author José Miguel Acosta Martín * */ public class TwitterActivity extends Activity { //////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // //////////////////////////////////////////////////////////////////////////////////////////// // Campos gráficos private EditText edtxtNombre; // Campo gráfico donde el usuario introduce el nombre a buscar private Button btnAceptar; // Campo gráfico donde la aplicación busca private TextView txtInformacion; // Campo gráfico que muestra información adicional private TextView txtTweets; // Campo gráfico que muestra los tweets //////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // ////////////////////////////////////////////////////////////////////////////////////////////


3. Iniciamos los campos y programamos los eventos en el método onCreate().

/** * Al iniciar la aplicación ... */ @SuppressLint("NewApi") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_twitter); // INICIALIZACIÓN DE CAMPOS ////////////////////////////////////////////////////////////// // Inicialización de campos gráficos edtxtNombre = (EditText) findViewById(R.id.edtxtBuscar); btnAceptar = (Button) findViewById(R.id.btnAceptar); txtInformacion = (TextView) findViewById(R.id.txtInformacion); txtTweets = (TextView) findViewById(R.id.txtTweets); // FIN INICIALICACIÓN DE CAMPOS ////////////////////////////////////////////////////////// // Permisos para acceder a internet StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); //////////////////////////////////////////////////////////////////////////////////////////// // EVENTOS // //////////////////////////////////////////////////////////////////////////////////////////// btnAceptar.setOnClickListener(new OnClickListener() { /** * Muestra los tweets y los escribe en ficheros xml y json */ public void onClick(View v) { // Muestra los tweets por pantalla y los escribe en ficheros xml y json mostrarTweets(edtxtNombre.getText().toString()); } }); //////////////////////////////////////////////////////////////////////////////////////////// // FIN EVENYOS // //////////////////////////////////////////////////////////////////////////////////////////// }

4. Creamos el método que se encargará de leer los tweets.

/** * Lee los tweets * * @param nombre Nombre de la persona que se quiere leer los tweets * @return Los tweets */ public String leerTwitterFeed(String nombre) { // CAMPOS ////////////////////////////////////////////////////////////////////////////////////////////////////// StringBuilder builder; // Almacena la cadena de texto HttpClient client; HttpGet httpGet; // Almacena la url desde donde se obtiene los tweets HttpResponse response; StatusLine statusLine; // Almacena el estado de la conexión int statusCode; // Almacena el codigo del estado de la conexión HttpEntity entity; InputStream content; BufferedReader reader; String line; // Almacena la linea leida // FIN CAMPOS ////////////////////////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN ///////////////////////////////////////////////////////////////////////////////////////////////////// // Inicialización de campos builder = new StringBuilder(); client = new DefaultHttpClient(); httpGet = new HttpGet("https://api.twitter.com/1/statuses/user_timeline.json?screen_name=" + nombre); // Url desde donde se obtienen los tweets try { // Inicialización de campos response = client.execute(httpGet); statusLine = response.getStatusLine(); // Obtiene el estado de la línea statusCode = statusLine.getStatusCode(); // Obtiene el codigo que determina el estado de la línea // Si es correcto if (statusCode == 200) { entity = response.getEntity(); content = entity.getContent(); reader = new BufferedReader(new InputStreamReader(content)); // Lee todo el fichero while ((line = reader.readLine()) != null) { // Añade la linea leida builder.append(line); } // Limpia el campo de información txtInformacion.setText(""); } else { // Indica al usuario que se ha producido un error al descargar el fichero txtInformacion.setText("Fallo al descargar el fichero"); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return builder.toString(); // FIN EJECUCIÓN //////////////////////////////////////////////////////////////////////////////////////////////////////////// }



5. Y también tendremos que programar el método que se encargará de guardar los tweets en un fichero xml.

/** * Guarda los tweets en un fichero xml * * @param tweet Texto del tweet * @param fecha Fecha del tweet * @param nombreFichero Nombre del fichero */ public void guardarXml(String tweet, String fecha, String nombreFichero){ // CAMPOS ///////////////////////////////////////////////////////////////////////////////// XmlSerializer ser; OutputStreamWriter fout; // Fichero donde se escribre // FIN CAMPOS //////////////////////////////////////////////////////////////////////////// // EJECUCIÓN /////////////////////////////////////////////////////////////////////////////// try { //Crea el serializer ser = Xml.newSerializer(); //Crea un fichero en memoria interna fout = new OutputStreamWriter(openFileOutput(nombreFichero + ".xml", Context.MODE_APPEND)); //Asigna el resultado del serializer al fichero ser.setOutput(fout); //Construye el XML ser.startTag("", "tweet"); ser.startTag("", "texto"); ser.text(tweet); ser.endTag("", "texto"); ser.startTag("", "fecha"); ser.text(fecha); ser.endTag("", "fecha"); ser.endTag("", "tweet"); ser.endDocument(); // Cierra el fichero fout.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // FIN EJECUCIÓN //////////////////////////////////////////////////////////////////////////////////////// }


6. Creamos otro método para guardar los tweets en formato Json.
/** * Guarda los tweets en un fichero json * * @param tweet Texto de tweet * @param fecha Fecha del tweet * @param nombreFichero Nombre del fichero donde se quiere guardar * @param tamano Tamaño del array de tweets * @param numeroTweet El número del tweet que se quiere guardar */ public void guardarJson(String tweet, String fecha, String nombreFichero, int tamano, int numeroTweet){ // CAMPOS ///////////////////////////////////////////////////////////////////////////////////////////////// OutputStreamWriter fout; // Fichero donde se escribre // FIN CAMPOS ///////////////////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN ////////////////////////////////////////////////////////////////////////////////////////////// try { //Crea un fichero en memoria interna fout = new OutputStreamWriter(openFileOutput(nombreFichero + ".json", Context.MODE_APPEND)); // Controla si es la primera entrada if (numeroTweet == 0){ // Si es la primera entrada ... // Añade fout.append("["); } // Controla si no es la última entrada if (numeroTweet < tamano - 1){ // Si no es la última entrada ... // Añade fout.append("{ tweet:" + "\"" + tweet + "\"" + ", fecha:" + "\"" + fecha + "\"" + "},"); } else { // Si es la última entrada ... // Añade fout.append("{ tweet:" + "\"" + tweet + "\"" + ", fecha:" + "\"" + fecha + "\"" + "}]"); } // Cierra el fichero fout.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // FIN EJECUCIÓN //////////////////////////////////////////////////////////////////////////////////////////// }


9. Le mostramos los datos al usuario además de utilizar los métodos anteriores para guardar los tweets en diferentes ficheros.
/** * Muestra y escribre los tweets en ficheros xml y json * * @param nombre Nombre de quien se quiere leer los tweets */ public void mostrarTweets(String nombre){ // CAMPOS /////////////////////////////////////////////////////////////////////////////// JSONArray jsonArray; // Almacena los tweets JSONObject jsonObject; // Almacena el tweet String tweet; // Almacena el tweet String fecha; // Almacena la fecha del tweet // FIN CAMPOS ////////////////////////////////////////////////////////////////////////// // EJECUCIÓN /////////////////////////////////////////////////////////////////////////// try { // Almacena los tweets jsonArray = new JSONArray(leerTwitterFeed(nombre)); // Se informa sobre el número de tweets txtInformacion.setText("Número de entradas " + jsonArray.length()); // Recorre el array de tweets for (int i = 0; i < jsonArray.length(); i++) { // Obtiene el objeto del array jsonObject = jsonArray.getJSONObject(i); // Obtiene el tweet tweet = jsonObject.getString("text"); // Obtiene la fecha fecha = jsonObject.getString("created_at"); // Muestra los tweets txtTweets.append(jsonObject.getString("text") + "\n\n"); // Guarda los tweets en un fichero xml guardarXml(tweet, fecha, nombre); // Guarda los tweets en un fichero json guardarJson(tweet, fecha, nombre, jsonArray.length(), i); } } catch (Exception e) { e.printStackTrace(); } // FIN EJECUCIÓN /////////////////////////////////////////////////////////////////////// }

10. Finalmente le añadimos los permisos necesarios al manifiesto para que Android nos permita usar la conexión a Internet.

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ACDAT.ejercicio7" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <uses-permission android:name="android.permission.INTERNET"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".TwitterActivity" android:label="@string/title_activity_twitter" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>



FIN