You are on page 1of 72

JUEVES, 8 DE MAYO DE 2014

WebService: Conexiones a base de datos Mysql desde Android. PARTE 1


(Insertar)
Buenas amigos, llevo un tiempo sin hacer nada por aqu, ya que estoy trabajando con un
grupo de programadores en un proyecto, pero a peticin popular, y a la cantidad de email
que me han mandado pidindome informacin para realizar conexiones a Mysql desde
android, voy a realizar este tema.

Bien, el tema en s es complejo, ojo, no difcil de entender, si no complejo de realizar,


vamos a realizar mucho cdigo para lo que realmente necesitamos, interactuar con una
base de datos mysql en un servidor.
Si habis hecho conexiones a mysql desde java sabris que con una clase que contenga
4 o 5 lineas de cdigo podamos realizar nuestra conexin a mysql, podis
comprobarlo aqu, posteriormente solo tenamos que manejar los datos obtenidos (7 u 8
lineas) y ya podamos mostrar resultados en nuestro programa. Bien, esto en android
cambia y se vuelve ms complejo ya que, por seguridad, deberemos crear un webservice
para que nos sirva de puente entre nuestra aplicacin y nuestro servidor.
Un Webservice suele ser un archivo PHP que recibe peticiones de nuestra app y se las
enva al servidor, posteriormente el servidor responde a nuestro webservice, y este, a su
vez, responde a nuestra app. Os dejo una imagen para que lo entendis mejor.

Un WebService no tiene porque ser un archivo PHP, tambin podramos realizar en


nuestro servidor un programa en java que escuche por socket nuestra app y pasarle
parmetros para que se comunique con el servidor, o podramos crear un archivo
javascript, o cualquier otra cosa que nos valga para comunicar nuestra app con nuestro
servidor, pero ya digo, que lo ms fcil, rpido y sencillo es un archivo PHP, no os
compliquis.
Bien, para crear la conexin a mysql necesitaremos:

Servidor con base de datos Mysql.

Mi base de datos esta compuesta por una tabla "personas" con los
siguientes campos:
DNI---Varchar
Nombre--Varchar
Telfono--Varchar
Email.--Varchar
Uno o varios WebService (segn necesitemos). Yo voy a utilizar 2:
Insert.php
selectAll.php
Una conexin mediante la clase HttpClient de la API de Apache
No hay que agregar libreras, esta API va incluida en el repositorio android.
Ejecutarlo todo mediante hilos AsyncTask.
A partir de la versin 3 o superior, correrlo todo en AsyncTask es
obligatorio.
Bueno, sabiendo esto, creamos un nuevo proyecto con su respectiva activity.
Mi activity va a ser muy simple:

Podis observar que consta de:

4 TextView y 4 Edittext, para los campos a rellenar.

2 Button para insertar y mostrar.

2 ImageButton para pasar de una persona a otra y se nos vaya mostrando.

Bien, una vez tengamos nuestro diseo, nos vamos a nuestra clase.
Lo primero es ligar nuestra clase con el archivo xml y sus componentes:

Antes de continuar vamos a ir a nuestro archivo AndroidManifest y vamos a agregar


permisos de INTERNET, muy importante.

Una vez hecho todo lo anterior vamos a crear un mtodo que enve la informacin que
introducimos en los campos a nuestroWebService para que este se lo comunique al
servidor y obtener una respuesta.

Bueno, no os asustis de ver tanta linea, ante todo saber que solo trabajamos con 2
clases y un ArrayList:
HttpClient: Clase encargada de enviar la informacin almacenada en httpPost a
nuestro WebService.
HttpPost: almacena los datos que sern enviados, por medio de HttpClient, a
nuestro WebService.
List: Almacena objetos de tipo "NameValuePair" el cual almacena por constructor
(NameValuePair es una interfaz la cual implementa la clase BasicNameValuePair ) una
variable y el valor que contendr dicha variable, las cuales son las que obtendr
nuestro WebService.
Veamos:
Implementamos las clases con las que vamos a trabajar:
HttpClient httpclient=new DefaultHttpClient();
HttpPost httppost=new HttpPost("URL DE NUESTRO WEBSERVICE
EN EL SERVIDOR")
Yo tengo puesto la ip local de mi pc, ya que si ponemos localhost o
127.0.0.1, el dispositivo va a buscar su propio localhost, el que va incluido en el mvil, y
puede crear errores, lo mejor si estas probando, la ip local de tu pc. Si utilizas el emulador
que trae el eclipse SDK android, tendrs que poner 10.0.0.2, ya que si no te dar fallo.

List nameValuePairs=new ArrayList(4);


En este caso le damos a nuestro ArrayList un tamao (4) ya que
son el nmero de variables con las que vamos a tratar, si quieres utilizar 3, pones 3, y as
sucesivamente.
Ya tenemos nuestras clases preparadas, ahora vamos a almacenar los datos de
nuestros EditText en nuestroArrayList:
nameValuePairs.add(BasicNameValuePair("dni",
dni.getText().toString().trim()));
Bien, esto no tiene mucha historia, almacenamos objetos
de BasicNameValuePair con una variable y el valor que va a tener que le pasamos por
constructor. Agregamos a nuestro ArrayList un objeto de este tipo segn el tamao que le
hayamos dado.
Una vez almacenados los datos, le pasamos el ArrayList a nuestra
clase HttpPost para que lo codifique:
httppost.setEntity(new UrlEncodeForEntity(nameValuePairs));
Bueno, una vez que lo tenemos codificado con la url del webservice y la
informacin de nuestro ArrayList, hacemos que HttpClient lo enve:
httpclient.execute(httppost);
Bueno, no era tan difcil, si un poco complejo, pero no difcil.
Bien, ya hemos enviado nuestra informacin a nuestro WebService, veamoslo con lo que
le hemos enviado:

Veamos, este es nuestro WebService, un archivo escrito en PHP que interactua con
nuestro servidor, su funcionamiento sera de la siguiente manera:
Rellenamos las variables del localhost con la informacin de nuestro servidor:
Hostname: Nombre del host.
Database: Nombre de nuestra base de datos.
Username: Nombre de usuario del servidor.

Password: Contrasea del servidor.


Posteriormente, con los datos de servidor que hemos introducido, le pedimos que
conecte al servidor y almacene la respuesta en otra variable:
$localhost = mysql_connect($hostname_localhost,
$username_localhost,$password_localhost)
Si no puede conectar enviara un informe de error
or trigger_error(mysql_error(),E_USER_ERROR);
Una vez conectado al servidor, buscar nuestra base de datos y se conectar:
mysql_select_db($database_localhost, $localhost);
Posteriormente, y una vez encontrad la base de datos, obtendr las variables que
le pasamos por nuestra aplicacin y las almacenar en otras variables que pueda manejar
mejor.
$nombre=$_POST['nombre'];
$dni=$_POST['dni'];
$telefono=$_POST['telefono'];
$email=$_POST['email'];
Daos cuenta de que los nombres entre comillas simples se llaman
igual a las variables que les pasamos por nuestra app.
Almacenadas las variables, introduce los valores en un sentencia sql para realizar
una consulta al servidor:
$query_search = "insert into personas(nombre,dni,telefono,email)
values ('".$nombre."','".$dni."','".$telefono."','".$email."')";
Cuidado con las comillas simples y dobles, que puede ser un folln
jeje.
Finalmente, y si todo ha ido bien, realizar la consulta a nuestro servidor, el cual,
en caso de fallar la sentencia, nos enviar un informe de error.
$query_exec = mysql_query($query_search) or die(mysql_error());
Cerramos la conexin.
mysql_close($localhost);
Bien, ya tenemos el cdigo java para conectarnos a nuestro servidor por medio de android
y tenemos un webservice escrito en PHP que hace de puente entre nuestra app y el
servidor, pero an nos queda un ltimo paso, realizar la consulta por medio de una
clase AsyncTask.
NOTA:No voy a hacer aqu una explicacin sobre el funcionamiento de una clase AsyncTask, ya
que me quedara muy extenso el post, en el futuro crear un tema para esta clase. En google
puedes encontrar mucha informacin sobre esta clase.

Nos volvemos a nuestra clase, y creamos una clase interna que herede de AsyncTask:

Bien, en el mtodo doInBackground creamos una condicin if, en el cual introducimos


como condicin el mtodo insertar() (por esa razn lo hice booleano) si se los datos han
sido insertados, el mtodo nos devuelve true y nos muestra un Toast con el xito de la
operacin y limpiando nuestro formulario, todo esto debe correr en un hilo ya que si no
bloqueara nuestroAsyncTask y nos funde a errores, si los datos no han podido ser
insertados, el mtodo insertar nos devolver false, y nos mostrar un Toast corriendo en
un hilo.

Bueno, ya lo tenemos todo:


Un servidor. Bien!
Un WebService. Bien!
Un mtodo para conectar con nuestro WebService. Bien!
Una clase AsyncTsk que ejecuta nuestro cdigo. Bien!
Solo nos falta ir al botn insertar y darle una accin, para cuando se pulse ejecute todo al
mismo tiempo.

Finalmente ya lo tenemos, cuando pulsemos nuestro botn comprobar que no haya


ningn campo vaco, si lo hay, enviar un mensaje y no insertar nada.
Bueno, mencionar que mi dispositivo android no me hace bien las capturas de fotos y nos
puedo mostrar una captura con datos, pero si os puedo mostrar como los muestra mi
tabla personas una vez insertado los datos.

Tambin os dejo la clase, el archivo .xml y el webservice en este enlace:


https://www.mediafire.com/?qyrmwvks9cyl2rx

PD: No he mencionado nada de encriptacin (MD5, Base64...) o los certificados SSL,


quiero hacer una entrada acerca de la seguridad.
Continuaremos la leccin en la PARTE 2.
Un saludo.

VIERNES, 9 DE MAYO DE 2014

WebService: Conexin a base de datos Mysql desde Android. PARTE 2.


(Mostrar)
Buenas amigos, en este nuevo tema vamos a continuar hablando de como conectar
nuestra aplicacin android a nuestro servidor Mysql. En el tema anterior, la PARTE 1,
estuvimos viendo como insertar datos en nuestra base de datos, en este tema veremos
como recuperar esos datos y mostrarlos en nuestro dispositivo.

Bien, deciros que no voy a utilizar JSON para obtener los datos, si no que crear una
clase Personas donde ir almacenando los datos de cada persona, para posteriormente
guardar ese objeto "Persona" en un ArrayList. Esta forma de hacerlo quizs no sea la
ms correcta, pero es suficientemente vlida como para explicarla. La forma correcta
sera utilizando JSON, pero no quiero complicar ms el tema.
Empecemos, aqu os dejo la clase, el archivo .xml y el webservice de la PARTE 1, por si
no lo tenis:
WebSeviceExample
Bien, lo primero que haremos ser agregar una nueva clase Personas, la cual tendr
como atributos:

Nombre
DNI
Telefono
Email

Una vez la tengamos creada, nos vamos a nuestra clase y creamos nuevos atributos que
vamos a utilizar:
private int posicion=0;
private List listaPersonas;
Esta lista la iniciamos en el mtodo onCretae():
listaPersonas=new ArrayList();
Posteriormente creamos un mtodo para obtener los datos del WebService:

Veamos, este cdigo cambia ligeramente con respecto al mtodo insertar que creamos
en la PARTE 1.
Este mtodo es de tipo String, por lo tanto nos devolver una String con los
resultados obtenidos de nuestro servidor.
Creamos una variable local de tipo String llamada resquest, esta almacenar la
respuesta.
String resquest="";
Instanciamos HttpClient y HttpPost para comunicarnos con nuestro Webservice.
HttpClient httpclient=new DefaultHttpClient();
HttpPost httppost=new HttpPost("URL DE NUESTRO WEBSERVICE
EN EL SERVIDOR");
Con respecto a nuestro mtodo "ingresar", no vamos a crear un ArrayList para
almacenar datos y pasrselos al servidor, ya que es el servidor el que nos tiene que pasar los
datos.
Tampoco vamos codificar datos, ya que no tenemos datos que codificar.
Creamos un objeto de la clase ResponseHandler, ya que para que nos de una
respuesta el webservicedebemos de pasarle este handler al
mtodo excute() de HttpClient por parmetro para que nos devuelva los datos.
ResponseHandler responseHandler=new BasicResponseHandler();
Le decimos a HttpClient que ejecute la peticin a nuestro webservice, y este nos
devolver una String, la cual almacenamos en resquest:
resquest=httpclient.execute(httppost, responseHandler);
Bien, ya tenemos el cdigo para obtener los datos del servidor, veamos que es lo que
hace nuestro Webservice cuando conectamos con l.:

Como podis observar, cambia poco con respecto a nuestro WebService "insert.php":
Lo primero es meter la informacin de nuestro servidor:
Hostname: Nombre del host.
Database: Nombre de nuestra base de datos.
Username: Nombre de usuario del servidor.
Password: Contrasea del servidor.
Posteriormente nuestro WebService intentar conectar al servidor, enviando un
informe de error en caso de no porder conectar:
$localhost=mysql_connect($hostname_localhost,
$username_localhost,$password_localhost)
or trigger_error(mysql_error(),E_USER_ERROR);
Una vez conectado al servidor, intentar conectar con nuestra base de datos
mysql_select_db($database_localhost, $localhost);
Luego, creamos una sentencia sql para que obtenga todos los datos del servidor.
$query_search = "select * from personas order by dni";
Ejecuta la sentencia sql:
$query_exec = mysql_query($query_search) or die(mysql_error());
Finalmente, y mediante un bucle WHILE nos ir imprimiendo los resultados.
while($row = mysql_fetch_array($query_exec)){
echo $row['nombre']."
".$row['dni']."
".$row['telefono']."
".$row['email']."/";
}
Cerramos la conexin:
mysql_close($localhost);

Decir que la barra al final del echo "/" y los "br", los pongo para filtrar y descomponer la
informacin que me enva el servidor, ya que este me manda una String con todas las
filas, y yo las filtro para poder manejar los datos individualmente.
Bien, ya sabemos como funciona nuestro WebService y tenemos almacenada la
informacin del servidor, ahora vamos a crear un mtodo que nos filtre los resultados y
nos lo almacene en objetos:

Veamos:
Creamos un mtodo booleano que en caso de no obtener resultados de
nuestro WebService retornar false y en caso de obtener resultados, lo descompondr, lo
almacenar y retornar true.
Limpiamos nuestro ArrayList por si tuviese algo de informacin.
listaPersonas.clear();
Ahora creamos una condicin if para comprobar que nuestro resultado contiene
informacin para poder continuar.
if(!mostrar().equalsIgnoreCase(""))
Si la condicin es cierta, pasamos el primer filtro separando la informacin por
bloques utilizando como elemento separatorio la barra "/"
String [] cargaDatos=mostrar().split("/");
Acordaos de que nuestro webservice imprima una barra "/" cada
vez que mostraba una fila, es la que utilizo para el split.
Tenemos las filas almacenadas en un array, pero cada posicin del array almacena
una String con todos los datos de la persona, por lo tanto le vamos a pasar un segundo filtro
para almacenar finalmente los datos de forma individual.
Creamos un for que recorra nuestro array "cargaDatos".
for (int i = 0; i < cargarDatos.length; i++) {
Por cada posicin del array lo descomponemos con otro split, en este caso
utilizaremos br para nuestro split.
String datosPersona[]=cargarDatos[i].split("<"br">");

quitarle las comillas a "br", que es que si no me crea un


conflicto con el html y me genera un salto de linea
Creamos un objeto de la clase Personas
Perosnas personas=new Personas();
Le damos a cada atributo de personas el valor almacenado en nuestro
array "datosPersonas"
personas.setNombre(datosPersona[0]);
personas.setDni(datosPersona[1]);
personas.setTelefono(datosPersona[2]);
personas.setEmail(datosPersona[3]);
Finalmente agregamos nuestro objeto Personas a nuestro ArrayList:
listaPersonas.add(personas);
Antes de pasar a nuestro AsyncTask para cargar los datos, vamos a crear otro mtodo
que nos imprima en nuestro formulario los datos almacenados en nuestro ArrayList.

Este mtodo no tiene mucha historia, le pasamos una posicin por parmetro y, corriendo
en un hilo, nos busca el objeto almacenado en la posicin indicada y lo muestra en
nuestro formulario.
Finalmente lo ejecutamos todo en nuestro AsyncTask:

Ya con todo, nos vamos a nuestro botn mostrar y le damos una accin:

Para darle un poco ms de chicha creamos los ImageButton "mas" y "menos", la


accin de estos botones sera:

La accin de "mas" sera:


Comprobar que la lista no este vaca
if(!listaPersonas.isEmpty)
Si no esta vaca comprueba que la variable int posicion no tenga un valor
superior al tamao de nuestroArrayList
if(posicion>=listaPersonas.size()-1)
Si es superior o igual, iguala el valor de posicion al tamao de
nuestro ArrayList y muestra el objeto, en nuestro formulario, de dicha posicin.
posicion=listaPersonas.size()-1;
mostrarPersona(posicion)
Si no es superior o igual, suma +1 al valor de posicion y muestra los resultados
en nuestro formulario:
posicion++;
mostrarPersona(posicion);
La accin de nuestro botn "menos" es muy parecida:

Bien, es mu parecido al funcionamiento de nuestro botn "mas" as que supongo que no


necesite una explicacin.
Bien amigos, hasta aqu la PARTE 2, espero no haberos hecho un cacao mental, y
haberme expresado con claridad
Os dejo el link con el WebService "selectAll.php" y la clase con todos los mtodos.
WebServiceExampleCodePARTE2
Continuaremos con la PARTE 3
PD: Decir, una vez ms, que esta forma de hacerlo no sea la ms correcta, pero es valida,
ya que no vulnero la seguridad en ningn momento (Certificados SSL y encriptacin en
los prximos temas), aunque si es verdad que no he tenido cuidado a la hora de optimizar
la memoria que consume por lo poca cosa que es, pero ya os digo, que consume mucho
para la poca cosa que es, pero lo he hecho as an sabindolo, porque no me quera
entretener con esto mucho tiempo. La optimizacin de memoria corre por vuestra
cuenta :P
Un saludo a todos.

MARTES, 13 DE MAYO DE 2014

WebService: Conexiones a Mysql desde Android. PARTE 3 (Update).


Buenas amigos, vamos a continuar con el tema de los WebService. En entradas
anteriores veamos como insertar datos en nuestra base de datos mysql (PARTE 1) y
posteriormente como mostrar los datos, de nuestra base de datos, en nuestra aplicacin
(PARTE 2). Ahora, en esta nueva entrada, vamos a ver como actualizar los registros de
nuestra base de datos.

Bien, primero voy a modificar mi archivo xml para que quede de la siguiente manera:

Bueno, creamos un mtodo para conectar con nuestro webservice:

Veamos, este mtodo es exactamente igual que el mtodo insertar de la PARTE 1, lo


nico que cambia es la url del servidor. Veamos:
Implementamos las clases con las que vamos a trabajar:
HttpClient httpclient=new DefaultHttpClient();
HttpPost httppost=new HttpPost("URL DE NUESTRO WEBSERVICE
EN EL SERVIDOR")
Yo tengo puesto la ip local de mi pc, ya que si ponemos localhost o
127.0.0.1, el dispositivo va a buscar su propio localhost, el que va incluido en el mvil, y
puede crear errores, lo mejor si estas probando, la ip local de tu pc. Si utilizas el emulador
que trae el eclipse SDK android, tendrs que poner 10.0.0.2, ya que si no te dar fallo.
List nameValuePairs=new ArrayList(4);
En este caso le damos a nuestro ArrayList un tamao (4) ya que son el
nmero de variables con las que vamos a tratar, si quieres utilizar 3, pones 3, y as
sucesivamente.
Ya tenemos nuestras clases preparadas, ahora vamos a almacenar los datos de
nuestros EditText en nuestro ArrayList:
nameValuePairs.add(BasicNameValuePair("dni",
dni.getText().toString().trim()));
Bien, esto no tiene mucha historia, almacenamos objetos
de BasicNameValuePair con una variable y el valor que va a tener que le pasamos por

constructor. Agregamos a nuestro ArrayList un objeto de este tipo segn el tamao que le
hayamos dado.
Una vez almacenados los datos, le pasamos el ArrayList a nuestra
clase HttpPost para que lo codifique:
httppost.setEntity(new UrlEncodeForEntity(nameValuePairs));
Bueno, una vez que lo tenemos codificado con la url del webservice y la
informacin de nuestro ArrayList, hacemos que HttpClient lo enve:
httpclient.execute(httppost);
Ahora vamos a ver como trabaja nuestro WebService:

Rellenamos las variables del localhost con la informacin de nuestro servidor:


Hostname: Nombre del host.
Database: Nombre de nuestra base de datos.
Username: Nombre de usuario del servidor.
Password: Contrasea del servidor.
Posteriormente, con los datos de servidor que hemos introducido, le pedimos que
conecte al servidor y almacene la respuesta en otra variable:
$localhost=mysql_connect($hostname_localhost,
$username_localhost,$password_localhost)
Si no puede conectar enviara un informe de error
or trigger_error(mysql_error(),E_USER_ERROR);
Una vez conectado al servidor, buscar nuestra base de datos y se conectar:
mysql_select_db($database_localhost, $localhost);
Posteriormente, y una vez encontrada la base de datos, obtendr las variables que
le pasamos por nuestra aplicacin y las almacenar en otras variables que pueda manejar
mejor.
$nombre=$_POST['nombre'];
$dni=$_POST['dni'];
$telefono=$_POST['telefono'];
$email=$_POST['email'];

Daos cuenta de que los nombres entre comillas simples se llaman


igual a las variables que les pasamos por nuestra app.
Almacenadas las variables, introduce los valores en un sentencia sql para realizar
una consulta al servidor:
$query_search = "update personas set nombre='".$nombre."',
telefono='".$telefono."',email='".$email."' where dni='".$dni."'";
Cuidado con las comillas simples y dobles, que puede ser un folln
jeje.
Finalmente, y si todo ha ido bien, realizar la consulta a nuestro servidor, el cual,
en caso de fallar la sentencia, nos enviar un informe de error.
$query_exec = mysql_query($query_search) or die(mysql_error());
Cerramos la conexin.
mysql_close($localhost);
Antes de ir con nuestra AsyncTask, voy a crear un mtodo que no podamos modificar el
campo dni, ya que lo utilizo comoprimary key:

Lo que hace este mtodo es recorrer nuestro ArrayList listaPersonas comprobando el


campo dni de cada persona, si el dnide nuestro campo EditText dni coincide con el
campo dni del objeto personas, devuelve true, por lo que podr actualizar nuestro
registro, en caso de que no coincida, mostrar un Toast comunicando que no puede
modificar el registro (porque nuestro dni no existe en la base de datos) y nos
devuelve false.
Ahora si, vamos a ver nuestro AsyncTask:

Bien, en el mtodo doInBackground creamos una condicin if, en el cual introducimos


como condicin el mtodo update() si se los datos han sido actualizados, el mtodo nos
devuelve true y nos muestra un Toast con el xito de la operacin y limpiando nuestro
formulario, todo esto debe correr en un hilo ya que si no bloqueara nuestro AsyncTask y
nos funde a errores, si los datos no han podido ser actualizados, el mtodo update() nos
devolver false, y nos mostrar un Toast corriendo en un hilo.
Bueno, solo nos queda darle una accin a nuestro botn actualizar:

Como nuestro botn insertar, primero comprueba que no haya campos vacos,
posteriormente, y si los campos no estn vacos, comprueba que exista el dni, y si todo
ha ido bien, nos ejecuta nuestro cdigo update, si no, nos mostrar por pantalla
un Toast con el tipo de error.
Bien amigos, hasta aqu la opcin para actualizar los registros de nuestra base de datos.
Aqu os dejo el .xml, la clase y el php: WebServiceCodeExamplePARTE3
Continuaremos con la PARTE 4.
Un saludo.

MIRCOLES, 14 DE MAYO DE 2014

WebService. Conexin a base de datos Mysql desde Android. PARTE 4


(Borrar)
Buenas amigos, en temas anteriores estuvimos viendo como insertar registros a una base
de datos Mysql (PARTE 1), como mostrar esos datos en nuestra app (PARTE 2) y como
modificarlos (PARTE 3). Bien, como es obvio, en esta nueva parte veremos como borrar
registros de nuestra base de datos.

Primeramente voy a crear un mtodo en mi clase WebServiceExample para que conecte


con el webservice asociado y le pase un parmetro, DNI, para que nos borre a nuestro
usuario segn su dni.

Bueno, si hemos seguidos todas las partes de este tutorial, esto tiene que estar
dominado, vara muy poco entre unas cosas y otras.

Implementamos las clases con las que vamos a trabajar:


HttpClient httpclient=new DefaultHttpClient();
HttpPost httppost=new HttpPost("URL DE NUESTRO WEBSERVICE
EN EL SERVIDOR")
Yo tengo puesto la ip local de mi pc, ya que si ponemos localhost o
127.0.0.1, el dispositivo va a buscar su propio localhost, el que va incluido en el mvil, y
puede crear errores, lo mejor si estas probando, la ip local de tu pc. Si utilizas el emulador
que trae el eclipse SDK android, tendrs que poner 10.0.0.2, ya que si no te dar fallo.

List nameValuePairs=new ArrayList(1);


En este caso le damos a nuestro ArrayList un tamao (1) ya que
son el nmero de variables con las que vamos a tratar, si quieres utilizar 3, pones 3, y as
sucesivamente.
Ya tenemos nuestras clases preparadas, ahora vamos a almacenar los datos de
nuestros EditText en nuestro ArrayList:
nameValuePairs.add(BasicNameValuePair("dni",
dni.getText().toString().trim()));
Bien, esto no tiene mucha historia, almacenamos objetos
de BasicNameValuePair con una variable y el valor que va a tener que le pasamos por
constructor. Agregamos a nuestro ArrayList un objeto de este tipo segn el tamao que le
hayamos dado.
Una vez almacenados los datos, le pasamos el ArrayList a nuestra
clase HttpPost para que lo codifique:
httppost.setEntity(new UrlEncodeForEntity(nameValuePairs));
Bueno, una vez que lo tenemos codificado con la url del webservice y la
informacin de nuestro ArrayList, hacemos que HttpClient lo enve:
httpclient.execute(httppost);
Ahora nos vamos a nuestro webservice para ver como trabaja:

Cmo veis, el webservice tambin cambia poco con respecto a los anteriores:
Rellenamos las variables del localhost con la informacin de nuestro servidor:
Hostname: Nombre del host.
Database: Nombre de nuestra base de datos.
Username: Nombre de usuario del servidor.
Password: Contrasea del servidor.

Posteriormente, con los datos de servidor que hemos introducido, le pedimos que
conecte al servidor y almacene la respuesta en otra variable:
$localhost=mysql_connect($hostname_localhost,
$username_localhost,$password_localhost)
Si no puede conectar enviara un informe de error
or trigger_error(mysql_error(),E_USER_ERROR);
Una vez conectado al servidor, buscar nuestra base de datos y se conectar:
mysql_select_db($database_localhost, $localhost);
Posteriormente, y una vez encontrada la base de datos, obtendr la variable que le
pasamos por nuestra aplicacin y las almacenar en otra variable que pueda manejar mejor.
$dni=$_POST['dni'];
Almacenada la variable, introduce el valor en un sentencia sql para realizar una
consulta al servidor:
$query_search = "delete from personas where dni='".$dni."'";
Finalmente, y si todo ha ido bien, realizar la consulta a nuestro servidor, el cual,
en caso de fallar la sentencia, nos enviar un informe de error.
$query_exec = mysql_query($query_search) or die(mysql_error());
Cerramos la conexin.
mysql_close($localhost);
Ahora, y como ya deberas saber, vamos a crear una clase AsyncTask para que ejecute
nuestra conexin en segundo plano:

Bueno, en el mtodo doInBackground creamos una condicin if, en el cual introducimos


como condicin el mtodo eliminar() si se los datos han sido eliminados, el mtodo nos
devuelve true y nos muestra un Toast con el xito de la operacin y limpiando nuestro
formulario, todo esto debe correr en un hilo ya que si no bloqueara nuestro AsyncTask y
nos funde a errores, si los datos no han podido ser borrados, el mtodo eliminar() nos
devolver false, y nos mostrar un Toast corriendo en un hilo.
Finalmente vamos a nuestro botn eliminar y le damos una accin:

Bien, con esto ya podramos eliminar los registros de nuestra base de datos.
Continuaremos en la PARTE 5
Aqu os dejo la clase, el archivo xml y el PHP: WebServiceCodeExampleParte4
Un saludo a todos.

MARTES, 20 DE MAYO DE 2014

WebService: Subir Imagen a Servidor desde Android.


Buenas amigos, estuvimos viendo en temas anteriores como manejar los datos de un
servidor con una base de datos mysql. En este nuevo tema vamos a ver como subir, a
nuestro servidor, una imagen tomada con la cmara de nuestro dispositivo.

Bien el tema en s es un poco complejo pero con un poco de orden podemos lograrlo
hacer muy fcilmente. Decir, antes de continuar, que tambin he creado una nueva tabla
en la base de datos llamada "imagenes", la cual la componen un campo ID(primary key
y auto incremento) y un campo imagen (Varchar) donde almaceno el nombre, OJO, no
la ruta, el nombre de la imagen.
Antes de empezar agregamos permisos a nuestra aplicacin:

Posteriormente agregamos la librera httpmine de Apache


httpmine-4.2.5.jar
Creamos una carpeta en nuestro servidor, en mi caso "imgenes". Si ya la tienes creada,
ni caso a este punto.
Ahora creamos nuestro archivo xml con los componentes que desee cada uno. En mi
caso se compondrn de:

ImageButton: Para lanzar nuestra cmara.


EditText: Para nombrar nuestra imagen
ImageView: Para mostrar la imagen obtenida.
Button: Para subir la imagen a nuestro servidor.

Tras realizar nuestro .xml nos vamos a nuestra clase y declaramos los atributos que
vamos a necesitar:

Como veis tenemos declarados nuestros 4 componente:


1.
ImageButton camara
2.
ImageView imagen
3.
EditText nombreImagen
4.
Button upload
y otros 3 que vamos a ir utilizando a lo largo de este tema:
1.
Uri output.
2.
String foto
3.
File file.

Una vez llegados hasta aqu creamos un mtodo para activar la cmara del dispositivo:

Primeramente almacenamos en la String foto la ruta donde se va a guardar


nuestra imagen, en el dispositivo, con el nombre que hayamos elegido.
foto = Environment.getExternalStorageDirectory() +"/"
+nombreImagen.getText().toString().trim()+".jpg";
Pasamos nuestra String foto a File.
file=new File(foto);
Creamos un Intent que acceder a la cmara de nuestro dispositivo.
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Pasamos nuestro File a Uri.
output=Uri.fromFile(file);
Le pasamos a nuestro Intent la orden de almacenar en el dispositivo la imagen, y
el Uri con la ruta de la imagen.
intent.putExtra(MediaStore.EXTRA_OUTPUT, output);
Nos abre una nueva Activity con nuestra cmara y almacena el resultado para
procesarla en el mtodo sobreescrito starActivityForResult(parametro1,parametro2).
startActivityForResult(intent, 1);
El 1 es para indicar que queremos acceder a la cmara.
Bien, con este mtodo se nos abrir la cmara de nuestro dispositivo y al obtener una
imagen el mtodostartActivityForResult se encargar de procesarla y mostrarla en
nuestro ImageView:

Creamos un objeto de la clase ContentResolver que nos dar acceso al


contenido almacenado en la app.
ContentResolver cr=this.getContentResolver();
Creamos un objeto de la clase Bitmap para manejar nuestra imagen que hemos
obtenido de nuestra cmara.
Bitmap bit=android.provider.MediaStore.Images.Media.getBitmap(cr,
output);
Le pasamos por argumentos nuestro objeto ContentResolver para
permitir el acceso y nuestro Uri indicndole en que ruta est.
Una vez hecho esto, le indicamos en que orientacin debe estar, esto de por si no
lo hace android, tenemos que crear un cdigo para indicar que si una imagen se obtiene en
posicin landscape u horizontal nos la tiene que mostrar en landscape u horizontal en
nuestro ImageView. Esto lo podemos conseguir por medio de un switch y de la siguiente
manera:
Creamos una variable de tipo int que almacenara los grados que debe ser
rotada la imagen.
int rotate=0;

Creamos un objeto ExifInterface que se encargar de evaluar en que


orientacin esta nuestra imagen
ExifInterface exif = new ExifInterface(file.getAbsolutePath());
Le pasamos por argumentos la ruta absoluta de nuestra
imagen.
Creamos y almacenamos la orientacin que nos devuelve ExifInterface:
int orientation =
exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
Con un switch le damos un valor a rotate segn el valor devuelto
por ExifInterface:
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
}
Creamos un objeto de la clase Matrix que ser la encargada de
transformar nuestra imagen y rotarla en su posicin.
Matrix matrix=new Matrix();
Le pasamos la rotacin que queremos que tenga:
matrix.postRotate(rotate);
Le indicamos a Bitmap la nueva configuracin de la imagen:
bit = Bitmap.createBitmap(bit , 0, 0, bit.getWidth(),
bit.getHeight(), matrix, true);
Finalmente insertamos nuestra imagen procesada a nuestro ImageView
imagen.setImageBitmap(bit);
Bien, hecho esto le damos a nuestro ImageButton la accin para iniciar la cmara:

Esta accin comprueba que el Edittext nombreImagen no est vaco, si lo est, nos
manda un Toast de aviso, si no, iniciar la cmara.
Con todo esto ya podremos hacer fotos e ir mostrndolas en nuestro ImageView.
Para subir nuestra imagen a servidor necesitaremos:
1.
Un mtodo que conecte con un WebService
2.
Un WebService que guarde nuestra imagen.
3.
Una clase AsyncTask para ejecutarlo todo.
Nuestro mtodo quedara de la siguiente forma:

Creamos un objeto DefaultHttpClient para realiza la conexin a


nuestro WebService.
HttpClient httpclient=new DefaultHttpClient();
Le cambiamos los parmetros (normalmente utilizamos los valores por defecto, en
este caso no)
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCO
L_VERSION, HttpVersion.HTTP_1_1);
Creamos un objeto HttpPost y le pasamos la ruta de nuestro WebService en el
servidor por el construtor.

HttpPost httppost = new


HttpPost("http://192.168.0.11/picarcodigo/upload.php");
Creamos un objeto de MultipartEntity, la cual se encuentra en la librera que os
pas antes. Se encargar de ayudarnos a subir el archivo almacenndolo (en temas
anteriores vimos que utilizbamos BasicNameValuePairpara almacenarlos).
MultipartEntity mpEntity = new MultipartEntity();
Creamos un objeto FileBody el cual ayudar a subir el contenido indicando, por
constructor, el archivo a subir y el tipo, en este caso una imagen en formato
jpg ("image/jpeg").
ContentBody foto = new FileBody(file, "image/jpeg");
Le pasamos en contenido almacenado en FileBoody y se lo
pasamos MultipartEntity para que lo almacene
mpEntity.addPart("fotoUp", foto);
Pasamos el objeto mpEntity y lo almacenamos en nuestro httppost
httppost.setEntity(mpEntity);
Ejecutamos nuestro httpclient pasndole toda la informacin necesaria
por httppost
httpclient.execute(httppost);
Una vez ejecutado todo, obtenemos la conexin y la cerramos.
httpclient.getConnectionManager().shutdown();
Bien, es un poco complejo, pero siguiendo los pasos es sencillo. Veamos como queda
nuestro WebService:

Bien, un poco distinto a lo visto en otros temas:


Le indicamos cual va a ser la ruta que va a tener en nuestro servidor, recordar que
mi carpeta se llamaba imagenes.
$ruta = "imagenes/" .basename($_FILES['fotoUp']['name']);
A la variable $_FILES se le adjudicara la ruta y el nombre.
Creamos una condicin if y con la ayuda del
mtodo move_uploaded_file movemos la imagen desde nuestro dispositivo al servidor.
if(move_uploaded_file($_FILES['fotoUp']['tmp_name'], $ruta))
Este mtodo tiene 2 parmetros, el primero es de donde viene el
archivo y el segundo es donde va a ser copiado.
Damos permisos al archivo por medio del mtodo chmod
chmod ("uploads/".basename( $_FILES['fotoUp']['name']), 0644);
2 parmetros, el tipo de archivo, y los permisos, 0644 en este caso.
El 6 para administrador, el primer 4 para grupos y el segundo 4 para usuarios (creo que es
as, no estoy muy puesto en permisos)Adjunto tabla de la wikipedia:

Bien, as queda nuestro WebService, pongmoslo todo a correr en un AsyncTask:

Bien nuestra clase AsyncTask va a utilizar los


mtodos onPreExecute y onPostExecute, los cuales realizan acciones antes y despus
de la accin del mtodo doInBackground() respectivamente.

En el mtodo onPreExecute creamos un progressDialog que se mostrar mientras se


sube nuestra imagen, y lo cerramos en el on PostExecute una vez realizada la accin
de doInBackground.
En el mtodo doInBackground llamamos al mtodo uploadFoto y le pasamos por
parmetro la url de nuestra imagen. Posteriormente, y como dije al principio del tema
insertaremos el nombre de la imagen en una tabla de la base de datos.
No voy a explicar lo que hace el mtodo insertar, ni su WebService, os pongo las
imgenes y si queris saber como funciona exactamente podis visitar la PARTE 1.
Mtodo onInsertar():

WebService InsertImagen.php

Hecho esto, le damos la accin a nuestro botn Upload:

Comprobamos que el archivo existe, y si es as, nos ejecuta toda la parafernalia.


Bien, espero que no haya sido mucho lo ni mucha confusin. Este cdigo funciona, estar
seguro de que tenis vuestro servidor correctamente configurado cuando ejecutis.
Aqu os dejo los archivos (xml, .java y .php): WebServiceUploadImage

JUEVES, 22 DE MAYO DE 2014

Android: Trabajando con ViewPager


Buenas amigos, en este nuevo tema vamos a ver como realizar una app en el que poder
deslizar nuestras activitys y que se nos vayan mostrando muy parecidamente a como lo
hace google play. Esto nos puede facilitar el diseo de nuestra aplicacin ya que nos
permite tener varias activitys funcionando en una sola.

Antes de nada voy a ir enumerando los componentes que nos harn falta:
1.
Librera JakeWharton Android ViewPagerIndicator
2.
Un archivo xml donde colocaremos el diseo de nuestra activity
3.
Un archivo xml que contendr un ViewPager y un TitlePageIndicator
4.
Un archivo .java que herede de Fragment
5.
Un archivo .java que herede de FragmentActivity
6.
Una clase PageAdapter para crear las distintas activitys
7.
Una clase DepthPageTransformer que nos proporciona google
Bien, todos estos archivos los podis descargar al final des tema.

Primero Importamos la librera JakeWharton Android ViewPagerIndicator (podis ver el


proyecto en github pulsandoaqu)a nuestro proyecto android. Debemos importarla como
proyecto Android existente y no como .jar, para ello vamos a realizar los siguientes pasos:
En eclipse, pulsamos file/new/other

En la nueva ventana que se nos abre pulsamos sobre "Android Project from
Existing Code"

Buscamos nuestra librera en el pc y pulsamos finish

Nota: Esta librera en particular os debera aparecer con el nombre library.


Una vez tengamos la librera incluida, pinchamos sobre nuestro proyecto con
botn derecho y elegimos"properties"

En la ventana que se nos abre pinchamos sobre Android y en la parte de abajo a


la derecha nos sale una opcin"library", pulsamos en "add", elegimos nuestra librera y
pulsamos "OK"

Ya tenemos nuestra librera android en nuestro proyecto.


NOTA: No confundir una librera android con una librera java

Una vez la librera este aadida vamos a realizar nuestras 2 archivos xml:
El primer archivo xml est compuesto por un ViewPager y un TitlePagerIndicator

Os lo pongo de esta manera para que lo veis mejor.

El segundo xml que voy a utilizar va a ser el mismo que utilic para el tema de subir
imagen a servidor sin darle ninguna funcionalidad, solo quiero que veis como se desliza
la screen al pasarla con el dedo, el darle funciones es cosa vuestra.

Bien, teniendo ya nuestros archivos xml creados vamos a empezar a crear clases,
necesitaremos 4:

MyFragmentPagerAdapter

Bueno, algo que no he explicado son los fragments, estos se comportan como
en html los div o capas, es decir, son un conjunto de activitys que se pueden unir o
acoplar para formar una activity ms completa.
Bien, no es algo que vayamos a profundizar aqu, pero para que os orientis.
Dicho esto, esta clase que hemos creado heredar de FragmentPageAdapter y
almacenar en un list de fragment losfragments que le vayamos pasando por
constructor.

El primer mtodo nos agrega un fragment a nuestro list.


public void addFragment(Fragment fragment) {
this.fragments.add(fragment);//Agregamos fragment a nuestra list
}
El segundo mtodo es sobreescrito, y nos devuelve un elemento de
nuestra list pasando su posicin por parmetro.
@Override

public Fragment getItem(int arg0) {


return this.fragments.get(arg0);//Obtenemos un item de nuestra

list

}
El tercer mtodo es sobreescrito y nos devuelve la cantidad de elementos que hay
almacenados en nuestro list.
@Override
public int getCount() {
return this.fragments.size();//Obtenemos el tamap de nuestra list
}
El cuarto mtodo es sobreescrito, y da un titulo a cada fragment segn posicin.
@Override
public CharSequence getPageTitle(int position) {
String s="";
switch(position){
case 0: s="Pestaa 1";
break;
case 1: s="Pestaa 2";
break;
case 2:
s="Pestaa 3"; break;
case 3:
s="Pestaa 4";
break;
}
return s;
}
Esta clase no tiene ms explicacin, es muy sencilla.

DepthPageTransfomer
Bueno esta clase nos la proporciona google junto con ZoomOutPageTransformer y su
funcin es darle una animacin a nuestros fragments mientras deslizamos la pantalla. No
voy a explicarla, ya lo hace muy bien google, solo tenis que copiarla y agregarla al
proyecto, de todas maneras, yo la dejar al final del tema junto al resto de archivos.
Podis verla aqu

ViewPagerFragment

Esta clase, como observaris, no hereda de activity, si no de fragment, es una porcin


de la activity final que queremos crear:
Creamos un mtodo static que nos devuelva como resultado un objeto de
nuestro fragment. Utilizaremos este mtodo para invocarlo en la siguiente clase.
public static ViewPagerFragment newInstance() {
// Instantiate a new fragment
ViewPagerFragment fragment = new
ViewPagerFragment();
return fragment;
}
Sobreescribimos el mtodo onCreate(), pero como ya dije, solo quiero mostrar
la activity, no le voy a dar ninguna accin, as que lo dejo vaco
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
Para terminar, sobreescribimos el mtodo onCreateView(), en el cual es donde
iniciamos los componentes de nuestro archivo xml en los fragments. Podis observar que
en este mtodo apunto al xml que quiero que muestre.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup

container,

Bundle savedInstanceState) {
// TODO Auto-generated method stub
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.activity_image_upload, container, false);
return rootView;
}
Vuelvo a repetir, no le voy a dar accin, solo quiero que veis como hace slide al
pasar el dedo.

ViewPagerExampleActivity

Bien, esta clase es la importante, la que nos va a hacer funcionar. Podis observar que
esta clase hereda deFragmentActivity. Esta clase formara una activity con todos
los fragments que le pasemos.

Primero declaramos nuestro ViewPager y nuestro PageIndicator


private ViewPager pager = null;
private PageIndicator mIndicator;

Posteriormente, en el mtodo onCreate(), y a continuacin de referenciar


nuestro ViewPager con el archivo xml, le damos una animacin con el
mtodo setPageTransformer, donde le pasaremos por parmetro un booleano y nuestra
clase DepthPageTransformer():
this.pager.setPageTransformer(true, new DepthPageTransformer());
A continuacin creamos un objeto de nuestro adapter MyFragmentAdapter, y le
pasamos por argumentosgetSupportFragmentManager() para obtener el soporte de la
aplicacin y mostrar posteriormente nuestrosfragments, y el contexto (this)
MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(
getSupportFragmentManager(),this);
Creamos un for para agregar 4 fragments a nuestro adapter.
for (int i = 0; i< 4; i++) {
adapter.addFragment(ViewPagerFragment.newInstance());
this.pager.setAdapter(adapter);
}
Podis ver que al aadir un fragment utilizamos el
mtodo static creado en el fragmentanterior
Finalmente referenciamos nuestro PageIndicator con nuestro xml y le agregamos
nuestro viewpager para que pueda ponerles titulo.
mIndicator = (TitlePageIndicator)findViewById(R.id.indicator);
mIndicator.setViewPager(pager);
Bien, esto es todo, si habis seguido bien los pasos, se os tienen que ir deslizando los
diferentes fragments con su titulo mientras pasis con el dedo.

Aqu os dejo los archivos: ViewPagerExample


Un saludo a todos.

SBADO, 31 DE MAYO DE 2014

Android: Integrar Google Map en nuestra aplicacin


Buenas amigos, en este nuevo tema vamos a ver como integrar la API de GoogleMaps en nuestra
aplicacin android. Bien, es un tema un poco complejo, ya que tenemos que descargar libreras de
nuestro sdk manager y obtener una clave de google, pero con paciencia y siguiendo los pasos
cuidadosamente, lograremos integrar los mapas de google en nuestra app.

Lo primero que vamos a hacer es abrir nuestro SDK Manager para descargar una librera
del repositorio degoogle.

Posteriormente nos vamos al final del todo, a la carpeta "extras" y marcamos "Google
Play Services"

Pulsamos en "Install Packages" para instalar.

NOTA: Cuidado con instalar paquetes que no queris, puede influir en el funcionamiento de
eclipse.
Una vez descargada, vamos a agregarla como librera Android a nuestro proyecto:

Pinchamos sobre File/New/Other y elegimos "Android Project For Existing Code"

En la ventana que se nos abre, buscamos la ruta donde este nuestra librera "Google Play
Services". Tenis que ir a la carpeta donde tengis vuestro sdk, y dentro seguir la
ruta"sdk\extras\google\google_play_services\libproject\google-play-services_lib"

Una vez tengis vuestra librera agregada, pinchis sobre vuestro proyecto y
elegs "preferences", posteriormente, en la ventana que se abre, pinchis en "android" y abajo a la
derecha podis agregar la librera a vuestro proyecto

Una vez tengamos la librera, debemos registrar nuestra app y obtener una clave Google Maps para
poder utilizarla en nuestra aplicacin.
NOTA: Esto lo hace google para mantener cierto control, ya que una app que al utilizar ms de
25.000 veces Google Mapsdebe de empezar a pagar una cantidad de dinero (pequea) por cada vez
que se utilice de ms Google Maps. Esto no supone un problema para una persona con una app,
pero si que lo es si 30.000 personas tienen la app y utilizan a menudoGoogle Maps.
Bien, para obtener una clave para utilizar Google Maps, necesitaremos un cdigo cifrado en SHA1 que nos proporciona el mismo eclipse:

Pinchamos en eclipse en "window/preference" y en la ventana que se abre, pinchamos


en "Android/build"

Bueno, ahi os aparecer vuestro cdigo en SHA-1, lo copiis en un bloc de notas, para utilizarlo
posteriormente.
Ahora, vamos a ir a Google Developer Console
Una vez en la pagina, pinchis sobre "API Access" y posteriormente pinchis sobre "Create new
Android Key"

En esta nueva ventana que se abre debis poner vuestro cdigo SHA-1 seguido de punto y
coma ";" y el nombre de nuestro proyecto, quedando de la siguiente forma:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX;com.example.picarcodig
o (todo junto).

Pulsis en "create" y ya os ha tenido que generar una key, os aparecer en un cuadro


similar a este.

Bueno, copiis vuestra key en un bloc de notas para utilizarla posteriormente, vamos a generar algo
de cdigo.

Lo primero que debemos hacer cuando creemos nuestro proyecto es agregar permisos a nuestra
aplicacin:

android.permission.INTERNET
android.permission.ACCESS_NETWORK_STATE
android.permission.WRITE_EXTERNAL_STORAGE
com.google.android.providers.gsf.permission.READ_GSERVICES
android.permission.ACCESS_COARSE_LOCATION
android.permission.ACCESS_FINE_LOCATION

Posteriormente agregamos la siguiente linea de cdigo:

Google Maps utiliza OpenGl para renderizar mapas, si no tenis instalado OpenGl, es
obligatorio ponerlo.
Ahora, continuando con nuestro manifest, debajo de donde tengamos declarada nuestra
activity, aadimos 2 meta-data.

En "android:value" del primer meta, pegis, entre comillas, vuestra clave, quedando de
la siguiente manera

Con esto ya, podemos trabajar con Google Maps en nuestra app.
Bien, ahora vais a vuestro archivo xml y agregis lo siguiente:

Bien, esto no necesita mucha explicacin, un fragment donde nos cargar nuestro mapa.
Vamos a ir ahora a nuestra clase para darle funcionalidad.

Bien, en cdigo, como podis observar, no es difcil:


Referenciamos nuestro xml
setContentView(R.layout.activity_maps_example);
Referenciamos el fragment de nuestro xml mediante la clase
"SupportMapFragment"
SupportMapFragment fm =
(SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
Pasamos nuestro "SupportMapFragment" a la clase GoogleMap para poder
manejar los mapas
GoogleMap map = fm.getMap();
Creamos un objeto de la clase LatLng (Latitud y Longitud) para introducir
coordenadas (Google Maps trabaja con coordenadas) que introduciremos posteriormente en
nuestro mapa
LatLng murcia = new LatLng(38.00, -1.12);

Activamos nuestra localizacin


map.setMyLocationEnabled(true);

Le pasamos las coordenadas y el zoom que nos va a mostrar, en mi caso, 2.0f


(float)

map.moveCamera(CameraUpdateFactory.newLatLngZoom(murcia,
2.0f));

Finalmente, aadimos un marcador de posicin


map.addMarker(new MarkerOptions()
.title("Murcia")//Titulo de nuestro marcador
.snippet("Picarcodigo.blogspot.com")//Informcin
.position(murcia));//Posicin.
Bien, si habis seguido bien los pasos no debis de tener ningn problema.

LUNES, 30 DE JUNIO DE 2014

WebService: Obtener datos mysql desde Android con JSON


Buenas amigos, llevo un tiempo desaparecido ya que estoy realizando un proyecto que,
afortunadamente, ya est en fase de testeo, y hasta nueva orden voy a estar un poco
parado, as que voy a realizar nuevas entradas y a contestar todos aquellos emails que
me han enviado con sus dudas, tengan paciencia les llegar a todos. Dicho esto,
estuvimos hablando en un tema anterior como mostrar datos de una base de datos mysql
en nuestra aplicacin sin utilizar JSON. Bien, en este nuevo tema veremos lo mismo pero
utilizando JSON.

Para comenzar, Que vamos a utilizar?:

Un servicio Apache con Mysql


Un WebService
Una clase "Personas" para almacenar datos
Una clase Main para ejecutarlo todo.
NOTA: Al final del post os dar los archivos.
Bien, como ya he dicho en temas anteriores no voy a comentar como crear un
servicio Apache ya que me quedara muy extenso el tutorial, buscar en google, hay a
patadas.
Antes de continuar decir que voy a trabajar con una tabla "Personas" con 4 campos (dni,
nombre, telefono, email).
Comenzaremos creando nuestro WebService:

Lo primero es meter la informacin de nuestro servidor:


Hostname: Nombre del host.
Database: Nombre de nuestra base de datos.
Username: Nombre de usuario del servidor.
Password: Contrasea del servidor.
Posteriormente nuestro WebService intentar conectar al servidor, enviando un
informe de error en caso de no poder conectar:
$localhost=mysql_connect($hostname_localhost,
$username_localhost,$password_localhost)
or trigger_error(mysql_error(),E_USER_ERROR);
Una vez conectado al servidor, intentar conectar con nuestra base de datos
mysql_select_db($database_localhost, $localhost);
Luego, creamos una sentencia sql para que obtenga todos los datos del servidor.
$query_search = "select * from personas order by dni";
Ejecuta la sentencia sql:
$query_exec = mysql_query($query_search) or die(mysql_error());
Creamos una variable llamada "json" que tendr formato de Array.
$json=Array();
Creamos una sentencia condicional "if" y le agregaremos el
mtodo mysql_num_rows(), al que le pasaremos por parmetro la ejecucin de la sentencia
sql, comprobando si la tabla est vaca o no.
if(mysql_num_rows($query_exec))

Si tenemos filas en nuestra tabla, se ejecutar un bucle "while" donde por medio
del mtodo mysql_fetch_associremos almacenando las filas en la variable $row
while($row=mysql_fetch_assoc($query_exec))
Y se lo pasamos a nuestra variable $json para que lo almacene para
posteriormente envirselo a nuestra app.
$json['personas'][]=$row;
Cerramos la conexin con el servidor
mysql_close($localhost);
Imprimimos por medio de echo nuestro $json con ayuda del
mtodo json_encode.
echo json_encode($json);
Ahora vais a vuestro navegador y comprobis que funciona, introduciendo la url
del "selectAllJSON.php" (as se llama mi webservice).
En mi caso la url sera: http://localhost/picarcodigo/selectAllJSON.php
Y lo que me imprime por pantalla sigue el formato JSON:
{"personas":[{"nombre":"Bartolome Abellan","dni":"55578932Z
z","telefono":"555789000","email":"bartolomeabellan@gmail.com"},
{"nombre":"cgghj","dni":"ghjj","telefono":"3689","email":"ghjkog"},
{"nombre":"ghkjf","dni":"hdguj","telefono":"5699","email":"gghk"}]}
Bien, ya tenemos listo nuestro WebService con JSON integrado veamos como quedar
nuestra app.
Lo primero es crear una clase "Personas" en las que almacenaremos los datos de cada
persona:

NOTA:No voy a explicar esta clase, si no sabes que hace o cual es su funcin, debes
estudiar ms, es algo bsico.

Voy a trabajar en mi app con esta interfaz, la cual pasar al final del post.
Bien, ya tenemos nuestro webservice y sabemos con que interfaz trabajar, vamos a ver
cdigo java.

Nuestra clase principal contendr los siguientes mtodos:


String mostrar(): Mtodo que realizar la conexin a nuestro servidor
por WebService, obteniendo un objetoString como resultado
boolean filtrarDatos(): Este mtodo obtendr el objeto String del
mtodo mostrar() y lo filtrar por diferentes clases JSON rellenando objetos de tipo
Personas que almacenaremos en un ArrayList. Parece complejo, pero no lo es, ya lo veris.
void mostrarPersonas(int Position): Nos cargar y mostrar los datos de las
personas almacenadas en determinadas posiciones de nuestro ArrayList.
String convertStreamToString(InputStream is): Este mtodo convertir objetos
de tipo InputStream en objetos de tipo String.
Todo esto ejecutado desde una clase AsyncTask.

Instanciamos HttpClient y HttpPost para comunicarnos con nuestro Webservice.


HttpClient httpclient=new DefaultHttpClient();
HttpPost httppost=new HttpPost("URL DE NUESTRO WEBSERVICE
EN EL SERVIDOR");
Creamos una variable local de tipo String llamada resultado, esta almacenar la
respuesta.
String resultado="";
Implementamos la interfaz HttpResponse para obtener el resultado de
ejecutar httpclient.
response = httpclient.execute(httppost);
Implementamos la interfaz httpEntity para procesar la respuesta obtenida
en HttpResponse.
HttpEntity entity = response.getEntity();
Utilizamos la clase InputStream para convertir los datos entity a byte.
InputStream instream = entity.getContent();
Le damos a nuestra variable "resultado" el valor de convertir los bytes
de InputStream a String por medio del mtodo convertStreamToString(InputStream is).
resultado= convertStreamToString(instream)
Finalmente devolvemos nuestra cadena con los datos
return resultado;
Aqu podis ver lo que hace el mtodo convertStreamToString(InputStream is):

Este mtodo no lo he creado yo, lo he cogido de internet, los hay a patadas y es la mejor
solucin para pasar datos de unInputStream a String, es muy sencillo.
Bien, hemos ledo nuestro WebService y hemos almacenado su valor en la variable
resultado, ahora vamos a pasarlo ese resultado por nuestro mtodo filtrarDatos().

Limpiamos nuestro ArrayList, por si tuviese algo de informacin.


listaPersonas.clear();

Creamos una variable de tipo String "data" donde almacenaremos el resultado


obtenido al ejecutar la conexin al servidor
String data=mostrar();
Realizamos una condicin "if" por si data est vaco
if(!data.equalsIgnoreCase(""))
Creamos un objeto JSONObject donde le pasaremos por constructor la
informacin que obtuvimos de nuestroWebService almacenada en la variable de tipo String
"data".
JSONObject json = new JSONObject(data);
Posteriormente pasamos JSONObject a JSONArray, indicndole por parmetro
el nombre del array de nuestroJSON, en nuestro caso "persona".
JSONArray jsonArray = json.optJSONArray("personas");
Una pequea pausa, puedes observar en el WebService que he
creado que al json le daba un nombre de parmetro:
$json['personas'][]=$row;
Ese nombre, que va entre comillas simples y corchetes (personas),
es la referencia que le hago a JSONArray en su parmetro. Si se llamase coche, yo tendra
que poner coche en el parmetro JSONArray.
Bien, con esto tendramos almacenado en JSONArray diferentes objetos JSON,
cada uno con la informacin de cada fila de nuestra tabla, por lo que para ir recorriendo cada
uno deberamos utilizar un for, ya que en su esencia, lo que vamos a hacer es recorrer un
array.
for (int i = 0; i < jsonArray.length(); i++)
Una vez dentro del for, crearemos un objeto de tipo persona con cada ciclo del for
personas=new Persona();
Crearemos un objeto de tipo JSONObject por cada ciclo, recogiendo as todos los
datos que tenemos almacenados en JSONArray.
JSONObject jsonArrayChild = jsonArray.getJSONObject(i);
Una vez hecho esto, sera ir dndole a cada atributo de personas su
correspondiente valor

personas.setDni(jsonArrayChild.optString("dni"));
personas.setNombre(jsonArrayChild.optString("nombre"));
personas.setTelefono(jsonArrayChild.optString("telefono"));
personas.setEmail(jsonArrayChild.optString("email"));
Fijaos bien que cuando llamo a jsonArrayChild.optString("dni"), le vamos a
pasar a personas el valor almacenado en dni, e igual para los otros casos
Posteriormente agregamos el objeto personas a nuestro ArrayList
listaPersonas.add(personas);
Con esto ya tendramos los datos de nuestro servidor almacenados en objetos de tipo
personas que a su vez estn almacenados en un ArrayList, listos para ser mostrados por
pantalla, lo cual haremos con el mtodo mostrarPersona();

Bien, este mtodo no tiene mucha explicacin, leo los objetos almacenados en
nuestro ArrayList en la posicin que se le pasa por parmetro y lo muestro en
los Edittext.
Para ejecutarlo todo utilizaremos una clase AsyncTask

Y ejecutaremos nuestro AsyncTask al pulsar el botn mostrar:

Y, como opcional, para movernos entre nuestro datos, podis agregar los
botones "siguiente" y "previo"

Lo nico que hacen estos ltimos es sumar 1 a posicin (mas) o restar 1(menos)
NOTA: Agregar permisos de Internet si no lo tenis agregado.
Archivos para descargar: WebServiceJSONExample
Si tenis dudas u os atascis en algo, preguntar.
Un saludo

JUEVES, 16 DE OCTUBRE DE 2014

Tareas en 2 plano Android (Parte I): Clase AsyncTask


Buenas amigos, en este nuevo tema vamos a ver como manejar hilos en segundo plano
en nuestra aplicacin por medio de la clase AsyncTask. Esta clase nos permitir ejecutar
acciones en segundo plano como lo hacan en java los threads.
Bien, si eres nuevo en android pero conoces java es posible que te resulte un poco
complejo entender el sistema de hilos, ya que es totalmente diferente a como crebamos
un hilo en java, pero nada ms lejos de la realidad, veris que, explicando una sencillas
reglas y mostrando las diferentes fases por la que pasa un hilo en android, es tan fcil de
entender como un hilo en java.
Bueno, las reglas bsicas para crear una clase AsyncTask en android son:

La clase AsyncTask se debe crear como una clase interna de la clase donde
deseamos crear nuestro hilo.

NOTA: No os fijis en los componentes, solo en que es una clase interna.


La clase AsyncTask se instancia en nuestro hilo principal, es decir, fuera
del AsyncTask.

Para iniciar nuestro AsyncTask, debemos de invocar el mtodo execute() de la


propia clase.

Con esto, ya sabemos hacer que nuestra clase AsyncTask se ejecute en 2 plano, ahora
vamos a ver las fases por las que pasa nuestro AsyncTask una vez empieza a
ejecutarse:
La clase AsyncTask tiene varios mtodos que podemos sobreescribir en los que
podemos definir:

Que hacer antes de iniciar la tarea en 2 plano


Que hacer durante la tarea en 2 plano
Que hacer despus de ejecutar la tarea en segundo plano.
Veamoslos:
onPreExecute(): Este mtodo realiza las acciones que le indiquemos antes de
iniciar la tarea en 2 plano.
doInBackground(Params...): Este mtodo es el mtodo principal de
nuestro AsyncTask. Es el encargado de ejecutar nuestro cdigo en 2 plano. Es obligatorio
ponerlo, si no lo ponis, os coses a errores y warning
onPostExecute(Result...): Este mtodo realiza las acciones que le indiquemos
despus de ejecutar la tarea en segundo plano.
onCancelled(): Este mtodo cancela nuestro AsyncTask.
onProgressUpdate(progres...): Va recogiendo el progreso de nuestro AsyncTask.

Bien, estos mtodos no se invocan fuera del AsyncTask, son internos, nosotros para
ejecutarlos solo debemos invocarexecute() y la propia clase los va ejecutando.

Bueno, una cosa que an no he comentado es el uso de genricos en esta clase (Si no
estas seguro de lo que son los genricos te recomiendo dos cosas: 1 visitar este enlace y
lo 2 es que estudies ms el temario bsico de java).

Podis observar que despus de heredar de AsyncTask coloco 3 tipos de genricos,


bien, esto va a ser el tipo de devolucin de nuestros mtodos (String, Integer, Float....),
aunque si pongo Void, le estoy indicando que no quiero tener ningn tipo de retorno, ya
sabis que los mtodos tipo void, no retornan nada.
El primer genrico nos indica el tipo de devolucin que tendr el
mtodo onPostExecute()
El segundo genrico nos indica el tipo de devolucin que tendr el
mtodo onProgressUpdate()
El tercer genrico nos indica el tipo de devolucin que tendr el
mtodo doInBackground().
Otra cosa que quiero dejar clara, es los parmetros que tienen algunos mtodos de esta
clase, por ejemplo, el mtododoInBackground tiene su argumento formado de la
siguiente manera (Void...params), esto quiere decir que acepta cualquier nmero de
valores, desde ninguno hasta los que necesitemos. En caso de de llevar cierto numero de
valores, se deberan de cargar como un array:
params[0], params[1], etc
A estos mtodos se les llama "mtodos con argumentos variables" y es algo que
deberais conocer.
Bien amigos, este tema no tiene mucha ms historia, si tenis alguna duda u os atascais
en algo, preguntar.
Un saludo.

JUEVES, 16 DE OCTUBRE DE 2014

Tareas en 2 plano Android (Parte II): Clase TimerTask


Buenas amigos, en el tema anterior estuvimos hablando de como realizar una tarea en
segundo plano con la ayuda de la claseAsyncTask. En este nuevo tema vamos a ver
como funciona la clase TimerTask y sus diferencias con AsyncTask y nos va a resultar
menos compleja de entender ya que nos va a resultar ms familiar que AsyncTask.

Bien, esta clase se caracteriza por hacer repeticiones del hilo continuamente cada X
segundos, es decir, funciona como un temporizador pudiendole indicar cuando queremos
que inicie y cada cuanto tiempo queremos que se repita, estas repeticiones van a ser
infinitas, es decir, una vez ejecutemos el hilo no parar de ejecutarse hasta que nosotros
se lo indiquemos
Anteriormente, en java, para hacer esto con los threads, creabamos un bucle
infinito (while, for...) y por medio del mtodosleep() le indicabamos cada cuanto tiempo
haciamos una repeticin, bien, TimerTask funciona ms o menos de la misma forma pero
por si sola, no hace falta poner sleep() ni nada parecido.
Bien, sabiendo esto, una clase TimerTask se construye de la misma forma que
una AsyncTask, es decir, como una clase interna:

Podemos observar, que efectivamente se construye como una clase interna


de TimerExample y, a diferencia de AsyncTask, no utilizamos ni genricos, ni mtodos
especiales que se ejecuten antes y/o despus de realizar nuestra accin en segundo
plano, aqu solo tenemos un mtodo run() en el que poner nuestro cdigo a ejecutar en
segundo plano.

Una vez creada nuestra clase interna TimerTask, vamos a hacer que funcione, para ello
vamos a utilizar la clase Timer.

NOTA: Una cosa antes de continuar, en lineas anteriores mencionabamos


que TimerTask se encargaba de hacer repeticiones cada X segundos y que se iniciaba
cuando nosotros se lo indicbamos, pues bueno, eso no es del todo cierto, quien
realmente realiza esa funcin es la clase Timer, que vamos a ver ahora, TimerTask solo
es el recipiente de nuestro cdigo en segundo plano, pero realmente es Timer quien lo
ejecuta. Recordarlo bien, ya que en lineas anteriores no os quera confundir y por eso
hago esta aclaracin ahora.
Bien, aclarado lo anterior, vamos a instanciar un objeto de la clase Timer y pasarle
nuestro AsyncTask para ejecutar el hilo:

Creamos un atributo de la clase Timer:


private Timer timer;
En nuestro mtodo onCreate() lo instanciamos:
timer=new Timer();
Creamos un objeto de nuestra clase AsyncTask:
SubTimerExample sub=new SubTimerExample();
Ahora le pasamos al mtodo scheduleAtFixedRate() de timer el TimerTask a
ejecutar (sub), cuando lo queremos ejecutar (0) y cada cuanto tiempo se va a repetir en
milisegundos (5000):
timer.scheduleAtFixedRate(sub, 0, 5000);
Y ya est, con esto tenemos nuestro timer ejecutando a nuestro TimerTask cada X
segundos, en caso de querer cancelar nuestra tarea en segundo plano utilizaremos los
siguientes mtodos de la clase Timer, OJO, es la clase Timer la que cancela el hilo, no
la TimerTask:

void cancel(): Cancela nuestro timer:


timer.cancel();
int purgue(): Remueve todos los timers cancelados de la pila de memoria.
Importantisimo para controlar el consumo de memoria de nuestra app.
timer.purge();
Estos 2 mtodos junto con el mtodo scheduleAtFixedRate(), son los ms utilizados por
esta clase.
Bien chicos, como podeis observar, estas clases son tan iguales como distintas, las
Asynctask por un lado te permiten hacer ms acciones mientras se ejecuta la tarea en
segundo plano y nos viene bien para hacer Dialogs, ProgressDialogs y cosas as,
mientras que Timer nos viene bien por si queremos actualizar nuestra activity cada X
segundos, o hacer alguna comprobacin de servidor cada X segundos, aunque para esto
ltimo es mejor usar los servicios, que explicar pronto, an as, sois vosotros los que
finalmente decidiris cual de las dos se adapta ms a vuestra situacin.
Bien amigos, eso es todo, si tenis alguna duda u os atascais en algo, preguntar.
Un saludo.

You might also like