Android, json, php y mysql (Enviar datos post a un servidor php desde android)

domingo, 10 de abril de 2011


Descripción
Pantalla de Login en dispositivo Android que valida usuario/contraseña a través del método Post contra un Servidor Web Php y base de datos MySql.
El intercambio de datos entre el Cliente (Android) y el Servidor Web (Php) se realiza a través de JSON.


Arquitectura




Glosario de terminos
JSON
JSON, acrónimo de JavaScript Object Notation, es un formato ligero para el intercambio de datos.
JSON es un subconjunto de la notación literal de objetos de JavaScript que no requiere el uso de XML.

Android
Android en un Sistema Operativo además de una plataforma de Software basada en el núcleo de Linux.
Diseñada en un principio para dispositivos móviles, Android permite controlar dispositivos por medio de bibliotecas desarrolladlas o adaptados por Google mediante el lenguaje de programación Java.
Android es una plataforma de código abierto.

Php
PHP es un lenguaje de programación interpretado, diseñado originalmente para la creación de páginas web dinámicas.

MySql
MySQL es un gestor de base de datos sencillo de usar y increíblemente rápido. También es uno de los motores de base de datos más usados en Internet, la principal razón de esto es que es gratis para aplicaciones no comerciales.

WampServer 2
WampServer es un paquete para el desarrollo de sitios web dinámicos para Windows que combina las últimas versiones del servidor Apache, de la base de datos MySQL y del lenguaje de programación PHP.

Más información y descarga:
Eclipse Java Helios
Entorno de desarrollo para implementar aplicaciones que se ejecutan en dispositivos Android.

Más información y descarga: http://www.eclipse.org/downloads/
Android SDK
Android SDK es el kit de desarrollo necesario para programar e implementar todo tipo de aplicaciones para Android, el sistema operativo para teléfonos móviles propuesto por Google.
Este paquete o kit de desarrollo incluye las APIs y herramientas necesarias para desarrollar aplicaciones utilizando JAVA como lenguaje de programación.

Más información y descarga: http://developer.android.com/sdk/index.html
DroidDraw
DroidDraw es una herramienta de diseño gráfico de GUIs para Android

Más información y descarga: http://www.droiddraw.org/


Requisitos de Software
·         Eclipse Java Helios
·         SDK Android
·         WampServer 2
·         DroidDraw



Móvil
Interface (*.xml)
Desarrollamos una pantalla de Login con tres elementos básicos:
  • Dos cajas de texto: EditText
  • Un botón:  Button
xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget29"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
> 
<EditText
android:id="@+id/txtUsuario"
android:layout_width="177px"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_x="120px"
android:layout_y="82px"
> 
EditText>
<TextView
android:id="@+id/lblUsuario"
android:layout_width="wrap_content"
android:layout_height="21px"
android:text="User"
android:layout_x="40px"
android:layout_y="102px"
> 
TextView>
<TextView
android:id="@+id/lblContrasena"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Password"
android:layout_x="40px"
android:layout_y="152px"
> 
TextView>
<EditText
android:id="@+id/txtPass"
android:layout_width="178px"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_x="120px"
android:layout_y="142px"
> 
EditText>
<Button
android:id="@+id/btnValidar"
android:layout_width="116px"
android:layout_height="44px"
android:text="Validar"
android:layout_x="180px"
android:layout_y="202px"
> 
Button>
AbsoluteLayout>

Actividad (*.java)
Está compuesto por dos clases:
  • Clase pública Inicio.java:  Se encarga de cargar la pantalla login.xml y de implementar el escuchador de eventos (OnClickListener) para poder atender el click del botón validar.
  • Clase interna Post: Se encarga de gestionar el envío por método post de 2 variables de sesión, Usuario y Contrasena,  al Servidor  Web para comprobar que el usuario existe en nuestra base de datos.

package com.android;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;

import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class Inicio extends Activity {
EditText user;
EditText pass;
Button validar;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);

user = (EditText) findViewById(R.id.txtUsuario);
pass = (EditText) findViewById(R.id.txtPass);
validar = (Button) findViewById(R.id.btnValidar);

validar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ArrayList parametros = new ArrayList();
parametros.add("Usuario");
parametros.add(user.getText().toString());
parametros.add("Contrasena");
parametros.add(pass.getText().toString());
// Llamada a Servidor Web PHP
try {
                        Post post = new Post();
                        JSONArray datos = post.getServerData(parametros,
                                                                       "http://95.234.67.44/login.php");
// No se puede poner localhost, carga la consola de Windows
// y escribe ipconfig/all para ver tu IP
if (datos != null && datos.length() > 0) {
                        JSONObject json_data = datos.getJSONObject(0);
                        int numRegistrados = json_data.getInt("ID_USUARIO");
if (numRegistrados > 0) {
                        Toast.makeText(getBaseContext(),
                                                                       "Usuario correcto. ", Toast.LENGTH_SHORT)
                                                                                              .show();
                        }
} else {
                        Toast.makeText(getBaseContext(),
                                                                       "Usuario incorrecto. ", Toast.LENGTH_SHORT)
                                                                                              .show();
                        }
} catch (Exception e) {
                        Toast.makeText(getBaseContext(),
                                                                       "Error al conectar con el servidor. ",
                                                                       Toast.LENGTH_SHORT).show();
}
// FIN Llamada a Servidor Web PHP
                                               }
                        });
}

class Post {
                        private InputStream is = null;
                        private String respuesta = "";

private void conectaPost(ArrayList parametros, String URL) {
                        ArrayList nameValuePairs;
                        try {

                                               HttpClient httpclient = new DefaultHttpClient();

                                               HttpPost httppost = new HttpPost(URL);
                                               nameValuePairs = new ArrayList();

                                               if (parametros != null) {
                                                                       for (int i = 0; i < parametros.size() - 1; i += 2) {
nameValuePairs.add(new BasicNameValuePair((String)parametros.get(i), (String)parametros.get(i + 1)));
                                                                       }
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                                               }
                                               HttpResponse response = httpclient.execute(httppost);
                                               HttpEntity entity = response.getEntity();
                                               is = entity.getContent();
                        } catch (Exception e) {

                                               Log.e("log_tag", "Error in http connection " + e.toString());

                        } finally {

                        }
}

private void getRespuestaPost() {
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
}
is.close();
respuesta = sb.toString();
Log.e("log_tag", "Cadena JSon " + respuesta);
} catch (Exception e) {

                        Log.e("log_tag", "Error converting result " + e.toString());

                        }
}

@SuppressWarnings("finally")
private JSONArray getJsonArray() {
                        JSONArray jArray = null;
                        try {

                                               jArray = new JSONArray(respuesta);

                        } catch (Exception e) {

                        } finally {
                                               return jArray;
                        }
}

public JSONArray getServerData(ArrayList parametros, String URL) {
                        conectaPost(parametros, URL);
                        if (is != null) {
                                               getRespuestaPost();
                        }
                        if (respuesta != null && respuesta.trim() != "") {
                                                                                              return getJsonArray();
                                                                       } else {
                                                                                              return null;
                                                                       }
                                               }
                        }
}
Fichero de configuración (AndroidManifest.xml)
En este fichero de configuración se pide permiso de acceso a Internet y se le indica la clase principal que se debe ejecutar al iniciar la aplicación.
xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.android"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Inicio"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>

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


Web
Fichero PHP
Recibe las dos variables de sesión, Usuario y Contrasena, realiza la consulta a la base de datos  y devuelve los datos en modo JSON.
Este fichero lo debes situar en el siguiente directorio: “C:\wamp\www\login.php”
//login.php
$user = $_POST['Usuario'];
$pass = $_POST['Contrasena'];

$link = mysql_connect('localhost', 'root', '');
if (!$link) {
    die('No pudo conectar: ' . mysql_error());
}

mysql_select_db("fastfoodcompany");

$q=mysql_query("SELECT * FROM usuarios WHERE USER='{$user}' AND PASSWORD='{$pass}' ");

while($e=mysql_fetch_assoc($q))

              $output[]=$e;

      print(json_encode($output));

mysql_close($link);
?>


Base de Datos
Base de Datos



Ejecución de pantallas
Login

Usuario Correcto y Usuario Incorrecto



By Alberto Hernández Akkari

72 comentarios:

TrashMaster 21 de junio de 2011, 17:44  

Muy muy buen tutorial, me ha venido de perlas. Gracias!

Anónimo,  28 de octubre de 2011, 16:44  

¿Cómo puedo hacer lo mismo a una base de datos remotamente?...
Mi BD está en Internet...
¿También se puede cambiando lo de...
JSONArray datos = post.getServerData(parametros, "http://95.234.67.44/login.php");
....por la direccion de mi BD?


o cambio 'localhost'...
$link = mysql_connect('localhost', 'root', '');
....por la direccion de mi BD, root por mi usuario y poner mi pass??

Alberto Hernández Akkari 31 de octubre de 2011, 8:27  

$link = mysql_connect('localhost', 'root', '');

En esta línea debes indicar la dirección IP Externa del equipo en el que se encuentra la Base de Datos.

Después, deberás redireccionar el router para que dentro de tu red local, vaya al equipo donde se encuentra la Base de Datos MySql (o la que quieras utilizar)

Anónimo,  3 de diciembre de 2011, 15:02  

Hola!!! es de lo mas util que he visto desde hace mucho tiempo!! pero com no podia ser de otra manera, no me funciona. Siempre me pone usuario incorrecto. Sin embargo si apago el equipo donde esta la base de datos se queda pillada la aplicacion asi que entiendo que intenta conectar con la base de datos. Si la base de datos es "bd" y la tabla se llama "movil" solo tendria que cambiar las lineas:

try {
Post post = new Post();
JSONArray datos = post.getServerData(parametros,
"http://95.234.67.44/login.php");

mysql_select_db("fastfoodcompany");
$q=mysql_query("SELECT * FROM usuarios WHERE USER='{$user}' AND PASSWORD='{$pass}' ");

por

try {
Post post = new Post();
JSONArray datos = post.getServerData(parametros,
"http://192.168.1.40/login.php");

mysql_select_db("bd");
$q=mysql_query("SELECT * FROM movil WHERE USER='{$user}' AND PASSWORD='{$pass}' ");


Si solo es eso, ¿alguna sugerencia?? algo que verificar???

Muchas gracias por el aporte!!

Alberto Hernández Akkari 4 de diciembre de 2011, 3:29  

Buenas!!

Te voy a dar una guía de pasos para que detectes en qué capa se encuentra el error:

* Model (MySql)
* Ejecuta la sentencia SQL en la base de datos para evitar errores de sintaxis.
* Control (Script PHP)
* Modifica la variable POST por GET, y accede al script PHP desde el navegador, para comprobar errores en el script PHP.
* $user = $_GET['Usuario'];
* Carga en el navegador lo siguiente: http://95.234.67.44/login.php?Usuario=1, por ejemplo.
* View (Cliente Android)
* Comprueba que coincidan los parámetros declarados en el ArrayList con los declarados en el script PHP (exactamente iguales)

Alberto Hernández Akkari 4 de diciembre de 2011, 3:37  

Te dejo un enlace a un seminario que preparé que creo que te puede ayudar en tu desarrollo.

https://sites.google.com/a/svalero.com/seas-taller-geolocalizacion/

Un saludo
Alberto Hernández Akkari

Anónimo,  4 de diciembre de 2011, 9:12  

Gracias por la ayuda Alberto, en cuanto resuelva este paso miraré los proyectos de tu seminario, tiene pinta de poderse sacar cosas muy interesantes... A mi la sensación que tengo es que login.php no se está ejecutando, ya que tanto la traza de la consola eclipse muestran los textos dentro del archivo pero no las respuestas de sql. Con el navegador veo esto al poner la sentencia:

http://192.168.1.60/login.php?Usuario=pepe

veo esto dentro del navegador, es decir como un edit del fichero pero todo seguido.


login.php $user = $_POST['Usuario']; $pass = $_POST['Contrasena']; $link = mysql_connect('localhost', 'root', ''); if (!$link) { die('No pudo conectar: ' . mysql_error()); } mysql_select_db("bd"); $q=mysql_query("SELECT * FROM usuarios WHERE USER='{$user}' AND PASSWORD='{$pass}'"); while($e=mysql_fetch_assoc($q)) $output[]=$e; print(json_encode($output)); mysql_close($link); ?>

la verdad que no se porque pasa...

carson314 4 de diciembre de 2011, 14:58  

Oye no tendras en zip todo el proyecto, por que por mas que intento no corre el programa, lo que pasa que si lo carga y todo pero cuando pongo validar no hace nada ni da correcto o incorrecto cual crees que esl problema, o en que eclipse lo hiciste o que version de android fue??
Espero tu ayuda

Anónimo,  4 de diciembre de 2011, 16:29  

vaya que tontería... la cabecera del fichero php tiene un bugs por eso no lo entiende como sentencias php...

Anónimo,  4 de diciembre de 2011, 18:50  

ahora el problema es conectar desde el movil cuando esta en la red vodafone. He usado la ip externa en el la linea original:

try {
Post post = new Post();
JSONArray datos = post.getServerData(parametros,
"http://95.234.67.44/login.php");

he redireccionado el router el puerto 80 a la ip interna.

y he dejado la linea del fichero php tal cual, ya que si la cambio por la ip externa no funciona ni desde dentro.

$link = mysql_connect('localhost', 'root', '');
if (!$link) {
die('No pudo conectar: ' . mysql_error());

He creado un usuario root mysql en vez de en localhost, con la ip pero nada.
después de todo eso sale

Alguna idea?

Anónimo,  6 de diciembre de 2011, 9:17  

que no llega al servidor mysql si te esperas minutos al final termina dandolo... Eclipse normal de android 3.7.1 y lo tengo para 14 pero se ejecuta desde 7. El tema no creo que vaya por ahí sino que no encuentra el servidor desde el 3G cambiando la ip por una fija externa. He llegado a poner incluso en el router todos los puertos a esa ip pero nada.

Anónimo,  28 de diciembre de 2011, 2:51  

Muchisimas gracias¡¡ llevo 2 dias peleandome y al final funciono tu codigo ;).
No di montado en local el servidor, y eso que configure el router(NAT), al final lo subi a un servidor gratuito cree la BD y todo perfect.
Ahora a seguir .. para insertar BD..etc..

Te acabo enviar solicitud del twitter.

Anónimo,  5 de marzo de 2012, 16:08  

Hola, gracias por el post, es muy util, pero quisiera saber como podria descargar toda la informacion que tengo en mi BD MySQL y vaciarla dentro de SQLite, para acceder remotamente solo una vez.

espero que puedas ayudarme

Anónimo,  15 de marzo de 2012, 12:34  

Yo tambien tengo una duda en cuanto al ejemplo del login.php sale un texto en el navegador y ya, y cuando corro la aplicacion con el emulador siempre me dice que el usuario es incorrecto, alguien ha solucionado el problema???

Anónimo,  15 de marzo de 2012, 16:08  

Bueno, no se si ya se dieron cuenta que el archivo php le falta la instruccion de apertura <?php
Y bueno, ya corregido nos manda unos errores los cuales he resuelto los dos primeros que son cambiar los $_POST por @$_POST
Los otros dos errores aun no los resuelvo, si se algo lo publico inmediatamente, excelente post Alberto!!! Estoy checando tu seminario.... =p

alguerrero 16 de marzo de 2012, 3:15  

Que raro, me sigue apareciendo la conexión como refused y eso que he puesto la ip privada. El script de php se ejecuta correctamente.

Anónimo,  16 de marzo de 2012, 12:38  

sigo con estos dos errores:

Notice: Undefined variable: output in C:\wamp\www\login.php on line 20
null

La linea es:
print(json_encode($output));

Alguien ya corrigio esto??? =(

Anónimo,  16 de marzo de 2012, 16:10  

Pues miren, a mi ya no me marca error, no lo he probado pero pues les dejo el codigo para que si a alguien le sirve lo haga, y si les sirvió que comente. Recuerden que si todos cooperamos esto crece mas y más...

Anónimo,  21 de marzo de 2012, 10:26  

Hola me parece excelente tu tutorial.

Pero tengo un problema, primero el package com.android me dice que no coincide con el paquete esperado, asi que lo comente y aparentemente se arreglo, pero otro error sigue, me dice "The method onClick(View) of type new View.OnClickListener(){} must override a superclass method" en la linea

public void onClick(View v) {

estoy trabajando con eclipse y la plataforma android 2.1 con el jdk 1.7

tambien en la interface login.xml me dice que el tag "absolutelayout is deprecated" ¿seran problemas de compatibilidad o de version?

Agradeceré mucho tu ayuda.

Saludos.

Anónimo,  21 de marzo de 2012, 20:10  

EXELENTE, SOLO QUE ME TIRA ERROR CUANDO CREA EL JSONObjet, pero desde el JSONArray puedo leer los valores

Anónimo,  29 de marzo de 2012, 4:52  

Hola a todos!! yo estoy intentando conectarme a una base de datos mysql con la version android 2.1, pero no consigo que me muestre los datos,
por un lado tengo los datos que me muestra en la dirección http://www.xxxx.es/login.php, que son los siguientes

[{"id":"4","titulo":"atencionCliente.jpg","curso_id ":"29","numero":"1","tema":"3","subtema":"uno "},id":"7","titulo":"00.jpg","curso_id":"34","nu mero":"1","tema":"5","subtema":"Indice "}]
y por otro el codigo java


public class CursoActivity extends Activity {
AutoCompleteTextView texto;
Button boton;
TextView resultado;
String total;
public void onCreate(Bundle SavedInstanceState)
{
super.onCreate(SavedInstanceState);
setContentView(R.layout.curso);
texto = (AutoCompleteTextView) findViewById(R.id.cajaTexto);
// texto.setAdapter(adapter);
boton = (Button) findViewById(R.id.botonBuscar);
resultado = (TextView) findViewById(R.id.resultado);
boton.setOnClickListener (new OnClickListener()
{

public void onClick(View v)
{

resultado.setText(getServerData(total));
}
});
}
//se declara la direccion ip del servidor
public final static String url = "XXXXXX(datos que muestra anteriormente)";

private String getServerData (String returnString)
{
String txt = texto.getText().toString();
if(!txt.equals(""))
{
InputStream is = null;

String result ="";

//Se envian datos de consulta;
ArrayList parametros = new ArrayList();
parametros.add(new BasicNameValuePair("nombre", "1"));

//Conectando a la base de datos
try
{
HttpClient cliente = new DefaultHttpClient();
HttpPost direccion = new HttpPost(url);
HttpResponse respuesta = cliente.execute(direccion);
respuesta.setEntity(new UrlEncodedFormEntity(parametros));
HttpEntity entity = respuesta.getEntity();
is = entity.getContent();
}
catch(Exception e)
{
Log.e("log_tag", "Error en la conexion a la base de datos"+e.toString());
Toast.makeText(this, "Error al conectar a la base de datos", Toast.LENGTH_LONG).show();
}

//Transformar respuesta de la conexion en string
try
{
BufferedReader reader = new BufferedReader (new InputStreamReader(is, "iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String linea = null;
while ((linea = reader.readLine()) != null)
{
sb.append(linea + "\n");

}
is.close();
result = sb.toString();
Log.e("log_tag", "Cadena JSON" + result);
}
catch(Exception e)
{
Log.e("log_tag", "Error al transformar datos. "+e.toString());
Toast.makeText(this, "Error al transformar datos", Toast.LENGTH_LONG).show();
}

//Recibir datos en formato JSON
try
{
JSONArray jArreglo = new JSONArray(result);
for(int i=0; i<jArreglo.length(); i++)
{
JSONObject json_datos = jArreglo.getJSONObject(i);
Log.i("log_tag", "id: "+json_datos.getInt("id")+
", titulo:"+json_datos.getString("titulo")+
", curso_id: "+json_datos.getInt("curso_id")+
", numero: "+json_datos.getInt("numero")+
", tema: "+json_datos.getInt("tema")+
", subtema: "+json_datos.getString("subtema"));
//Los datos se muestran en la pantalla
resultado.setText(total);
returnString += "\n\t" + jArreglo.getJSONObject(i);
}
}
catch (JSONException e)
{
Log.e("log_tag", "Error al recibir datos"+e.toString());
Toast.makeText(this, "Error al mostrar datos", Toast.LENGTH_LONG).show();
}
}
else Toast.makeText(this, "Escriba un curso", Toast.LENGTH_LONG).show();
return returnString;
}
}
y me sale un error al recibir datosorg.json.JSONException.
que puedo estar haciendo mal?.

Darry Castro 29 de marzo de 2012, 17:34  

Buenas noches,

Sr. Alberto Hernández Akkari,

He realizado su tutorial y funciona excelentemente, en el emulador 2.3 android,

Pero, para la versión de 3.2 de una tableta no funciona , me pudieses ayudar
aplicación completa
http://www.cmdima.com/phpjson/json1.zip
http://www.cmdima.com/phpjson/login.php

Darry Castro

Alvaro García,  2 de abril de 2012, 17:11  

Buenas noches,
Me fascina que buscando ejemplos por internet sobre programación en Android, para realizar la Tarea de fin de curso Seas (Android) , encuentre a mi profesor.
Muy buen tutorial Alberto. Un Saludo.

Anónimo,  5 de abril de 2012, 6:55  

a mi me funciona normal usando wifi pero me conecto con plan de datos y nada no funciona

Anónimo,  5 de abril de 2012, 13:58  

Muchas gracias por tu genial tutorial. Me ha servido de mucho.
Te estoy muy agradecido por compartir tus conocimientos con nosotros.

Carolina,  10 de abril de 2012, 13:01  

Estimados: googleando encontre la solución al problema JSONObject, hay que declarar la variable ANTES DEL WHILE:

$output = array();

mi problema: la app arroja el toast "Error al conectar con el servidor".
Si alguien encuentra algo o logra hacer funcional la app correctamente, por favor postee!!!! GRACIAS!!!

Anónimo,  10 de abril de 2012, 18:40  

amigos tengo un problema en el public void onClick(View v) me marca como error sabran como resolverlo de favor???

Anónimo,  19 de abril de 2012, 10:25  

Primero que nada muchas gracias por el tutorial, me ha servido mucho.

Solo tengo un detalle, al ejecutar el programa en el emulador la consola de mensajes de eclipse me arroja que la cadena obtenida es null, entiendo que se conecta al servidor porque llega al metodo getRespuestaPost.

He ejecutado el script php desde mi navegador y poniendo directamente en el archivo el usuario y la contraseña y funciona perfectamente.

Alguna idea??

Anónimo,  23 de abril de 2012, 5:52  

Ami me sale en el log del eclipse cadena JSon y me dice usuario incorrecto alguien sabe que puede ser.

Salu2

Anónimo,  25 de abril de 2012, 3:02  

Alguien sabe como puedo mandar un archivo binario, como esta la clase me da error al madarlo gracias.

Salu2

Diego,  17 de mayo de 2012, 10:11  

Hola Akkari!
Simplemente, que a mi el código me iba perfecto, pero en el LogCat vi que me saltaba una excepción java.net.SocketException: Permission denied, básicamente que no tenía permisos de Internet.
lo solucioné cambiando:


y poniéndolo antes de la etiqueta:
<application

Y funcionó!
Un saludo

Anónimo,  26 de mayo de 2012, 22:24  

Muchas gracias, la verdad me sirvió mucho, lo necesitaba para el chat que estoy realizando.

Saludos

Anónimo,  12 de junio de 2012, 10:17  

Aye compañeros quien me puede colaborar, se me presenta el error que dice "ERROR AL CONECTAR AL SERVIDOR", No se que pueda pasar, realice un seguimiento y me doy cuenta que los parametros si llegan correctamente, tambien ya realice las pruebas en el archivo .php y nada.

Ayudaaaaaaaaaaaaaa.. Por favor.
Gracias.

Barrrientos,  14 de junio de 2012, 2:43  

Saludos. Yo llevo unos días con esto y no al compilar no me da ningún error. el problema que yo tengo que es que me da usuario incorrecto. Cuando lanzo el php por navegador. me saca bien los valores del JSON, es decir que la conexion a la BD y la consulta la hace bien, pero me da la sensación que con el "print(json_encode($output));" android no recibe nada.
Alguien me podría decir si puede ser la versión. Lo tengo hecho para android 2.2. Si no es por eso agradecer que alguien me diga porque android recibe null.
Gracias

Sara MC 15 de junio de 2012, 10:17  

Barrrientos.. poco sé, pero vamos, ¿tienes el módulo json_encode activo en tu php? Mírale con phpinfo()

Agradecerte muchísimo, Alberto, este manual y el seminario de geoposicionamiento; no había forma de enterarme hasta tus ejemplos.
Duda 'practica': ¿cómo hacer una consulta de solo los puntos a 'X' km de tí?

Gracias de nuevo.

Barrientos,  16 de junio de 2012, 8:19  

Muchas gracias por la sugerencia Sara pero no es eso. Lo he comprobado y si esta habilitada. de todas formas supongo que si no la tuviera me marcaría un error, y no es así. Además, el print me saca el contenido de JSON entero, pero en el codigo android, el condicional "if (datos!=null && datos.length()>0)" no lo pasa, ya que el datos.length() no sale mayor que cero (cosa que no entiendo). Pero gracias de todas formas.
Si alguien tiene otra sugerencia, la agradecería muchisimo.

Carlos,  17 de junio de 2012, 23:37  

Lo primero, darte las gracias por hacer este pequeño tutorial. Me surgen dos dudas al leer el código, una desde la aplicación android y la otra desde el servidor PHP:

1. ¿Funcionaría si en vez de una IP colocásemos un nombre de dominio?

2. Para imprimir los datos en el servidor, utilizas la función "Print". ¿La aplicación recibiría también los resultados utilizando "echo"?

Muchas gracias

Anónimo,  23 de junio de 2012, 14:36  

ami no se que pasa pero siempre me dice que el usuario es incorrecto yq vi todos los pos y no me da gracias de todas formas esta muy bueno


06-23 17:04:29.615: E/log_tag(371): Cadena JSon //login.php
06-23 17:04:29.615: E/log_tag(371): $user = $_POST['Usuario'];
06-23 17:04:29.615: E/log_tag(371): $pass = $_POST['Contrasena'];
06-23 17:04:29.615: E/log_tag(371): $link = mysql_connect('localhost', 'root', '');
06-23 17:04:29.615: E/log_tag(371): if (!$link) {
06-23 17:04:29.615: E/log_tag(371): die('No pudo conectar con fer-PHP : ' . mysql_error());
06-23 17:04:29.615: E/log_tag(371): }
06-23 17:04:29.615: E/log_tag(371): mysql_select_db("v2b");
06-23 17:04:29.615: E/log_tag(371): $q=mysql_query("SELECT * FROM usuarios WHERE USER='{$user}' AND PASSWORD='{$pass}' ");
06-23 17:04:29.615: E/log_tag(371): $output = array();
06-23 17:04:29.615: E/log_tag(371): while($e=mysql_fetch_assoc($q))
06-23 17:04:29.615: E/log_tag(371): $output[]=$e;
06-23 17:04:29.615: E/log_tag(371): print(json_encode($output));
06-23 17:04:29.615: E/log_tag(371): mysql_close($link);
06-23 17:04:29.615: E/log_tag(371): ?>

Anónimo,  24 de junio de 2012, 11:59  

Excelente tutorial! Me funciono fino. El error "ERROR AL CONECTAR AL SERVIDOR" me pasaba por esto:

int numRegistrados = json_data.getInt("ID_USUARIO");

reemplace por esto:

int numRegistrados = json_data.getInt("id_usuario");

y funciono :D:D:D tengan cuidado en la declaración de las variables en la BD ya que luego deben ser llamadas de igual manera tanto en el servidor como en la aplicación.

Alvaro Racero 25 de junio de 2012, 4:27  

Si alguno de vosotros trata de ejecutar el programa en Android 3.0 o superior, obtendrá una excepción de uso de red en el hilo de ejecución principal, puede que algunos errores de conexión con el servidor os vengan por ahí.

Un saludo,
Álvaro.

Anónimo,  25 de junio de 2012, 11:23  

Hola, estoy intentando hacer INSERT en vez de SELECT, pero ni se queja ni se actualiza lo que quiero de la Base de Datos...

Se supone que debería funcionar, ¿no?

sebastian 28 de junio de 2012, 19:45  

a los que no le funciona es por que la pagina de php le falta el tag




y todo funcionando filete muchas gracias

Aceituna Mecanica 29 de junio de 2012, 8:46  

Alguien me puede decir por que la poner en el navegador http://192.168.1.60/login.php?Usuario=1

me sale 403 forbidden
You don't have permission to access /login.php on this server.
creo que es lo unico que no he podido resolver y creo que por esa razon siempre me mada un "usuario incorrecto" en la aplicacion

Anónimo,  29 de junio de 2012, 9:30  

Que buen tutorial, felicidades ^^ he aprendido mucho mas que lo que buscaba jeje

Aceituna Mecanica 29 de junio de 2012, 15:11  

Ok resuelto lo de 403 fobiden pero ahora me sale un error en la larte de log_tag, cadena JSon+ resuesta en laconsola de errores aparece:
log tag cadena JSon {id=2,Usuario=Eduardo,Comtrasena=lalito}

esto aparece en rojo cuando en la iterfaz pongo el usuario y la contraseña y me manda el mensajito de usuario incorrecto


espero su ayuda

Anónimo,  4 de julio de 2012, 11:25  

respuesta a Aceituna Mecanica, tienes que mirar en tu codigo donde esta Log.e(..) que imprime este mensaje,
de todas formas esto no quiere decir que tienes un error, en cualquier parte del código se puede poner un Log.e() que imprime error.
es posible que tengas 2 usuarios que sus nombres y contraseña empiezan por lo mismo, y como resultado de la consulta te sale un array que tienes que recorrer con un for y comparar con con los datos que has introducido,
String c1="";
String u1="";
boolean existe = false;
for(int j=0;j<jArray.length();j++){
if(!existe){
JSONObject json_data = jArray.getJSONObject(j);
u1 = json_data.getString("USUARIO");
c1=json_data.getString("CONTRASENA");} if(u1.equals(usuario.getText().toString())&& c1.equals(contrasena.getText().toString())){
existe = true;}
}//fin for
if(existe){resultado.setText("Usuario Valido"); }
else{resultado.setText(" Usuario no Valido");
Log.e("log_tag", "usuario:" +u1+"cont"+c1);}

jsahara 4 de julio de 2012, 11:50  

Alvaro Racero,
depende de que servidor,
en mi caso yo intentaba conctor android con una BD mysql, tenia android 4.0 y no me funcionó hasta que cambie la version de android a 2.3.3.

Aceituna Mecanica 6 de julio de 2012, 11:20  

Ok Muchas gracias bro pero aun asi sabes estube poniendo mensajitos para saber en donde estaba mi erro y resulta que en esta parte
private JSONArray getJsonArray() {
JSONArray jArray = null;
try {

jArray = new JSONArray(respuesta);

Log.e("log_tag", "OK si hay datos" + respuesta);

} catch (Exception e) {

Log.e("log_tag", "Bueno hasta aqui no llega nada " + e.toString());

} finally {
return jArray;
}
}

Me manda directo a la excepcion "Bueno aqui no hay nada"
Me parece que el arreglo no lo almacena.
Espero su ayuda Bendiciones a Todos

Anónimo,  9 de julio de 2012, 4:18  

Hola Aceituna mecanica, como este error puede ser por mchas cosas, lo unico que puedo hacer es enviart e mi codigo, que para mi es muy facil y funciona 100%.



public static final String strURLPost = "http://197.0.0.0/login.php";
EditText usuario=null;
EditText contrasena=null;
Button validar=null;
TextView resultado=null;
Button consulta=null;
Button cancelar=null;
boolean existe=true;

public void onCreate(final Bundle savedInstanceState) {
try{
super.onCreate(savedInstanceState);
primeraPantalla();
}catch(Exception e){Log.i("Error 1", e.toString());}
}

public void primeraPantalla(){
setContentView(R.layout.login);
usuario = (EditText) findViewById(R.id.editText1);
usuario.requestFocus();
contrasena = (EditText) findViewById(R.id.editText2);
validar = (Button) findViewById(R.id.button1);
resultado = (TextView) findViewById(R.id.textView3);
resultado.setVisibility(View.INVISIBLE);
validar.setOnClickListener(new OnClickListener() {
public void onClick(View args0){
try {
// cargarDatosdesdeBD(strURLGet);
identificar(strURLPost);
} catch (Exception e) {
// TODO Auto-generated catch block
Log.e("Metodo postData",e.toString());
}
}});

}

protected void identificar(String postURL) throws Exception{
HttpResponse response=null;
String result=null;
InputStream is=null;
try{
HttpPost post = new HttpPost(postURL);
ArrayList parameters = new ArrayList ();
parameters.add(new BasicNameValuePair("Usuario", usuario.getText().toString()));
parameters.add(new BasicNameValuePair("Contrasena", contrasena.getText().toString()));
UrlEncodedFormEntity sendentity = new UrlEncodedFormEntity(parameters);
post.setEntity(sendentity);
HttpClient client = new DefaultHttpClient();
response = client.execute(post);
HttpEntity entity = response.getEntity();
is = entity.getContent();
BufferedReader in = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),Cool;
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = in.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result=sb.toString();
JSONArray jArray = new JSONArray(result);
String u1 = null;
String c1 = null;

for(int j=0;j

suerte.

Miguel Materano 9 de julio de 2012, 15:34  

Lo logre como lo hice en mi base de datos esta linea debía colocar mi campo en la DB int numRegistrados = json_data.getInt("id_usuario");

quedando la mía así int numRegistrados = json_data.getInt("login"); gracias por el tutorial por fin logre algo después de días de leer

Miguel Materano 10 de julio de 2012, 10:10  

Solo funciona si los registros son 1 en usuario y 2 clave, si coloco usuario ADMIN Y clave FHJ, me dice error al conectar alguna idea?

Anónimo,  16 de julio de 2012, 11:14  

Muchas gracias! muy útil.

Si a alguien le falla el json_decode por su php inferior al 5.1 aquí está la función que le solucionará los problemas!:
http://au.php.net/manual/en/function.json-encode.php#100835

Edward Parra 24 de julio de 2012, 22:42  

hola amigos me gustaría saber como hago solo el envió de la información a mi base de datos que me la guarde..... agradezco su colaboración soy nuevo en la programación Android

Anónimo,  28 de julio de 2012, 17:07  

Hola! A mi me pasa que el php no me toma el $_POST. Pongo en el navegador la consulta y funciona correctamente. Saben porque me pasa esto?? Les agradeceria mucho su ayuda

Anónimo,  29 de julio de 2012, 6:24  

hola el tutorial es muy interesante muchas gracias , pero como pordría llevarlo a otro activity???????????

Debbie Zuleta 31 de julio de 2012, 18:13  

lo que pasa es que no quiero solo validar, si es usuario correcto, me gustaría llevarlo a otro activityyyyyyy, lo que hice fue ponerle intent pero me sale error al conectar al servidor, que puedo hacer?????

carlos diago 24 de agosto de 2012, 11:25  

Llevo horas con este codigo, lo tengo mas que trazado y he mirado las excepciones que me provcoca en internet: me falla en esta linea

HttpResponse response=httpclient.execute(httppost);
me da la siguiente excepcion
networOnMainThreadException

y por lo que he leido en internet parece ser que desde la version de Android 3.0 no deja hacerlo en hilo principal, hay que hacer esto mismo de manera Runnable....

ideas????

carlos diago 27 de agosto de 2012, 17:12  

Siiiii!!!! he conseguido eliminar esa excepcion!!, hay que hacerse la clase post aparte en un.java aparte, y tiene k implementar Runnable

y tachaaaan! deja de aparecer la dichosa excepcion!!

yuhuuuuu!!! XDD

Fer 3 de septiembre de 2012, 14:08  

Hola Carlos diago, podrías explicarme como lo has hecho para que no te de ese error. ¿Me pasas algo de codigo? Entiendo que el post hay que hacerlo en una clase aparte pero lo de implementar de runnable no lo entiendo.
Gracias.

Anónimo,  12 de septiembre de 2012, 19:52  

para todos los que hicieron como yo COPIARON Y PEGARON y no les funciona CHEQUEN QUE el archivo login.php tenga el identificador de inicio de codigo php:

<?php

Ya que en el recuadro no sale y por eso no me funcionaba

Anónimo,  11 de noviembre de 2012, 17:58  

Hola, podrías resubir las imágenes porfavor, ya no se ven para guiarse mejor, al parecer esta excelente este tuto. Saludos

Anónimo,  7 de diciembre de 2012, 11:30  

Saludos, tengo una duda, conque version de android corre este ejemplo..hay algun tutorial para hacer lomismo q este ejemplo pero con android 4.2...gracias....

poseidon77i 7 de enero de 2013, 6:28  

listo el ejemplo funciono muy bien ahora como hago esto para postgreSql porfa si me pueden ayudar...????

Anónimo,  6 de abril de 2013, 5:17  

Poseidon 771, con version de sdk y de android trabajaste y si me puedes enviar tu ejemplo compilado para ver mis errores. Por que ya llevó dos días sin poder hacerlo funcionar. Gracias de antemano.
Saludos alepoing.

Martin Gomez 8 de abril de 2013, 15:43  

Disculpa Poseidon77i podrias enviarme tu ejemplo, e indicarme sdk empleaste. Muchas Gracias.

Alberto Hernández Akkari 8 de abril de 2013, 23:21  

Por petición de muchos compañeros, os adjunto un ejercicio de ayuda con hilos (threads).

Incluye:

Esquema de base de datos - MySql
Carpeta con los _script_s PHP e imágenes que se deben copiar en \"C:\\wamp\\www\\WEB_GROUPON\".
Proyecto Android con la plataforma 4.2 y mapas.

En caso de que os muestre errores de compilación, os adjunto unos pasos para limpiar los errores.

Carpeta: Pasos para limpiar los proyectos.

Enlace con toda la información:

https://www.dropbox.com/s/4zcxf7fwa5ujd9c/AyudaPracticaFinal.rar
(Copia el enlace, abre una nueva pestaña del navegador y pega el enlace)

Un saludo
Alberto Hernández Akkari (Android)

davidmx 5 de mayo de 2013, 13:54  

AMIGOOOOOOOOO UN FAVORR AYUDAME TAN SOLO LO Q YO KIERO HACER LO MISMO QUE TU POST PERO INCLIYENDOLE DESPUES DEL LOGUEO UN VENTANA DONDE PUEDA INSERTAR DATOS como por ejemplo nombres apellidos profesion lo q sea en una tabla TU CREES Q ESO SEA POSIBLE AYUDAME CON ESO PORFAVORR GRACIASSS MI CORREO ES davidbaygorrea@gmail.com

Anónimo,  10 de junio de 2013, 3:45  

yo tngo el mismo problema que david me hace falta insertar datos en una bd phpmyadmin cn json desde eclipse.
Ya lo he intentado y el log cat me devuelve el siguiente error ya que no recojo nada desde eclipse en el json porque no me interesa tener en eclipse ningún dato de los que inserto bien para mostrar por pantalla bien para usarlo después para otra consulta.

Error parsing data org.json.JSONException: End of input at character 0 of

me gustaría tener un ejemplo o una explicación de la inserción de datos.
gracias de antemano mi correo es el siguiente:
getxoco4@gmail.com

Anónimo,  11 de junio de 2013, 0:44  

solucionado he creado setServerdata y solo hago la llamada a conectaPost(parametros, URL); eliminando el getRespuestaPost(); que es el que espera recibir algo.
El siguiente paso es como subir una imagen a esa base de datos usando move_uploaded_file no controlo mucho php y no me funciona por muchas vueltas que le doy si alguien sabe la solución agradeceria que la pusiese. gracias.

Anónimo,  20 de junio de 2013, 13:43  

hola hermano aver si me puedes dar un ejemplo de insercion de datos de esta manera tengo programados numeros aleatorios q cuando de mayor o igual a 100 este inserte datos desde el movil al servidor php disculpa la ignorancia soy nuevo en java y quiero aprender sobre esto muchas grasias :D exelente tu tutorial me llamo jose

ratsmusic 20 de junio de 2013, 19:22  

hola hermanaso tu tuto esta genial te tengo una pregunta puesto q soy novato en cosas de java yo quiero hacer lo siguiente se generaran numeros aleatorios y quiero q cada vez q el numero sea superior a 120 este inserte una serie de datos sin necesidad de ejecutar un boton o algo no se si me explico quiero hacer inserciones a la base de datos sin necesidad de usar un boton para ejecutar la accion si no cuando se genere un numero superior a 120 no se si tengas algun ejemplo de esto realmente me interesa mi nombre es jose dejo mi correo jose_xp_799@hotmail.com

Anónimo,  9 de diciembre de 2014, 3:23  

Funciona muy bien con android 2.3.3 y un servidor alojado en un sitio web. ¡ABSTENERSE A PROBARLO EN 4.X! estuve 30 min intentandolo hasta que leí los comentarios.

Publicar un comentario en la entrada

fsvelectronicainformatica agradece tu comentario.

  © Blogger template On The Road by Ourblogtemplates.com 2009

Back to TOP