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 petición popular, y a la cantidad de email que me han mandado pidiéndome información para realizar conexiones a Mysql desde android, voy a realizar este tema.



Bien, el tema en sí es complejo, ojo, no difícil de entender, si no complejo de realizar, vamos a realizar mucho código para lo que realmente necesitamos, interactuar con una base de datos mysql en un servidor.

Si habéis hecho conexiones a mysql desde java sabréis que con una clase que contenga 4 o 5 lineas de código podíamos realizar nuestra conexión a mysql, podéis comprobarlo aquí, posteriormente solo teníamos que manejar los datos obtenidos (7 u 8 lineas) y ya podíamos mostrar resultados en nuestro programa. Bien, esto en android cambia y se vuelve más complejo ya que, por seguridad, deberemos crear un webservice para que nos sirva de puente entre nuestra aplicación y nuestro servidor.

Un Webservice suele ser un archivo PHP que recibe peticiones de nuestra app y se las envía 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 entendáis mejor.


Un WebService no tiene porque ser un archivo PHP, también podríamos realizar en nuestro servidor un programa en java que escuche por socket nuestra app y pasarle parámetros para que se comunique con el servidor, o podríamos crear un archivo javascript, o cualquier otra cosa que nos valga para comunicar nuestra app con nuestro servidor, pero ya digo, que lo más fácil, rápido y sencillo es un archivo PHP, no os compliquéis.

Bien, para crear la conexión 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
      • Teléfono--Varchar
      • Email.--Varchar
  • Uno o varios WebService (según necesitemos). Yo voy a utilizar 2:
    • Insert.php
    • selectAll.php
  • Una conexión mediante la clase HttpClient de la API de Apache
    • No hay que agregar librerías, esta API va incluida en el repositorio android.
  • Ejecutarlo todo mediante hilos AsyncTask.
    • A partir de la versión 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:


    Podéis 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 diseño, 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 método que envíe la información que introducimos en los campos a nuestro WebService para que este se lo comunique al servidor y obtener una respuesta.



    Bueno, no os asustéis de ver tanta linea, ante todo saber que solo trabajamos con 2 clases y un ArrayList:
    • HttpClient: Clase encargada de enviar la información almacenada en httpPost a nuestro WebService.
    • HttpPost: almacena los datos que serán 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 móvil, 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, tendrás 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 tamaño (4) ya que son el número 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 según el tamaño 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 información de nuestro ArrayList, hacemos que HttpClient lo envíe:
      • httpclient.execute(httppost);

    Bueno, no era tan difícil, si un poco complejo, pero no difícil.

    Bien, ya hemos enviado nuestra información 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 sería de la siguiente manera:
    • Rellenamos las variables del localhost con la información de nuestro servidor:
      • Hostname: Nombre del host.
      • Database: Nombre de nuestra base de datos.
      • Username: Nombre de usuario del servidor.
      • Password: Contraseña 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 aplicación 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 follón 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 conexión.
      • mysql_close($localhost);
    Bien, ya tenemos el código 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 aún nos queda un último paso, realizar la consulta por medio de una clase AsyncTask.

    NOTA:No voy a hacer aquí una explicación sobre el funcionamiento de una clase AsyncTask, ya que me quedaría muy extenso el post, en el futuro crearé un tema para esta clase. En google puedes encontrar mucha información sobre esta clase.

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


    Bien, en el método doInBackground creamos una condición if, en el cual introducimos como condición el método insertar() (por esa razón lo hice booleano) si se los datos han sido insertados, el método nos devuelve true y nos muestra un Toast con el éxito de la operación y limpiando nuestro formulario, todo esto debe correr en un hilo ya que si no bloquearía nuestro AsyncTask y nos funde a errores, si los datos no han podido ser insertados, el método 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 método para conectar con nuestro WebService. Bien!
    • Una clase AsyncTsk que ejecuta nuestro código. Bien!
    Solo nos falta ir al botón insertar y darle una acción, para cuando se pulse ejecute todo al mismo tiempo.


    Finalmente ya lo tenemos, cuando pulsemos nuestro botón comprobará que no haya ningún campo vacío, 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.


    También os dejo la clase, el archivo .xml y el webservice en este enlace:

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

    PD: No he mencionado nada de encriptación (MD5, Base64...) o los certificados SSL, quiero hacer una entrada acerca de la seguridad.

    Continuaremos la lección en la PARTE 2.

    Un saludo.



    105 comentarios:

    1. Haz por favor el de botón mostrar amigo por favor te lo agradeceria

      ResponderEliminar
      Respuestas
      1. Buenas Andrés.

        El botón "mostrar" esta hecho:

        http://picarcodigo.blogspot.com.es/2014/05/webservice-conexion-base-de-datos-mysql.html

        También te pueden interesar el botón "Update"y el botón "Borrar", los puedes encontrar aquí

        http://picarcodigo.blogspot.com.es/p/tutoriales-avanzados-android.html

        Por ahora no voy a hacer ningún tema nuevo hasta que termine el proyecto que estoy haciendo. Lo siento, pero me ocupa demasiado tiempo.

        Un saludo, avísame si necesitas algo más.

        Eliminar
      2. Muchas gracias Bartolomé tienes tutoriales muy didácticos que nos ayudan a los que nos iniciamos en este mundo del desarrollo para android

        Eliminar
      3. Estimado, no pasa al error en caso de no insertar

        Eliminar
      4. cierto como hacemos para que aparesca el error??

        Eliminar
      5. Hola yo tengo un problema es el siguiente:
        java.net.sockettimeoutexception failed to connect to http://10.0.3.2/ (port 80)

        estoy ocupando XAMP phpMyadmin, la URL donde se mandan los datos todo esta bien pero no me pasa de esa parte, me podrías ayudar

        Eliminar
      6. @Bartolomé Abellán Sera que lo puedas hacer en Spring los Rest, mysql y android? necesito ayuda :( estoy atorado

        Eliminar
    2. como le haria para descargar imagenes , y actualizarlas dese un web service
      estoy haciendo un tipo catalago y me gustaria q se coencte a un web y este le mande las imagenes de los articulos en existencia, y queden guardados en el cel , asi como tambien los elimine si el articulo no esta disponible

      ResponderEliminar
      Respuestas
      1. te funciono ? -- me pasa lo mismo compadre, me dice insertado pero en la BD no me aparece nada Saludos

        Eliminar
    3. hola, el tuto excelente, al fin alguien explica como la gente, Gracias

      ahora... hice todo pero no me funciona! Cuando le doy guardar desde la app del cel me dice como que la operacion fue exitosa pero en la bd no me aparece nada, que puede ser?

      Si intento acceder al insertar.php desde mi cel a travez de la ip de mi maquina directamente desde el brouser no me deja, me da acceso restringido, quiza esto tenga algo que ver, saludos

      ResponderEliminar
    4. Hola, muy bueno el post! mi pregunta es: no hay manera de hacerlo con un JDBC o algo por estilo sin la necesidad de enviar los datos mediante POST a través de un script PHP?

      ResponderEliminar
      Respuestas
      1. Si lo haces a través de JDBC puedes tener problemas de seguridad. Mira este post.
        http://stackoverflow.com/questions/12233145/connecting-to-mysql-from-android-with-jdbc

        Eliminar
      2. Buenas a todos, estoy trabajando como un chino estas vacaciones y no os puedo dedicar tiempo.

        La cosa es que Canals tiene toda la razón, vas a tener muchos problemas de seguridad, y creo, solo creo, que a partir de la versión 3 no es posible hacer conexiones JDBC entre Android y Mysql, esto es debido a que oracle es poseedora de Mysql y no quiere dar soporte a Android porque esta enfrascada en juicios con Google por el tema de que Android utilice librerías Java y Oracle no ve un duro, por esta razón Mysql y Android no se llevan bien y tenemos que utilizar WebServices para realizar nuestras conexiones.

        Entre esta disputa de Oracle y Google y que una conexión directa via JDBC puede hacer que tu seguridad este comprometida (NO olvidemos que android funciona por wifi o red de datos, por lo tanto nuestros datos están siempre en el aire siendo transportados por ondas y cualquiera con pocos conocimientos en la materia te podría sacar contraseñas), lo mejor y más seguro para conectar Android y Mysql es utilizar WebServices como explico en este tema.

        PD: También deberías utilizar cifrados de datos (MD5 Base64....) y certificados SLL para hacer aún más seguras tus conexiones, pero aún no he hecho un tema sobre ese asunto, así que si quieres más info busca en San Google, cuando tenga tiempo haré un post de Android y su seguridad.

        Un saludo.

        Eliminar
    5. Excelente explicación Gracias por el aporte

      ResponderEliminar
    6. hola muy buen aporte, una ayuda, al ejecutar con la ip local de mi pc me funciona, pero si cambio de red wifi a otra la ip se cambia automatico de la pc y tengo que cambiar la ip en la aplicacion android, probé que me funcione instalando el apk a un celular y no me devuelve nada, quisiera saber como haria para que mi aplicacion android se conecte al servidor con cualquier conexion wifi??
      Te lo agradecería mucho, es para mi proyecto

      ResponderEliminar
      Respuestas
      1. Buenas, si tienes montado un servidor con localhost solo te va a funcionar mientras estés conectado a la misma red que el servidor.

        Para conectarte con cualquier dispositivo, debes hacer público tu servidor, con tu propio dominio o con alguno gratuito que te permita instalar mysql y php (no todos te dejan), una vez hecho publico, deberías de poner la url del servidor publico a tu app android y ya podrías acceder a él desde cualquier dispositivo y/o red.

        Un saludo.

        Eliminar
    7. Gracias por tu aporte, me ayuda muchísimo, pero tengo una duda:
      En un hosting real, el archivo php debe estar dentro de public_html? o se puede crear una carpeta dentro del File Manager y ponerlo ahi?
      Saludos.

      Eduardo.

      ResponderEliminar
    8. el de arriba usas hostinguer verda yo tambn qro conectarm desde mi cel en un servidor en internet

      ResponderEliminar
    9. muy buena la información gracias, ahora tengo un problema con el emulador manda la información a la base de datos pero ya usando la aplicación en el celular dice que subió con éxito los datos sin embargo en la base de datos no aparece nada, como puedo solucionarlo? y como podría mandar la información con un spinner a la base de datos?

      ResponderEliminar
    10. Muy bueno el tutorial Bartolomé.
      Estoy atrancado en el proceso de dirigir con una dirección IP el scrip php. Estoy usando el emulador de eclipse y pongo la dirección que pusiste (10.0.0.2)


      Tengo que crear un servidor local con, por ejemplo WAMP??
      No es posible incrustar el php dentro del proyecto de android sin necesidad de direccionarlo?

      Muchas gracias de antemano

      ResponderEliminar
    11. Muy bueno el tutorial Bartolomé.
      Estoy atrancado en el proceso de dirigir con una dirección IP el scrip php. Estoy usando el emulador de eclipse y pongo la dirección que pusiste (10.0.0.2)


      Tengo que crear un servidor local con, por ejemplo WAMP??
      No es posible incrustar el php dentro del proyecto de android sin necesidad de direccionarlo?

      Muchas gracias de antemano

      ResponderEliminar
      Respuestas
      1. Buenas Antonio;

        La cosa es que la dirección del emulador no es 10.0.0.2, es 10.0.2.2....sorry por mi parte :P

        El php va al servidor, siempre, porque es en el servidor donde esta la BD.

        No se que proyecto estas realizando, pero, quizas, te venga mejor utilizar una base de datos incrustada en tu app (SQLite es la base de datos que utiliza android)

        Pero si lo que quieres es tener una base de datos que intercambie datos entre distintos usuarios, si, necesitas un servidor wamp (funciona solo en windows), Lamp(funciona solo en linux) o xamp(funciona en ambos y es el que yo utilizo) e incrustar ahí tus php.

        Un saludo.

        Eliminar
      2. ola amigo oye tengo una pregunta ya hice todo lo que documentaste pero ahora, lo corro en mi celular y el botón no realiza nada ninguna acción, intente agregar ala barra de propiedades en el onclick , buscando el método pero no lo encuentra me gustaría que me dijeras si agregaste algo en la propiedad del onclick del botón para que realice la acción. Gracias

        Eliminar
    12. muchas gracias por la informacion muy bien preparado Bartolome abellan un saludo desde bolivia

      ResponderEliminar
    13. Este comentario ha sido eliminado por el autor.

      ResponderEliminar
    14. gracias por el aporte. si quisiese enviar de una sola ves varios objetos Persona para almacenarlos? para enviar 2, 3 o la cantidad que se requiera. hay algun tutorial que trate del tema? Gracias

      ResponderEliminar
    15. Hola muy bueno tu aporte de casualida no tienes un ejemplo de como conectar un webservices en visual studio a una base de datos en mysql y que el web services sea consumido por una aplicacion de escritorio todo programado en c# porfa se te agradece y saludos

      ResponderEliminar
    16. Hola, mi pregunta es si tienes algún tutorial para alguien con menos experiencia en cuestión de la creación de webservice loca, que complementos y programas, configuraciones ect. te lo agradecería mucho..

      ResponderEliminar
    17. Esta muy bien explicado tu Tutorial, me funciono a la primera con mi propia base de datos :D
      Gracias por compartir el conocimiento... Saludos desde Bolivia

      ResponderEliminar
    18. Respuestas
      1. ola amigo te quedo esa aplicación como agregaste la acción al botón por que ami no me hace nada el botón.

        Eliminar
    19. Hola, yo hice una pagina web (mapa) y esta tiene marcadores que funcionan mediante una BD. Quisiera saber como usar un Toast mediante un webview... Es decir, al momento de entrar a mi pag mediante el webview y de clic en un marcador, los datos del marcador se muestren en un toast... Help me please!

      ResponderEliminar
      Respuestas
      1. Se me olvido mencionar, que el webview lo hice de forma local... Espero que me puedas ayudar =)

        Eliminar
    20. A mi no me hace nada al pulsar insertar. Sabéis que puede ser?

      ResponderEliminar
    21. Disculpa el boton mostrar no funciona no los imagenbutton e inserta pero los datos que manda son "Array" podrias ayudarme

      ResponderEliminar
    22. Hola una pregubtota como y con que hiciste el servidor muchas gracias de antemano

      ResponderEliminar
    23. hola una consulta porfavor, vajo este metodo de conexion a webservice como se hace para verificar la existencia de una persona???

      ResponderEliminar
    24. Me sale el mensaje confirmando que insertó los datos correctamente pero al revisar la base de datos no hay nada, mi pregunta es: que archivo debo revisar? el insertar.php o que linea de comando de la aplicación? o algún otro lado?

      Please!!!

      PD: muy bueno el tutorial :)

      ResponderEliminar
    25. Buenas , antes que nada muchas gracias por el tutorial, me sirvio mucho, pero tengo un incoveniente.
      Ya probé el programa y funciona muy bien en mi casa donde tengo una ip dinamica, no tengo ningun proxy ni nada por el estilo.

      Pero en mi trabajo donde se maneja la red donde cada dispositivo tiene una ip estatica y hay un servidor proxy no funciona, no me llegan los datos, que se tendría que configurar para que puedan llegar?

      Si en mi navegador pongo una vez conectado a la red de mi trabajo , la direccion local host y donde se encuetra mi base de datos, si funciona el php ya que me solicita que mande, nombre, dni, telefono, etc. y me introduce en la tabla una fila en blanco, pero entonces me imagino que se tiene que poner algo en el codigo, o que pudiera ser?

      ResponderEliminar
      Respuestas
      1. Agrega estalinea En Grandle.properties:
        systemProp.http.nonProxyHosts=*.local;192.168.*.*;localhost
        y en tu celular configura el proxyy en omitir proxi para colocas tu IP

        Eliminar
    26. muy bueno el post, bueno soy nuevo en esto y la verdad es que hay parte del codigo que me lo tacha como puedo solucionarlo ???

      ResponderEliminar
    27. por que no funciona con un servidor proxy

      ResponderEliminar
    28. excelente post. gracias saque adelante mi proyecto. un GPS que envia latitud y longitud a un servidor conectado a a una ip publica. gracias oscar j

      ResponderEliminar
    29. Hola
      tengo un problema y el log de Android me arroja lo siguiente... podrías darme una mano por favor? gracias.


      11092/matias.modulos.webservice E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
      Process: matias.modulos.webservice, PID: 11075
      java.lang.RuntimeException: An error occurred while executing doInBackground()
      at android.os.AsyncTask$3.done(AsyncTask.java:309)
      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
      at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
      at java.util.concurrent.FutureTask.run(FutureTask.java:242)
      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
      at java.lang.Thread.run(Thread.java:818)


      y sigue...

      ResponderEliminar
      Respuestas
      1. Buenas Matias, necesito el "y sigue", lo que me has pegado me indica lo que ha ocurrido, pero no por que ha ocurrido.

        Un saludo

        Eliminar
      2. Este comentario ha sido eliminado por el autor.

        Eliminar
      3. Este comentario ha sido eliminado por el autor.

        Eliminar
      4. Estimado Bartolomé, informo que en parte está resuelto el inconveniente. El tema era que no tenía configurado correctamente el manifiest, estaba colocando mal la versión del SDK



        Ahora sale el cartel avisando que se introducieron los datos correctamente, pero no se ven reflejados en la BBDD...

        Saludos

        Eliminar
      5. Buenas Matias;

        Comprueba que tienes permiso de lectura y escritura en tus carpetas del servidor. Es posible que el problema este ahi, con lo que te sale el mensaje de insertado con exito, pero no te inserta nada en la tabla.

        PD: tienes que mirar los permisos donde tengas puesto tu php, de todas maneras, revisa que las carpetas en la que marcas tu ruta donde esta tu php,, tambien posee permisos. Algunas veces me ha resultado que la carpeta donde tengo mi php si tiene permisos, pero la carpeta donde esta introducida tu carpeta con php no los tiene, es decir, si tu tienes la ruta "carpeta1/carpetaphp/tuphp.php", comprueba los permisos de "carpeta1 y carpetaphp"
        Un saludo. Suerte.

        Eliminar
      6. Este comentario ha sido eliminado por el autor.

        Eliminar
      7. Estimado, gracias por tu respuesta.
        Los permisos que tengo en las carpetas de mi servidor son 755, y también los archivos php.

        En este momento el único error que me arroja el log es el siguiente,

        10-07 14:48:58.825 7760-7774/matias.modulos.webservice E/Surface﹕ getSlotFromBufferLocked: unknown buffer: 0xab6d4920

        estuve investigando pero no pude dar con la solución, espero puedas darme una última ayuda! gracias por tu tiempo

        Eliminar
    30. Este comentario ha sido eliminado por el autor.

      ResponderEliminar
    31. Hola que tal primeramente un gran gran aporte , quisiera ver si me podrias ayudar a conectarlo con mi base de mi dominio ya que me manda este error
      10-08 15:35:34.140 12390-12390/com.webserviceexample D/Atlas﹕ Validating map...
      10-08 15:35:34.180 12390-12405/com.webserviceexample D/﹕ HostConnection::get() New Host Connection established 0x7fe4638bc760, tid 12405
      10-08 15:35:34.260 12390-12405/com.webserviceexample I/OpenGLRenderer﹕ Initialized EGL, version 1.4
      10-08 15:35:34.290 12390-12405/com.webserviceexample W/EGL_emulation﹕ eglSurfaceAttrib not implemented
      10-08 15:35:34.290 12390-12405/com.webserviceexample W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0x7fe4638bbe80, error=EGL_SUCCESS
      10-08 15:35:36.940 12390-12397/com.webserviceexample W/art﹕ Suspending all threads took: 10ms
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ org.apache.http.conn.HttpHostConnectException: Connection to http://50.62.160.77 refused
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:188)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at com.webserviceexample.MainActivity.insertar(MainActivity.java:94)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at com.webserviceexample.MainActivity.access$400(MainActivity.java:30)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at com.webserviceexample.MainActivity$Insertar.doInBackground(MainActivity.java:119)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at com.webserviceexample.MainActivity$Insertar.doInBackground(MainActivity.java:109)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:292)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at java.lang.Thread.run(Thread.java:818)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ Caused by: java.net.ConnectException: socket failed: EACCES (Permission denied)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:186)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ ... 16 more

      ResponderEliminar
    32. 10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ Caused by: java.net.SocketException: socket failed: EACCES (Permission denied)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at libcore.io.IoBridge.socket(IoBridge.java:623)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at java.net.PlainSocketImpl.create(PlainSocketImpl.java:198)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at java.net.Socket.checkOpenAndCreate(Socket.java:687)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at java.net.Socket.connect(Socket.java:847)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:124)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:149)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ ... 16 more
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ Caused by: android.system.ErrnoException: socket failed: EACCES (Permission denied)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at libcore.io.Posix.socket(Native Method)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:282)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ at libcore.io.IoBridge.socket(IoBridge.java:608)
      10-08 15:35:42.610 12390-12406/com.webserviceexample W/System.err﹕ ... 21 more
      10-08 15:35:42.680 12390-12405/com.webserviceexample W/EGL_emulation﹕ eglSurfaceAttrib not implemented
      10-08 15:35:42.680 12390-12405/com.webserviceexample W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0x7fe46390dd40, error=EGL_SUCCESS

      ResponderEliminar
    33. revise en mi dominio y si tiene permisos de lectura y escritura la carpeta ademas de que use netbeans para editar el php y funciona bien, también por dafaul es obligatorio poner contraseña al acceso, espero me puedan aydar, muchas gracias

      ResponderEliminar
    34. Excelente tutorial!!!!! Muchas Gracias eres un crack Saludos

      ResponderEliminar
    35. Hola, como debo poner el la direccion ("ADRESS") del local host si yo hago las pruebas en mi telefono android?

      ResponderEliminar
    36. al momento de instalarla en el telefono no registra yo uso wamsever como seridor local
      http://192.168.1.7:8080/tienda_milton/tipoproducto.php

      ResponderEliminar
    37. Hola, y se podría usar Internet Information Services para conectar android con mysql?

      ResponderEliminar
    38. Me da error en if(insertar()) amigo, como lo soluciono?

      ResponderEliminar
    39. Este comentario ha sido eliminado por el autor.

      ResponderEliminar
    40. Disculpen mi ignorancia alguien me puede decir donde va pongo el archivo insert.php... muchas gracias

      ResponderEliminar
      Respuestas
      1. si es en xampp

        C:\xampp\htdocs


        lo guardas en la carpeta htdocs y abres tu navegador

        http://localhost/insertar.php

        Eliminar
    41. realmente tus tutoriales son buenos, me ayudaron bastante , muchas gracias por hacer explicaciones tan detalladas sigue asi

      ResponderEliminar
    42. Hola amigo buen tutoria, quería preguntarle si tienes algún tutorial donde a la hora de insertar los datos me valide si ese dato ya existe o no

      ResponderEliminar
    43. Hola amigo buen tutoria, quería preguntarle si tienes algún tutorial donde a la hora de insertar los datos me valide si ese dato ya existe o no

      ResponderEliminar
    44. Hola Bartolomé Abellán. Gran trabajo y muy bien explicado! Tengo una duda. Yo estoy trabajando con Android Studio y no sé si se necesita importar alguna librería, ya que salta error en "HttpClient" y "HttpPost". Muchas gracias!!

      ResponderEliminar
    45. Hola buen día Bartolomé Abellán, me parece un interesante tutorial y es justamente lo que estaba buscando. Lo he estado tratando de implementar hace muchos días, pero tengo el mismo problema de JOMUAL13 que escribe el 19 de enero de este año. Ya descarge los archivos HttpClient y otros más, pero no se como importarlos a Android para que sean reconocidos y no dé error en: "HttpClient" y "HttpPost".
      Muchas gracias de antemano por tu atención y por el Tutorial que esta muy bueno.

      ResponderEliminar
    46. Buenas noches disculpe tengo un inconveniente todo el proceso esta bien al momento de ingresar los datos no me guardar en la base de datos.
      tengo la duda en donde colocar el insertar.php

      ResponderEliminar
      Respuestas
      1. Buenas Leidy

        En tu servidor XAMPP, LAMP o WAMP (no se cual tienes) hay una carpeta denominada htdocs ahí es donde lo tienes que poner.

        Yo por ejemplo, tengo, en mi servidor XAMPP (este es el que utilizo), dentro de htdocs una carpeta denominada picarcodigo y ahi meto mis archivos php. Su estructura sería:

        XAMPP/htdocs/picarcodigo/cualquier_archivo.php y para llamarlo desde una url como servidor sería:

        wwww.nombre_host.com/picarcodigo/cualquier_archivo.php donde nombre_host puede ser localhost (si haces las pruebas a servidor desde tu propia red privada)o un nombre de dominio o ip si el servidor esta fuera de tu red privada. Imaginemos que yo tengo mi servidor alojado en el dominio con ip 62.43.58.147, mi url debería ser:

        62.43.58.147/picarcodigo/cualquier_archivo.php

        Un saludo, espero que te haya ayudado.

        Eliminar
    47. los estoy trabajando con un servidor xampp locamente pero me sale el mensaje ingresado con exito pero cuando voy a verificar en la base de datos . no se guarda

      ResponderEliminar
    48. Disculpa amigo como hago por que me sale error al escribir las clases de:
      HttpClient httpclient;
      List nameValuePairs;
      HttpPost httppost;
      httpclient=new DefaultHttpClient();
      httppost= new HttpPost("http://192.168.0.11/picarcodigo/insert.php");
      te agradeceria la respuesta

      ResponderEliminar
    49. antes que nada gracias!! me ayudo mucho, todo salio bien utilizando la direccion 10.0.2.2 para el emulador. pero si paso la aplicación a mi celular que dirección tengo que poner? tambien estoy utilizando el servidor xamp
      espero puedas ayudarme,

      ResponderEliminar
      Respuestas
      1. Hola Adriana esepero aun te sirva la respuesta: tendrias que poner la IP de la maquina donde esta instalado el servidor xamp puedes buscarlo de 2 maneras 1) directamente en tu modem (si es que tienes acceso) o en una ventana de comandos de windows pones ipconfig, si estas por wi fi busca la interfaz wireless y donde dice IPV4 esa es tu IP, si tu compu esta por cable busca la interfaz Ethernet he igual donde diga IPV4, esa seria la IP que tendrias que poner. Espero te ayudara saludos

        Eliminar
    50. Brother antes que nada muchas gracias por tu aporte, la verdad me sirvio mucho lo tuve que modificar a como yo lo necesito pero tengo una duda es como se haría para no insertar datos repetidos...
      saludos y muchas gracias...

      ResponderEliminar
    51. Buenas tardes, alguien puede ayudarme yo lo estoy implementando en un servidor real y aparentemente todo es correcto pero no, al registrar una persona se muestra el toast "persona registrada con éxito" pero a la base de datos no llega la información

      ResponderEliminar
      Respuestas
      1. Hola, tengo el mismo problema, lo lograste solucionar? Yo aun no. Me podrias ayudar? Estoy usando hostinger.es
        Gracias

        Eliminar
    52. Hola muchas gracias por el tutorial esta muy muy bueno y bien explicado, al final comentas de una segunda parte donde usuarias certificados u encriptacion, donde puedo ver esta segunda parte ?? saludos

      ResponderEliminar
    53. Hola buenas, gracias por tu tiempo.
      Tengo un error, no me inserta en la base de datos y sin embargo no tira error de nada, no se que será, ya lo he revisado y el código está muy similar al tuyo. Será que me puedes ayudar un poco?

      Gracias.

      ResponderEliminar
    54. Hola me aparece el error unfortunately main has estoped.

      ResponderEliminar
      Respuestas
      1. Buenas, necesitas ser mas concreto, ese error puede producirse por varias razones, mirate el logcat, ahi te saldrá porque esta fallando y una descripción más especifica.

        Un saludo

        Eliminar
    55. Gracias por el tutorial :D
      Y en caso de que quiera poner un Int en nameValuePairs.add(new BasicNameValuePair(); como sería?? o es forzoso que esté en Srtring??
      Saludos ;)

      ResponderEliminar
    56. buen día amigo antes que nadas muchas gracias por compartir tu conocimiento muy buen proyecto

      ya tengo mi servidor pero mi maquina local pero al insertar registro me marca Persona no insertada con éxito segun ya tengo todo bien

      ResponderEliminar
    57. Hola que tal amigo me dice persona no insertada con exito al querer insertar corro el archivo php con un dato estatico y si insertar agradeceria tu apollo gracias.

      ResponderEliminar
      Respuestas
      1. Buenas, comprueba que la ruta este bien, que las variables se llamen igual, el webservice puede que no esté bien implementado, revísalo, revisa también que la base de datos este correcta...

        La verdad, te toca ir en plan detective para conocer el error ya que el que no te inserte la persona depende de muchos factores, revisa tu logcat, y si no ves nada claro compártelo por aquí y ayudarte en detectar el error

        Eliminar
    58. Hola sigo con el problema este es mi webservice:


      ResponderEliminar
    59. hola soy nuevo en esto gracias por un tuto muy claro pero comentarte que hice todo correctamente no me marca error alguno y aun asi al enviar los datos con el mensaje "Persona insertada con éxito" no manda nada a mi base de datos... me gustaria un apoyo porfavor...

      ResponderEliminar
    60. Ayudaaa por favor!!!!!
      La app me dice "persona insertada con exito" y voy a mi BD y no esta dicho registro.
      Que metodo es el que tengo que poner en el boton?
      Lo tengo asi:
      android:onClick="Insertar"

      ResponderEliminar
    61. Hola

      Muy bueno el ejemple si embargo existe un inconveniente. Si el usuario presiona 2 veces o más esta misma cantidad de veces se registra el envío. Traté de evitarlo dando el atributo de único al campo en la base de datos, esto soluciona el error pero el mensaje en la dispositivo android sigue siendo de ¡ Persona insertada con éxito !

      ResponderEliminar
    62. disculpa y la parte de la consulta?

      ResponderEliminar
    63. Buenas tardes! Saludos desde Venezuela!
      Una consulta... si en vez de conectarlo de manera local (localhost) lo conecto con un hosting... que datos debo cambiar? me explico: Tengo un hosting con www.servicioshosting.com y quisiera enviar y almacenar datos desde la aplicación móvil a las bases de datos manejadas en phpmyadmin del hosting, pero no he conseguido hacerlo. Agradecido de antemano con toda la aydua que me puedas prestar. Saludos fraternos!

      ResponderEliminar
    64. buen tutorial pero tengo problemas con el if(insertar()), no se como solucionarlo. Gracias.

      ResponderEliminar
    65. una consulta muy importante ..... es necesario poner la dirección ip para hacer solicitudes usando httppost ?porque cuando pongo en ves de mi ip el localhost no me aparece nada ya deja de comunicarse con la base de datos ..
      httppost= new HttpPost("http://10.127.127.1/webservice/mostrar.php"); // aka se comunica
      httppost= new HttpPost("http://localhost/webservice/mostrar.php"); // aka ya no nada

      ResponderEliminar
    66. Disculpa amigo tengo un problema soy nueva en esto, quisiera saber Como conectar mi base de datos CSV a google maps por medio de android studio para que me las muestre con marcadores. Podrías ayudarme?

      ResponderEliminar
    67. yo estoy estudiando programación :p y estamos viendo android pero mi profesor quiere que la conectemos en una base de datos access la aplicación android este método funcionaria conectarla con jdbc:obc: ?
      yo la hice así como lo tiene usted pero rechazo mi código por que no es una base de datos access xd
      podría explicar como hacerlo en un futuro blog ?

      ResponderEliminar
    68. Amigo si necesito hacer un webservice pero sqlite

      ResponderEliminar
    69. Amigo creo que mi error se encuentra en el archivo php, especificamente en el $hostname_localhost, lo digo porque tengo mi propio servidor con mi ip, asi que quiero saber que debo de poner en mi caso, gracias por contestar de antemano

      ResponderEliminar
    70. Tengo que felicitarte! Has echo una muy buena explicacion, me has has ayudado mucho en un proyecto que estoy haciendo, totalmente útil tu explicacion, gracias!

      ResponderEliminar