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

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"?>
<manifestxmlns: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"/>
                <categoryandroid: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