Mostrando entradas con la etiqueta Desarrollo para celulares. Mostrar todas las entradas
Mostrando entradas con la etiqueta Desarrollo para celulares. Mostrar todas las entradas

2014-04-16

Algunos recursos y servicios para crear tus MAPAS en la Nube Gratis y otros Pagos



  • ArcGIS online es un sistema basado en la nube que nos proporciona herramientas intuitivas para crear y publicar mapas. Los desarrolladores pueden crear aplicaciones personalizadas usando las API y SDK de ArcGIS para crear aplicaciones móviles y web. Puedes obtener una cuenta gratuita de ArcGIS Online con límites de uso. Para empresas existe un periodo de prueba de 30 días, después es un sistema basado en créditos.
  • CartoDB.  Con CartoDB puedes crear y publicar tus mapas y realizar análisis (gracias a la potencia del análisis espacial de PostGIS). Además es una gran herramienta para aplicaciones de geo-procesamiento utilizando tus propios datos. CartoDB es un producto de vizzuality.com con sedes en Nueva York y Madrid. Tenemos un plan gratuito que ofrece 5 mb, la posibilidad de almacenar hasta 5 tablas y con soporte de la comunidad de usuarios.
  • Do a Map – Para crear mapas personalizados y compartirlos con un click. Sin necesidad de registro. Se está utiliza ikiMap como soporte para almacenar los mapas generados, y Leaflet (leafletjs.com) como base para la interfaz gráfica.
  • GeoCommons. GeoCommons permite a todo el mundo buscar, utilizar y compartir datos geográficos y mapas. Crea fácilmente fantásticas visualizaciones interactivas para resolver problemas sin ningún tipo de experiencia utilizando  herramientas tradicionales de mapping.
  • GISCloud. GISCloud ofrece una cuenta gratuita en la que puedes subir tus datos geoespaciales a la nube y crear composiciones de mapas mediante su interfaz de usuario. Es un GIS genérico con una personalización limitada. Es interesante su extensión de publicación para ArcMap gratuita.
  • Lo mismo sucede con Google Fusion Tables. Esta API de Google nos permite subir capas a la web y compartirlas de una forma sencilla e implementar después en una web utilizando la API de Google Maps. Solo es necesaria una una cuenta de google. De nuevo es una opción con muchas limitaciones para analistas GIS o para crear una auténtica arquitectura web mapping.
  • Google Maps Engine Lite permite a los usuarios crear fácilmente sus propios mapas sobre los mapa base de Google Maps. Esta versión “ligera” de Google Maps Engine está diseñada para usuarios que quieren crear mapas sencillos que luego pueden ser fácilmente compartidos. El único requisito es tener una cuenta de Google.
    Google Maps Engine Lite está diseñado para proyectos muy pequeños, tiene un límite de 100 registros al importar hojas de cálculo de Google, CSV o XLSX. Por desgracia, los datos geográficos (formato KML) de Google Fusion no son una opción de importación.
  • indiemapper.com. Te ayuda a hacer mapas temáticos con lo mejor del diseño cartográfico tradicional en el web mapping.
  • MangoMapWeb Mapping. Simplified. Transform GIS data into amazing interactive web maps. Se caracteriza  por tener una interfaz de usuario muy sencilla y orientada hacia la simplicidad.
  • MapBox. Diseña tus mapas en la nube y publícalos en minutos. Incluye magníficos esquemas de colores, capas de terreno, marcadores, etc. Utiliza TileMill. Utiliza los datos de callejero de OpenStreetMap. Tienes un plan gratuito con 50 mb de almacenamiento y 3000 visitas/mes y soporte online.
  • Polymaps. Es una librería JavaScript libre para hacer mapas dinámicos e interactivos. Polymaps proporciona una visualización rápida de conjuntos de datos en múltimples niveles de zoom, y es compatible con una variedad de presentaciones de datos vectoriales, además de la cartografía habitual de OpenStreetMap, CloudMade, Bing u otros proveedores de mapas web basados en imágenes. Polymaps utiliza SVG (Scalable Vector Graphics) para mostrar información, puedes utilizar reglas de estilo CSS para definir el diseño de sus datos. Polymaps utiliza el conocido formato spherical mercator en sus imágenes y datos, por lo que la publicación de información es muy fácil.
  • QGIS Cloud. Es un servicio de hosting que te permite publicar tus mapas directamente desde tu cliente desktop. QGIS Cloud nos ofrece una cuenta gratuita que nos permite publicar un número ilimitado de mapas, 5 bases de datos PostGIS 2.0 y 50 MB de almacenamiento. Publica mapas web de Quantum GIS en 6 pasos:
      1. Instala el plugin
      2. Crea una cuenta
      3. Carga los datos
      4. Crea tu composición de mapa
      5. Publica tu mapa
      6. Tu mapa web está online
  • WorldMap. Desarrollado por el Centro de Análisis Geográfico de la Universidad de Harvard, WorldMap utiliza software open source para visualizar, editar y publicar información geoespacial. WorlMap proporciona a los investigadores la posibilidad de:
    • Subir grandes conjuntos de datos y suporponerlos otras capas
    • Crear y editar mapas y vincular los elementos de mapa a contenidos multimedia.
    • Compartir la edición o  el acceso a grupos pequeños o grandes.
    • Exportar los datos a formatos estándar
    • Hacer uso de poderosas herramientas cartográficas en línea
    • Georeferenciar   mapas en papel en línea (http://warp.worldmap.harvard.edu)
    • Publicar datos con todo el mundo o sólo con algunos.

2013-12-15

4 Videos tutoriales de PhoneGap en Castellano

Conferencia


Instalar Node.js para PhoneGap

Cómo crear tu primera app PhoneGap con comandos


Importar proyecto Phonegap en Eclipse y exportar la APK

2013-09-09

UIBox Sitio web con muchos rescursos listo para utilizar en nuestros desarrollos web.


UIBox es una página web que funciona a modo de librería o recopilación de muchos componentes, tratando de solucionar una de las mayores fortalezas y debilidades de Internet: su tamaño, a pesar que exista de todo, es tan grande que es difícil encontrarlo, el autor de la página web se encarga de recolectar los elementos manualmente, comprobar que tengan un Demo funcional, excelente documentación, y el soporte de varios navegadores, al encontrar un componente con estas características lo agrega a la librería haciéndolo más fácil de encontrar y posteriormente integrar en nuestros proyectos.
Así que la próxima vez que necesites algún componente rápido para tu proyecto solo entra a  UIBox y lo tendrás funcionando en minutos.

2013-09-04

Control de versiones con Git Paso a Paso

¿Qué es GIT?

Git nació de la insatisfacción de Linus Torvalds (creador del kernel de Linux) con los programas de control de versiones. En Linux Foundation, utilizaban BitKeeper, pero en cuanto éste modificó su acuerdo de licencia; tuvieron que optar por una alternativa. La comunidad Linux creó dos nuevos proyectos: Git y Mercurial. Ambos tienen sus orígenes en la emergencia y lideran el ranking de software de control de versiones distribuido. Git se hizo más popular y actualmente se utiliza en proyectos como: el kernel de Linux, jQuery, Ruby on Rails, Symfony, CakePHP, Debian, Fedora, entre otros.

Centralizado o Distribuido

Git, al igual que Mercurial, es un software de control de versiones distribuido (DVCS). Sistemas comoSubversion y CVS, en contraste, funcionan como sistemas centralizados (CVCS).
En los sistemas centralizados, sólo existe un repositorio "maestro" (master), a donde cada desarrollador envía sus cambios. Cada acción debe ser sincronizada con el repositorio central, y como en general el sistema reside en un servidor central, cada acción debe pasar a través de la red; por lo que si la red se cae, el desarrollador no puede trabajar.
En los sistemas distribuidos, cada desarrollador tiene su propio repositorio. En la mayoría de las veces, estos repositorios se comunican con un repositorio central el cual permite compartir los cambios con otros desarrolladores; sin embargo, esto no es un requerimiento.

Ventajas de Git

Una de las principales ventajas de Git es su naturaleza distribuida, lo cual permite que sea igual el tener muchos repositorios remotos o sólo uno para compartir código. Los DVCS permiten trabajar desconectado sin ninguna restricción.
Un factor importante de Git es la velocidad. Git destacó sobre otros DVCS como Mercurial, por la rapidez con la que procesa las operaciones. Esto se debe a que Git está escrito en C y fue pensado para trabajar con el kernel de Linux, por lo que el tiempo de respuesta era sumamente importante. Otro punto interesante, es que el repositorio local de Git sirve como backup, porque contiene todo el historial del proyecto y considerando que (casi) cada acción en Git añade datos, perder datos del historial es algo difícil.
Finalmente se encuentra el workflow que utiliza Git, que analizaremos más adelante.

El repositorio local

En SVN, a cada carpeta que se encuentre asignada al controlador de versiones, se le agrega una carpeta oculta que guarda toda la metadata relevante de dicho directorio. Git por el contrario sólo tiene una de estas carpetas ocultas. Esto significa que se pueden copiar, mover, borrar archivos y carpetas, sin dolores de cabeza. Esta carpeta (.git) se genera en la raíz del proyecto y genera el repositorio local. Los archivos en los que diariamente se trabaja, conforman el "directorio de trabajo" (working directory).
Además del repositorio y el directorio de trabajo, existe el "área de puesta en escena" (staging area), que permite definir qué cambios serán aplicados en el próximo commit. Commit es la acción de consignar un grupo de cambios.
Vamos a visualizar todo con un ejemplo. Hicimos modificaciones a 8 archivos y nos damos cuenta que deberíamos separar estos cambios en dos commits (cada commit debe incluir sólo cambios relacionados). Utilizando el staging area, se puede definir exactamente, sobre qué cambios debe hacerse commit, y cuales deben esperar al siguiente.
Técnicamente, el staging area, no es más que un archivo (llamado index) que se encuentra en el repositorio .git local.

Estados de los archivos

Existen varios estados en los que puede encontrarse un archivo en el working directory. La distinción básica es "tracked" (con seguimiento) y "untracked" (sin seguimiento). Un archivo está en estado tracked, cuando se encuentra dentro del sistema de control de versiones, o sea, Git observa todos los cambios a dicho archivo. En el caso que el archivo no haya sido agregado a Git, el mismo es tratado como untracked.
Los archivos que están en estado tracked, pueden encontrarse a su vez en tres estados:
  • unmodified (sin modificar) o committed (con commit): el archivo se encuentra en su último estado, por lo cual no tiene modificaciones locales.
  • modified: el archivo ha sido modificado desde la última vez que se incluyó en un commit.
  • staged: el archivo fue modificado y agregado al staging area, lo que significa que será incluido en el próximo commit.

Hashes


Git no entiende de números de revisión. En los sistemas CVCS, cada commit tiene asociado un número de revisión consecutivo. En los DVCS como los commits son creados localmente, el sistema no puede asignar números consecutivos. Por este motivo Git utiliza hashes SHA-1.
Un hash es un algoritmo que mediante una entrada (texto, contraseña, archivo, etc.) genera una salida alfanumérica de longitud normalmente fija, que representa un resumen de toda la información que se le ha dado.
SHA-1 es una función de hash creada por los Estados Unidos, que significa Secure Hash Algorithm (Algoritmo de Hash Seguro). Existen varias implementaciones, siendo la 1 la más utilizada.
Entonces Git utiliza estos hashes como si fueran los números de revisión, ya que estos son compatibles con el modelo DVCS.

Git desde la linea de comando

Existen varios programas de terceros como Netbeans, Eclipse, etc; que le dan una interfaz gráfica a Git, pero para comprender en profundidad a Git, lo mejor es observar el workflow de trabajo desde la consola. Si instalás uno de esos programas, varios de los pasos que siguen no tendrás que hacerlos.
Si todavía no lo hiciste, es necesario que descargues e instales la última versión de Git. Esto lo podés hacer desde la página oficial: http://git-scm.com. Una vez instalado, hay que configurarlo. Para eso, hay que abrir el programa Git Bash y veremos lo siguiente.
Git Bash
Ahora es momento de configurar tu usuario. Primero hay que indicarle tu nombre a Git, para que pueda utilizarlo en los commits. Para eso es necesario ejecutar la siguiente línea:
git config --global user.name "Tu nombre"
Luego tenés que indicar tu email.
git config --global user.email "tu@email.com"
Con eso, ya está todo listo para empezar a utilizar Git. En caso que necesites ayuda, siempre podés ejecutar el siguiente comando:
git help git

Forma de trabajo

Repositorios

Un repositorio es el requerimiento básico para trabajar con Git. Vamos a suponer que no tenemos ningún repositorio, por lo cual necesitamos crear uno. Ejecutando el siguiente comando, Git nos creará una carpeta con el nombre del repositorio y dentro una carpeta llamada ".git" la cual contiene toda la información del repositorio.
git init repositorioDePrueba
Para acceder a nuestro repositorio desde Bash, una vez creado el mismo, utilizaremos el siguiente comando:
cd repositorioDePrueba
En el caso que necesites obtener un repositorio remoto, en vez de crear uno local, deberías utilizar el comando clone, en lugar de init.

Commit

Luego de un tiempo trabajando, tendremos algunos archivos que querremos guardar en nuestro repositorio como commits. Para empezar vamos a ejecutar el comando git status para ver qué cambios hay en nuestro directorio de trabajo. En este caso, Git nos informará:
  • que estamos en la rama master
  • que es el commit inicial
  • que hay archivos sin seguimiento
  • que no hay nada para hacer commit
Recordemos que necesitamos hacer que los archivos tengan seguimiento y agregarlos al staging area para poder hacer commit. Para indicarle a Git qué archivos queremos que formen parte del próximo commit, tenemos que utilizar el comando add (supongamos que estuvimos trabajando en un archivo llamado prueba.php).
git add prueba.php
Si volvemos a ejecutar el comando status, veremos que ahora hay cambios para hacer commit.
Para guardar el commit dentro de nuestro repositorio local, debemos utilizar el comando commit.
git commit -m "Mensaje para indicar qué incluye este commit"
El comentario que ponemos al final, nos permite tener una historia de los commits para poder saber qué fue lo que motivó el commit. Para ver la historia de los commits, hay que ejecutar el comandolog; el cual se puede modificar para mostrar lo que necesitemos.
git log // muestra todos los datos
git log --oneline // muestra sólo los mensajes de los commits 
git log -p //muestra los cambios hechos sobre los archivos

Ramificaciones (Branch y Merge)

Gracias a la ramificación, podemos (para explicarlo de forma simple) hacer una especie de copia total del repositorio. De esta forma podremos trabajar en cada rama en una funcionalidad diferente sin que una afecte a la otra. Una vez que estemos contentos con los cambios, podemos fusionar ambas ramas para que ambas tengan los cambios y seguir como al principio.
Ramificación en Git
Para crear una rama, se utiliza el comando branch:
git branch funcionalidad1
Si ejecutamos el comando branch sin indicar un nombre para la nueva rama, Git nos muestra una lista de todas las ramas activas. Hay que tener en cuenta que la rama principal se denomina "master" y que Git nos indica con un asterisco cuál es la rama en la que estamos posicionados (a la cual se la denomina HEAD). Podemos ver que a pesar de haber creado una rama, no nos movimos a ella. Para saltar de rama en rama utilizamos el comando checkout.
git checkout funcionalidad1
Todos los commits que realicemos estando en la rama "funcionalidad1" no serán vistos por la rama "master".
Una vez que hayamos terminado con los cambios en nuestra funcionalidad nueva, y queramos enviar los mismos a la rama master, tendremos que usar el comando merge (estando posicionados en la rama master).
git checkout master
git merge funcionalidad1
Finalmente, como ya fue implementada la funcionalidad, la rama "funcionalidad1" ya no nos sirve más; por lo cual la eliminamos.
git branch -d funcionalidad1

Trabajando con repositorios remotos

Los repositorios remotos nos permiten tener nuestro código disponible para nuestros compañeros de trabajo, así como también integrar el código de ellos a nuestro repositorio local. Para añadir un repositorio remoto debemos ejecutar el siguiente comando:
git remote add reporemoto https://direccionremota.com
Una vez que tenemos configurado un repositorio remoto podemos obtener todos los datos del mismo utilizando dos comandos: fetch o pull. Fetch obtiene todos los datos sin hacer cambios sobre las ramas locales (por lo cual después habrá que hacer un merge), mientras que Pull obtiene los datos y hace merge con las ramas locales.
git fetch reporemoto
o
git pull reporemoto master
Para enviar nuestros datos al repositorio remoto utilizaremos el comando push:
git push reporemoto master
Para ilustrar mejor el flujo de trabajo con los repositorios remotos, te dejo esta imagen.
Trabajar con repositorios remotos en Git

Información recopilada de nebaris.com

2013-02-10

Icon Slave es un sitio web con una herramienta para generar de una imagen multiples iconos

Icon Slaver, es un estupendo sitio web que nos facilita la generación de múltiple iconos para los distintos dispositivos y resoluciones que hoy existe, como Android, iOS, Desktop, Tables, SmartTV, etc..

Cargue tu icono de 1024px en Icono Slayer, elija tus opciones, a continuación, exportar una colección ordenada "listas para trabajar" en su entorno de desarrollo. Todo en un archivo .zip se baja, muy simple.






Link: Icon Slayer


2013-02-07

microjs:: Estupendo sitio con cientos de micro libreria JavaScript

MicroJs.com es un estupendo sitio, con ciento de libreria JavaScript para poder utilizar en nuestro proyectos web. Hay de todo y cada dia aparecen mas y mas.. Con este sitio es simple buscar una alternativa a nuestros problema.

Link: microjs.com

2012-11-27

Team Foundation Service "GRATIS", sale a competir de manera dura, contra GitHub, BitBucket entre otros servicios del mismo tipo.

Ya está disponible. Se trata de Team Foundation Service, una nueva forma destinada a equipos que se destacan por la entrega rápida de software para planificar y administrar proyectos. Y es gratis para equipos de hasta 5 desarrolladores.
 
Desarrollar código es divertido, pero administrar un desarrollo puede resultar complicado. ¿Mantiene el control de versiones de su código? ¿Dónde realiza el seguimiento de problemas y nuevas prestaciones? ¿Cómo mantiene a su equipo en la misma página? Ahora puede utilizar Team Foundation Service para realizar todo esto con cero infraestructura adicional.

Basta de soportar servidores. Basta de instalar y configurar múltiples paquetes de software para tener soporte del proceso de desarrollo. Con Team Foundation Service obtiene una solución fácil de usar y administrar basada en la nube que maneja los elementos críticos de la administración del ciclo de vida de aplicaciones, tales como control de versiones, planificación ágil y builds automatizados. Ya se encuentra disponible para equipos de desarrollo en todo el mundo. Los beneficios de Team Foundation Service incluyen:

 
Comience con su cuenta de Team Foundation Service GRATUITA aquí
Accesible desde cualquier lugar, usando herramientas existentes y conocidas. VS   Comience rápido, sin infraestructura que administrar. VS   Todos los idiomas y plataformas son bienvenidos. VS

Planifique proyectos, colabore con su equipo y administre su código en línea desde cualquier lugar usando cualquier navegador web moderno. Funciona con todas las ediciones de Visual Studio 2012 (¡incluso Express!), así como también Eclipse y otras herramientas (usando nuestro cliente de línea de comando).
 
Pase de “inscribirse” a su primer proyecto en minutos y configure un build de Integración Continua (CI) en unos pocos pasos sencillos. Su código fuente y los elementos de trabajo se almacenan en la nube, por lo cual la configuración de servidores ya es parte del pasado.


  Desde C# a Python, desde Windows a Android, puede usar una variedad de idiomas y dirigirlo a una variedad de plataformas. Nuestros servicios están diseñados para ayudarlo a focalizarse en lo que hace mejor: desarrollar excelentes aplicaciones.

2012-11-14

MobiTest estupenda aplicación para poder testear WebMobiles


Con MobiTest podes ver cuanto tardan en carga tu pagina y como se ven en un celular con solo cargarle la URL, es una herramienta que no tiene que faltar para cuando creamo sitios webs.

2012-10-27

Android inicio de sesión y registro con PHP, MySQL y SQLite

En mi anterior artículo Android inicio de sesión y registro de diseños de pantalla i se explica el diseño de la interfaz de usuario y de registro, pero no tiene funcionalidad. En este tutorial estoy explicando cómo construir inicio de sesión completo y sistema de registro en android usando PHP, MySQL y SQLite. También este tutorial se explica cómo construir API simples usando PHP y MySQL.

Requisitos previos

Este tutorial es una combinación de algunos de mis tutoriales anteriores. Espero que cubrió estos tutoriales antes.
Android hace peticiones HTTP
Android JSON Tutorial de análisis de
Base de datos SQLite Tutorial Android
Android inicio de sesión y registro de diseños de pantalla

API (Application Programming Interface)

⇒ Se aceptan solicitudes por GET / POST métodos
⇒ Interactuar con clases PHP para obtener datos de la base de datos o almacenar en la base de datos
⇒ Por último le dará salida en formato JSON
Android Mysql PHP connect

1. Creación de bases de datos MySQL y tablas

Mientras escribo API en PHP He seleccionado la base de datos MySql para mantener los usuarios y otra información relacionada. Abra la consola de mysql o phpmyadmin y ejecutar la consulta siguiente para crear la base de datos y tabla de usuarios.
create database android_api /** Creating Database **/
use android_api /** Selecting Database **/
create table users(
   uid int(11) primary key auto_increment,
   unique_id varchar(23) not null unique,
   name varchar(50) not null,
   email varchar(100) not null unique,
   encrypted_password varchar(80) not null,
   salt varchar(10) not null,
   created_at datetime,
   updated_at datetime null
); /** Creating Users Table **/

2. Edificio PHP API Clases

Para que sea mínimo traté de utilizar menos cantidad de archivos php. Los siguientes son los archivos son necesarios para construir API en PHP. Usted puede encontrar la descripción de cada archivo de la imagen de abajo.
android php api directory structor
config.php - Este archivo contiene variables constantes para conectarse a la base de datos.
<?php
/**
 * Database config variables
 */
define("DB_HOST", "localhost");
define("DB_USER", "root");
define("DB_PASSWORD", "");
define("DB_DATABASE", "android_api");
?>
Db_connect.php - Este archivo se utiliza para conectar o desconectar la base de datos.
<?php
class DB_Connect {
    // constructor
    function __construct() {
    }
    // destructor
    function __destruct() {
        // $this->close();
    }
    // Connecting to database
    public function connect() {
        require_once 'config.php';
        // connecting to mysql
        $con = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
        // selecting database
        mysql_select_db(DB_DATABASE);
        // return database handler
        return $con;
    }
    // Closing database connection
    public function close() {
        mysql_close();
    }
}
?>
DB_Functions.php - Este archivo contiene funciones para almacenar el usuario en la base de datos, obtener el usuario de base de datos. También puede agregar métodos como actualización, el usuario eliminar.

identificador de usuario único - estoy generando identificador de usuario único en PHP usando uniqid (", true) función. Identificación del usuario se muestra como 4f074eca601fb8.88015924

Contraseña encriptada - La contraseña se almacena utilizando el método base64_encode. Cada contraseña se necesitan dos columnas para almacenar en la base de datos. Una es la de almacenar la contraseña cifrada y la segunda columna es la de almacenar sal utilizada para cifrar la contraseña.
<?php
class DB_Functions {
    private $db;
    //put your code here
    // constructor
    function __construct() {
        require_once 'DB_Connect.php';
        // connecting to database
        $this->db = new DB_Connect();
        $this->db->connect();
    }
    // destructor
    function __destruct() {
    }
    /**
     * Storing new user
     * returns user details
     */
    public function storeUser($name, $email, $password) {
        $uuid = uniqid('', true);
        $hash = $this->hashSSHA($password);
        $encrypted_password = $hash["encrypted"]; // encrypted password
        $salt = $hash["salt"]; // salt
        $result = mysql_query("INSERT INTO users(unique_id, name, email, encrypted_password, salt, created_at) VALUES('$uuid', '$name', '$email', '$encrypted_password', '$salt', NOW())");
        // check for successful store
        if ($result) {
            // get user details
            $uid = mysql_insert_id(); // last inserted id
            $result = mysql_query("SELECT * FROM users WHERE uid = $uid");
            // return user details
            return mysql_fetch_array($result);
        } else {
            return false;
        }
    }
    /**
     * Get user by email and password
     */
    public function getUserByEmailAndPassword($email, $password) {
        $result = mysql_query("SELECT * FROM users WHERE email = '$email'") or die(mysql_error());
        // check for result
        $no_of_rows = mysql_num_rows($result);
        if ($no_of_rows > 0) {
            $result = mysql_fetch_array($result);
            $salt = $result['salt'];
            $encrypted_password = $result['encrypted_password'];
            $hash = $this->checkhashSSHA($salt, $password);
            // check for password equality
            if ($encrypted_password == $hash) {
                // user authentication details are correct
                return $result;
            }
        } else {
            // user not found
            return false;
        }
    }
    /**
     * Check user is existed or not
     */
    public function isUserExisted($email) {
        $result = mysql_query("SELECT email from users WHERE email = '$email'");
        $no_of_rows = mysql_num_rows($result);
        if ($no_of_rows > 0) {
            // user existed
            return true;
        } else {
            // user not existed
            return false;
        }
    }
    /**
     * Encrypting password
     * @param password
     * returns salt and encrypted password
     */
    public function hashSSHA($password) {
        $salt = sha1(rand());
        $salt = substr($salt, 0, 10);
        $encrypted = base64_encode(sha1($password . $salt, true) . $salt);
        $hash = array("salt" => $salt, "encrypted" => $encrypted);
        return $hash;
    }
    /**
     * Decrypting password
     * @param salt, password
     * returns hash string
     */
    public function checkhashSSHA($salt, $password) {
        $hash = base64_encode(sha1($password . $salt, true) . $salt);
        return $hash;
    }
}
?>
index.php - Este archivo se reproduce papel de la recepción de solicitudes y dar respuesta. Este archivo acepta todas las peticiones GET y POST. En cada solicitud se hablará con base de datos y dar respuesta adecuada en formato JSON.
<?php
/**
 * File to handle all API requests
 * Accepts GET and POST
 *
 * Each request will be identified by TAG
 * Response will be JSON data
  /**
 * check for POST request
 */
if (isset($_POST['tag']) && $_POST['tag'] != '') {
    // get tag
    $tag = $_POST['tag'];
    // include db handler
    require_once 'include/DB_Functions.php';
    $db = new DB_Functions();
    // response Array
    $response = array("tag" => $tag, "success" => 0, "error" => 0);
    // check for tag type
    if ($tag == 'login') {
        // Request type is check Login
        $email = $_POST['email'];
        $password = $_POST['password'];
        // check for user
        $user = $db->getUserByEmailAndPassword($email, $password);
        if ($user != false) {
            // user found
            // echo json with success = 1
            $response["success"] = 1;
            $response["uid"] = $user["unique_id"];
            $response["user"]["name"] = $user["name"];
            $response["user"]["email"] = $user["email"];
            $response["user"]["created_at"] = $user["created_at"];
            $response["user"]["updated_at"] = $user["updated_at"];
            echo json_encode($response);
        } else {
            // user not found
            // echo json with error = 1
            $response["error"] = 1;
            $response["error_msg"] = "Incorrect email or password!";
            echo json_encode($response);
        }
    } else if ($tag == 'register') {
        // Request type is Register new user
        $name = $_POST['name'];
        $email = $_POST['email'];
        $password = $_POST['password'];
        // check if user is already existed
        if ($db->isUserExisted($email)) {
            // user is already existed - error response
            $response["error"] = 2;
            $response["error_msg"] = "User already existed";
            echo json_encode($response);
        } else {
            // store user
            $user = $db->storeUser($name, $email, $password);
            if ($user) {
                // user stored successfully
                $response["success"] = 1;
                $response["uid"] = $user["unique_id"];
                $response["user"]["name"] = $user["name"];
                $response["user"]["email"] = $user["email"];
                $response["user"]["created_at"] = $user["created_at"];
                $response["user"]["updated_at"] = $user["updated_at"];
                echo json_encode($response);
            } else {
                // user failed to store
                $response["error"] = 1;
                $response["error_msg"] = "Error occured in Registartion";
                echo json_encode($response);
            }
        }
    } else {
        echo "Invalid Request";
    }
} else {
    echo "Access Denied";
}
?>

Tipos de Respuestas API JSON

Los siguientes son los diferentes tipos de respuestas de JSON generados por API.
Registro de Respuesta Éxito - Éxito Código = 1 (Usuario éxito Almacenado)
{
    "tag": "register",
    "success": 1,
    "error": 0,
    "uid": "4f074ca1e3df49.06340261",
    "user": {
        "name": "Ravi Tamada",
        "email": "ravi8x@gmail.com",
        "created_at": "2012-01-07 01:03:53",
        "updated_at": null
    }
}
Registro de respuesta Error - Error Code = 1 (Error en el almacenamiento)
{
    "tag": "register",
    "success": 0,
    "error": 1,
    "error_msg": "Error occured in Registartion"
}
Registro de respuesta Error - Error Code = 2 (usuario ya existía)
{
    "tag": "register",
    "success": 0,
    "error": 2,
    "error_msg": "User already existed"
}
Ingresa Respuesta Éxito - Éxito Código = 1 (usuario registrado)
{
    "tag": "login",
    "success": 1,
    "error": 0,
    "uid": "4f074eca601fb8.88015924",
    "user": {
        "name": "Ravi Tamada",
        "email": "ravi8x@gmail.com",
        "created_at": "2012-01-07 01:03:53",
        "updated_at": null
    }
}
Login respuesta Error - Error Code = 1 (Ingresar Error - corrige el usuario / contraseña)
{
    "tag": "login",
    "success": 0,
    "error": 1,
    "error_msg": "Incorrect email or password!"
}
Aquí termina la parte de la API y comenzar el proyecto Android.

3. A partir Android Project

Hasta ahora hemos escrito la programación del lado del servidor para construir api simple. Lo siguiente es construir android aplicación para interactuar con el API. En este proyecto estoy codificación aplicación sencilla que contará con tres pantallas Pantalla de inicio, pantalla de registro y una pantalla de panel de bienvenida. Así que vamos a empezar por la creación de un nuevo proyecto en Eclipse IDE usted.
1. Crear un nuevo proyecto, vaya a Archivo ⇒ Nuevo Android Project. Rellene todos los detalles y el nombre de su actividad como DashboardActivity.
2. El siguiente paso es crear un nuevo paquete para almacenar todos nuestros archivos de biblioteca. Haga clic derecho sobre ⇒ ⇒ New src del paquete ⇒ y el nombre como biblioteca.
Android create new package

Clase analizador JSON

3. Lo siguiente que necesitamos clase analizador para analizar api respuesta JSON. Por lo tanto crear una nueva clase en el nombre del paquete de biblioteca como JSONParser.java y llenarlo con el siguiente código.
JSONParser.java
package com.example.androidhive.library;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class JSONParser {
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
    // constructor
    public JSONParser() {
    }
    public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) {
        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        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();
            json = sb.toString();
            Log.e("JSON", json);
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }
        // return JSON String
        return jObj;
    }
}

Base de datos SQLite controlador de clase

4. En la aplicación para almacenar información del usuario que estoy usando la base de datos SQLite. Así que crear nueva clase en que carpeta paquete de biblioteca y el nombre como DatabaseHandler.java y llenar la clase de código siguiente. Este archivo de clase tiene funciones para manejar las operaciones de base de datos como usuario almacenar y fácil de conseguir.
Android sqlite table structor
DatabaseHandler.java
package com.example.androidhive.library;
import java.util.HashMap;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHandler extends SQLiteOpenHelper {
    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;
    // Database Name
    private static final String DATABASE_NAME = "android_api";
    // Login table name
    private static final String TABLE_LOGIN = "login";
    // Login Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_EMAIL = "email";
    private static final String KEY_UID = "uid";
    private static final String KEY_CREATED_AT = "created_at";
    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_LOGIN + "("
                + KEY_ID + " INTEGER PRIMARY KEY,"
                + KEY_NAME + " TEXT,"
                + KEY_EMAIL + " TEXT UNIQUE,"
                + KEY_UID + " TEXT,"
                + KEY_CREATED_AT + " TEXT" + ")";
        db.execSQL(CREATE_LOGIN_TABLE);
    }
    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGIN);
        // Create tables again
        onCreate(db);
    }
    /**
     * Storing user details in database
     * */
    public void addUser(String name, String email, String uid, String created_at) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, name); // Name
        values.put(KEY_EMAIL, email); // Email
        values.put(KEY_UID, uid); // Email
        values.put(KEY_CREATED_AT, created_at); // Created At
        // Inserting Row
        db.insert(TABLE_LOGIN, null, values);
        db.close(); // Closing database connection
    }
    /**
     * Getting user data from database
     * */
    public HashMap<String, String> getUserDetails(){
        HashMap<String,String> user = new HashMap<String,String>();
        String selectQuery = "SELECT  * FROM " + TABLE_LOGIN;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        // Move to first row
        cursor.moveToFirst();
        if(cursor.getCount() > 0){
            user.put("name", cursor.getString(1));
            user.put("email", cursor.getString(2));
            user.put("uid", cursor.getString(3));
            user.put("created_at", cursor.getString(4));
        }
        cursor.close();
        db.close();
        // return user
        return user;
    }
    /**
     * Getting user login status
     * return true if rows are there in table
     * */
    public int getRowCount() {
        String countQuery = "SELECT  * FROM " + TABLE_LOGIN;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        int rowCount = cursor.getCount();
        db.close();
        cursor.close();
        // return row count
        return rowCount;
    }
    /**
     * Re crate database
     * Delete all tables and create them again
     * */
    public void resetTables(){
        SQLiteDatabase db = this.getWritableDatabase();
        // Delete All Rows
        db.delete(TABLE_LOGIN, null, null);
        db.close();
    }
}

Funciones de usuario Clase

5. Crear un nuevo archivo de clase en el paquete de biblioteca y el nombre como UserFunctions.java. Esta clase tendrá funciones para manejar todos los eventos de usuario como
loginUser ()
RegisterUser ()
getLoginStatus ()
logoutUser ().
android testing app localhost vs online
En esta clase de todas las funciones que van a interactuar con las clases, JSONParser DatabaseHandler. Estoy probando API en localhost usando software xampp. Normalmente se ejecuta en localhost puerto http://127.0.0.1 o http://localhost/. En AVD para conectarse a localhost es necesario utilizar http://10.0.2.2/ url en lugar de http://localhost/. Si desea implementar el API en la página web del uso de la url http://yoursite.com/api/
UserFunctions.java
package com.example.androidhive.library;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;
import android.content.Context;
public class UserFunctions {
    private JSONParser jsonParser;
    // Testing in localhost using wamp or xampp
    // use http://10.0.2.2/ to connect to your localhost ie http://localhost/
    private static String loginURL = "http://10.0.2.2/ah_login_api/";
    private static String registerURL = "http://10.0.2.2/ah_login_api/";
    private static String login_tag = "login";
    private static String register_tag = "register";
    // constructor
    public UserFunctions(){
        jsonParser = new JSONParser();
    }
    /**
     * function make Login Request
     * @param email
     * @param password
     * */
    public JSONObject loginUser(String email, String password){
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("tag", login_tag));
        params.add(new BasicNameValuePair("email", email));
        params.add(new BasicNameValuePair("password", password));
        JSONObject json = jsonParser.getJSONFromUrl(loginURL, params);
        // return json
        // Log.e("JSON", json.toString());
        return json;
    }
    /**
     * function make Login Request
     * @param name
     * @param email
     * @param password
     * */
    public JSONObject registerUser(String name, String email, String password){
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("tag", register_tag));
        params.add(new BasicNameValuePair("name", name));
        params.add(new BasicNameValuePair("email", email));
        params.add(new BasicNameValuePair("password", password));
        // getting JSON Object
        JSONObject json = jsonParser.getJSONFromUrl(registerURL, params);
        // return json
        return json;
    }
    /**
     * Function get Login status
     * */
    public boolean isUserLoggedIn(Context context){
        DatabaseHandler db = new DatabaseHandler(context);
        int count = db.getRowCount();
        if(count > 0){
            // user logged in
            return true;
        }
        return false;
    }
    /**
     * Function to logout user
     * Reset Database
     * */
    public boolean logoutUser(Context context){
        DatabaseHandler db = new DatabaseHandler(context);
        db.resetTables();
        return true;
    }
}

El diseño de las pantallas

6. Hasta ahora se han desarrollado las clases de biblioteca necesarios en esta aplicación. Lo siguiente es construir pantallas. Necesitamos tres pantallas Pantalla de inicio, pantalla de registro y pantalla de Dashboard.
Cree 3 archivos xml según Resol r disposición folde y nombrarlos como login.xml, register.xml y dashboard.xml
login.xml - Diseño de pantalla de inicio de sesión de diseño
login.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#3b3b3b" >
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:padding="10dip" >
        <!--  View Title Label -->
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dip"
            android:text="LOGIN"
            android:textSize="25dip"
            android:textStyle="bold" />
        <!--  Email Label -->
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Email" />
        <!--  Email TextField -->
        <EditText
            android:id="@+id/loginEmail"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <!--  Password Label -->
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dip"
            android:text="Password" />
        <!--  Password TextField -->
        <EditText
            android:id="@+id/loginPassword"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:password="true" />
        <!--  Error message -->
        <TextView android:id="@+id/login_error"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:textColor="#e30000"
                    android:padding="10dip"
                    android:textStyle="bold"/>
        <!--  Login Button -->
        <Button
            android:id="@+id/btnLogin"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dip"
            android:text="Login" />
        <!--  Link to Registration Screen -->
        <Button
            android:id="@+id/btnLinkToRegisterScreen"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="40dip"
            android:background="@null"
            android:text="I don&apos;t have account. Register Me!"
            android:textColor="#21dbd4"
            android:textStyle="bold" />
    </LinearLayout>
</ScrollView>
android login screen
register.xml - pantalla de registro de esquema de trazado
register.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#3b3b3b" >
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:padding="10dip" >
        <!--  View Title Label -->
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dip"
            android:text="REGISTER"
            android:textSize="25dip"
            android:textStyle="bold" />
        <!--  Name Label -->
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Full Name" />
        <!--  Name TextField -->
        <EditText
            android:id="@+id/registerName"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <!--  Email Label -->
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Email" />
        <!--  Email TextField -->
        <EditText
            android:id="@+id/registerEmail"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <!--  Password Label -->
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dip"
            android:text="Password" />
        <!--  Password TextField -->
        <EditText
            android:id="@+id/registerPassword"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:password="true" />
        <!--  Error message -->
        <TextView android:id="@+id/register_error"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:textColor="#e30000"
                    android:padding="10dip"
                    android:textStyle="bold"/>
        <!--  Login Button -->
        <Button
            android:id="@+id/btnRegister"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dip"
            android:text="Register" />
        <!--  Link to Login Screen -->
        <Button
            android:id="@+id/btnLinkToLoginScreen"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="40dip"
            android:background="@null"
            android:text="Already registred. Login Me!"
            android:textColor="#21dbd4"
            android:textStyle="bold" />
    </LinearLayout>
</ScrollView>
android registration screen
dashboard.xml - pantalla salpicadero esquema de trazado
dashboard.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#3b3b3b">
    <TextView android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:text="WELCOME"
              android:textSize="40dip"
              android:gravity="center"
              android:layout_marginTop="20dip"/>
    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Logout Me"
        android:textSize="20dip"
        android:textColor="#21dbd4"
        android:textStyle="bold"
        android:id="@+id/btnLogout"
        android:layout_marginTop="80dip"
        android:background="@null"/>
</LinearLayout>
Android welcome screen

El cambio entre Activites

7. Ahora la parte de diseño de la aplicación se lleva a cabo lo siguiente es crear actividades para cada diseño y funcionalidad de grabación para lograr acceso y el proceso de registro.
Crear nuevo LoginActivity.java actividades y RegisterActivity.java y llenarlos con código que aparece más abajo.
LoginActivity.java - Actividad para controlar el evento de inicio de sesión
LoginActivity.java
package com.example.androidhive;
import java.util.HashMap;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.example.androidhive.library.DatabaseHandler;
import com.example.androidhive.library.UserFunctions;
public class LoginActivity extends Activity {
    Button btnLogin;
    Button btnLinkToRegister;
    EditText inputEmail;
    EditText inputPassword;
    TextView loginErrorMsg;
    // JSON Response node names
    private static String KEY_SUCCESS = "success";
    private static String KEY_ERROR = "error";
    private static String KEY_ERROR_MSG = "error_msg";
    private static String KEY_UID = "uid";
    private static String KEY_NAME = "name";
    private static String KEY_EMAIL = "email";
    private static String KEY_CREATED_AT = "created_at";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
        // Importing all assets like buttons, text fields
        inputEmail = (EditText) findViewById(R.id.loginEmail);
        inputPassword = (EditText) findViewById(R.id.loginPassword);
        btnLogin = (Button) findViewById(R.id.btnLogin);
        btnLinkToRegister = (Button) findViewById(R.id.btnLinkToRegisterScreen);
        loginErrorMsg = (TextView) findViewById(R.id.login_error);
        // Login button Click Event
        btnLogin.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                String email = inputEmail.getText().toString();
                String password = inputPassword.getText().toString();
                UserFunctions userFunction = new UserFunctions();
                JSONObject json = userFunction.loginUser(email, password);
                // check for login response
                try {
                    if (json.getString(KEY_SUCCESS) != null) {
                        loginErrorMsg.setText("");
                        String res = json.getString(KEY_SUCCESS);
                        if(Integer.parseInt(res) == 1){
                            // user successfully logged in
                            // Store user details in SQLite Database
                            DatabaseHandler db = new DatabaseHandler(getApplicationContext());
                            JSONObject json_user = json.getJSONObject("user");
                            // Clear all previous data in database
                            userFunction.logoutUser(getApplicationContext());
                            db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));                       
                            // Launch Dashboard Screen
                            Intent dashboard = new Intent(getApplicationContext(), DashboardActivity.class);
                            // Close all views before launching Dashboard
                            dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(dashboard);
                            // Close Login Screen
                            finish();
                        }else{
                            // Error in login
                            loginErrorMsg.setText("Incorrect username/password");
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
        // Link to Register Screen
        btnLinkToRegister.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Intent i = new Intent(getApplicationContext(),
                        RegisterActivity.class);
                startActivity(i);
                finish();
            }
        });
    }
}
RegisterActivity.java - Actividad de manejar evento de registro
LoginActivity.java
package com.example.androidhive;
import org.json.JSONException;
import org.json.JSONObject;
import com.example.androidhive.library.DatabaseHandler;
import com.example.androidhive.library.UserFunctions;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class RegisterActivity extends Activity {
    Button btnRegister;
    Button btnLinkToLogin;
    EditText inputFullName;
    EditText inputEmail;
    EditText inputPassword;
    TextView registerErrorMsg;
    // JSON Response node names
    private static String KEY_SUCCESS = "success";
    private static String KEY_ERROR = "error";
    private static String KEY_ERROR_MSG = "error_msg";
    private static String KEY_UID = "uid";
    private static String KEY_NAME = "name";
    private static String KEY_EMAIL = "email";
    private static String KEY_CREATED_AT = "created_at";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.register);
        // Importing all assets like buttons, text fields
        inputFullName = (EditText) findViewById(R.id.registerName);
        inputEmail = (EditText) findViewById(R.id.registerEmail);
        inputPassword = (EditText) findViewById(R.id.registerPassword);
        btnRegister = (Button) findViewById(R.id.btnRegister);
        btnLinkToLogin = (Button) findViewById(R.id.btnLinkToLoginScreen);
        registerErrorMsg = (TextView) findViewById(R.id.register_error);
        // Register Button Click event
        btnRegister.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                String name = inputFullName.getText().toString();
                String email = inputEmail.getText().toString();
                String password = inputPassword.getText().toString();
                UserFunctions userFunction = new UserFunctions();
                JSONObject json = userFunction.registerUser(name, email, password);
                // check for login response
                try {
                    if (json.getString(KEY_SUCCESS) != null) {
                        registerErrorMsg.setText("");
                        String res = json.getString(KEY_SUCCESS);
                        if(Integer.parseInt(res) == 1){
                            // user successfully registred
                            // Store user details in SQLite Database
                            DatabaseHandler db = new DatabaseHandler(getApplicationContext());
                            JSONObject json_user = json.getJSONObject("user");
                            // Clear all previous data in database
                            userFunction.logoutUser(getApplicationContext());
                            db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));
                            // Launch Dashboard Screen
                            Intent dashboard = new Intent(getApplicationContext(), DashboardActivity.class);
                            // Close all views before launching Dashboard
                            dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(dashboard);
                            // Close Registration Screen
                            finish();
                        }else{
                            // Error in registration
                            registerErrorMsg.setText("Error occured in registration");
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
        // Link to Login Screen
        btnLinkToLogin.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Intent i = new Intent(getApplicationContext(),
                        LoginActivity.class);
                startActivity(i);
                // Close Registration View
                finish();
            }
        });
    }
}
DashboardActivity.java - Actividad para controlar el evento salpicadero
LoginActivity.java
package com.example.androidhive;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.example.androidhive.library.UserFunctions;
public class DashboardActivity extends Activity {
    UserFunctions userFunctions;
    Button btnLogout;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /**
         * Dashboard Screen for the application
         * */
        // Check login status in database
        userFunctions = new UserFunctions();
        if(userFunctions.isUserLoggedIn(getApplicationContext())){
       // user already logged in show databoard
            setContentView(R.layout.dashboard);
            btnLogout = (Button) findViewById(R.id.btnLogout);
            btnLogout.setOnClickListener(new View.OnClickListener() {
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    userFunctions.logoutUser(getApplicationContext());
                    Intent login = new Intent(getApplicationContext(), LoginActivity.class);
                    login.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(login);
                    // Closing dashboard screen
                    finish();
                }
            });
        }else{
            // user is not logged in show login screen
            Intent login = new Intent(getApplicationContext(), LoginActivity.class);
            login.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(login);
            // Closing dashboard screen
            finish();
        }
    }
}

Finalmente Actualización AndroidManifest.xml

No se olvide de actualizar usted AndroidManifest.xml archivo. Cambiar siguientes modificaciones
⇒ Añadir Persmissions Internet
⇒ agregar entradas de cada actividad
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
    package="com.example.androidhive"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="8" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".DashboardActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--  Login Activity -->
        <activity
            android:label="Login Account"
            android:name=".LoginActivity"></activity>
        <!--  Register Activity -->
        <activity
            android:label="Register New Account"
            android:name=".RegisterActivity"></activity>
    </application>
    <!-- Allow to connect with internet -->
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>
8. Asegúrese de que dispone de los archivos colocados como en la siguiente imagen
android app directory structor
Ejecute el proyecto, haga clic en su carpeta de proyecto ⇒ ⇒ 1 Ejecutar como aplicación Android.

Autor: Link