Base de datos remotas Login




Los archivos de mysql se encuentra en la carpeta "cas" dentro del proyecto de github

Para verlo funcionando
http://basededatosremotas.meximas.com/cas/login.php
http://basededatosremotas.meximas.com/cas/register.php
Por favor no se abusen probando que es un server gratuito, si ocupan toda la banda ancha se cae

Antes recomiendo ver Base de datos remotas

Pueden acceder desde acá a HOSTINGER
Hosting






Login.java
import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Login extends Activity implements OnClickListener {

 private EditText user, pass;
 private Button mSubmit, mRegister;

 private ProgressDialog pDialog;

 // Clase JSONParser
 JSONParser jsonParser = new JSONParser();


 // si trabajan de manera local "localhost" : 
 // En windows tienen que ir, run CMD > ipconfig
 // buscar su IP
 // y poner de la siguiente manera
 // "http://xxx.xxx.x.x:1234/cas/login.php";

 private static final String LOGIN_URL = "http://10.0.2.2:1234/cas/login.php";

 // La respuesta del JSON es
 private static final String TAG_SUCCESS = "success";
 private static final String TAG_MESSAGE = "message";

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.login);

  // setup input fields
  user = (EditText) findViewById(R.id.username);
  pass = (EditText) findViewById(R.id.password);

  // setup buttons
  mSubmit = (Button) findViewById(R.id.login);
  mRegister = (Button) findViewById(R.id.register);

  // register listeners
  mSubmit.setOnClickListener(this);
  mRegister.setOnClickListener(this);

 }

 @Override
 public void onClick(View v) {
  // TODO Auto-generated method stub
  switch (v.getId()) {
  case R.id.login:
   new AttemptLogin().execute();
   break;
  case R.id.register:
   Intent i = new Intent(this, Register.class);
   startActivity(i);
   break;

  default:
   break;
  }
 }

 class AttemptLogin extends AsyncTask<String, String, String> {

  @Override
  protected void onPreExecute() {
   super.onPreExecute();
   pDialog = new ProgressDialog(Login.this);
   pDialog.setMessage("Attempting login...");
   pDialog.setIndeterminate(false);
   pDialog.setCancelable(true);
   pDialog.show();
  }

  @Override
  protected String doInBackground(String... args) {
   int success;
   String username = user.getText().toString();
   String password = pass.getText().toString();
   try {
    // Building Parameters
    List params = new ArrayList();
    params.add(new BasicNameValuePair("username", username));
    params.add(new BasicNameValuePair("password", password));

    Log.d("request!", "starting");
    // getting product details by making HTTP request
    JSONObject json = jsonParser.makeHttpRequest(LOGIN_URL, "POST",
      params);

    // check your log for json response
    Log.d("Login attempt", json.toString());

    // json success tag
    success = json.getInt(TAG_SUCCESS);
    if (success == 1) {
     Log.d("Login Successful!", json.toString());
     // save user data
     SharedPreferences sp = PreferenceManager
       .getDefaultSharedPreferences(Login.this);
     Editor edit = sp.edit();
     edit.putString("username", username);
     edit.commit();
     
     Intent i = new Intent(Login.this, ReadComments.class);
     finish();
     startActivity(i);
     return json.getString(TAG_MESSAGE);
    } else {
     Log.d("Login Failure!", json.getString(TAG_MESSAGE));
     return json.getString(TAG_MESSAGE);
    }
   } catch (JSONException e) {
    e.printStackTrace();
   }

   return null;

  }

  protected void onPostExecute(String file_url) {
   // dismiss the dialog once product deleted
   pDialog.dismiss();
   if (file_url != null) {
    Toast.makeText(Login.this, file_url, Toast.LENGTH_LONG).show();
   }
  }
 }
}

Register.java
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Register extends Activity implements OnClickListener{
     private EditText user, pass;
    private Button  mRegister;
 
  // Progress Dialog
    private ProgressDialog pDialog;
 
    // JSON parser class
    JSONParser jsonParser = new JSONParser();
    
    //si lo trabajan de manera local en xxx.xxx.x.x va su ip local
   // private static final String REGISTER_URL = "http://xxx.xxx.x.x:1234/cas/register.php";
    
    //testing on Emulator:
    private static final String REGISTER_URL = "http://10.0.2.2:1234/cas/register.php";
        
    //ids
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_MESSAGE = "message";
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.register);
  
  user = (EditText)findViewById(R.id.username);
  pass = (EditText)findViewById(R.id.password);
  

  mRegister = (Button)findViewById(R.id.register);
  mRegister.setOnClickListener(this);
  
 }

 @Override
 public void onClick(View v) {
  // TODO Auto-generated method stub
  
    new CreateUser().execute();
  
 }
 
 class CreateUser extends AsyncTask<String, String, String> {

  
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(Register.this);
            pDialog.setMessage("Creating User...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
  
  @Override
  protected String doInBackground(String... args) {
   // TODO Auto-generated method stub
    // Check for success tag
            int success;
            String username = user.getText().toString();
            String password = pass.getText().toString();
            try {
                // Building Parameters
                List params = new ArrayList();
                params.add(new BasicNameValuePair("username", username));
                params.add(new BasicNameValuePair("password", password));
 
                Log.d("request!", "starting");
                
                //Posting user data to script 
                JSONObject json = jsonParser.makeHttpRequest(
                       REGISTER_URL, "POST", params);
 
                // full json response
                Log.d("Registering attempt", json.toString());
 
                // json success element
                success = json.getInt(TAG_SUCCESS);
                if (success == 1) {
                 Log.d("User Created!", json.toString());               
                 finish();
                 return json.getString(TAG_MESSAGE);
                }else{
                 Log.d("Registering Failure!", json.getString(TAG_MESSAGE));
                 return json.getString(TAG_MESSAGE);
                 
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
 
            return null;
   
  }
  
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once product deleted
            pDialog.dismiss();
            if (file_url != null){
             Toast.makeText(Register.this, file_url, Toast.LENGTH_LONG).show();
            }
        } 
 }
}

JSONParser.java
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.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
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(final String url) {

        // Making HTTP request
        try {
            // Construct the client and the HTTP request.
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            // Execute the POST request and store the response locally.
            HttpResponse httpResponse = httpClient.execute(httpPost);
            // Extract data from the response.
            HttpEntity httpEntity = httpResponse.getEntity();
            // Open an inputStream with the data content.
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            // Create a BufferedReader to parse through the inputStream.
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            // Declare a string builder to help with the parsing.
            StringBuilder sb = new StringBuilder();
            // Declare a string to store the JSON object data in string form.
            String line = null;
            
            // Build the string until null.
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            
            // Close the input stream.
            is.close();
            // Convert the string builder data to an actual string.
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // Try to 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 the JSON Object.
        return jObj;

    }
    
 
    public JSONObject makeHttpRequest(String url, String method,
            List params) {
 
        // Haciendo la Petición HTTP
        try {
 
            // check for request method
            if(method == "POST"){
                // request method is POST
                // 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();
 
            }else if(method == "GET"){
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);
 
                HttpResponse httpResponse = httpClient.execute(httpGet);
                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();
        } 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;
 
    }
}

login.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   >

    <Button
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/login"
        android:layout_alignParentBottom="true"
        android:layout_alignRight="@+id/login"
        android:layout_marginBottom="25dp"
        android:text="Register" />

    <Button
        android:id="@+id/login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/register"
        android:layout_alignLeft="@+id/password"
        android:layout_alignRight="@+id/password"
        android:text="Login" />

    <EditText
        android:id="@+id/password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/login"
        android:layout_centerHorizontal="true"
        android:ems="10"
        android:inputType="textPassword" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="17dp"
        android:gravity="center"
        android:text="Base de datos remota tutorial"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textStyle="bold" />


    <TextView
        android:id="@+id/TextView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/password"
        android:layout_alignLeft="@+id/password"
        android:layout_marginLeft="22dp"
        android:text="Password" />

    <EditText
        android:id="@+id/username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/TextView01"
        android:layout_centerHorizontal="true"
        android:ems="10" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/TextView01"
        android:layout_centerVertical="true"
        android:text="Username" />

</RelativeLayout>

register.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   >


    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/password"
        android:layout_centerVertical="true"
        android:text="Username" />

    <EditText
        android:id="@+id/username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:ems="10" />

    <TextView
        android:id="@+id/TextView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/username"
        android:layout_below="@+id/username"
        android:text="Password" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="16dp"
        android:gravity="center"
        android:text="Base de datos remota tutorial"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textStyle="bold" />

    <EditText
        android:id="@+id/password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/TextView01"
        android:layout_centerHorizontal="true"
        android:ems="10"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/password"
        android:layout_below="@+id/password"
        android:text="Register" />

</RelativeLayout>

strings.xml
<resources>

    <!-- string ids for registration.xml -->
    <string name="app_name">Remote Databases</string>
    <string name="username_textview">Username:</string>
    <string name="password_textview">Password:</string>
    <string name="submit">Submit</string>
    
</resources>

AndroidManifest.xml (agregar)
 <uses-permission android:name="android.permission.INTERNET"/>



MYSQL


config.inc.php
<?php 

 //los atributos de abajo son los que tenemos que modificar
    $username = "u292883372_rami"; 
    $password = "cursoandroid"; 
    $host = "localhost"; 
    $dbname = "u292883372_bdrem"; 


    // Para saber más de que se trata UTF-8 visita http://en.wikipedia.org/wiki/UTF-8 
    $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 
     
    try 
    { 
        $db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options); 
    } 
    catch(PDOException $ex) 
    { 
        die("Failed to connect to the database: " . $ex->getMessage()); 
    } 
     
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
     
    if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) 
    { 
        function undo_magic_quotes_gpc(&$array) 
        { 
            foreach($array as &$value) 
            { 
                if(is_array($value)) 
                { 
                    undo_magic_quotes_gpc($value); 
                } 
                else 
                { 
                    $value = stripslashes($value); 
                } 
            } 
        } 
     
        undo_magic_quotes_gpc($_POST); 
        undo_magic_quotes_gpc($_GET); 
        undo_magic_quotes_gpc($_COOKIE); 
    } 
    header('Content-Type: text/html; charset=utf-8'); 
    session_start(); 


?>
login.php
<?php

//carga y se conecta a la base de datos
require("config.inc.php");

if (!empty($_POST)) {
    //obteneos los usuarios respecto a la usuario que llega por parametro
    $query = " 
            SELECT 
                id, 
                username, 
                password
            FROM users 
            WHERE 
                username = :username 
        ";
    
    $query_params = array(
        ':username' => $_POST['username']
    );
    
    try {
        $stmt   = $db->prepare($query);
        $result = $stmt->execute($query_params);
    }
    catch (PDOException $ex) {
        //para testear pueden utilizar lo de abajo
        //die("la consulta murio " . $ex->getMessage());
        
        $response["success"] = 0;
        $response["message"] = "Problema con la base de datos, vuelve a intetarlo";
        die(json_encode($response));
        
    }
    
    //la variable a continuación nos permitirará determinar 
    //si es o no la información correcta
    //la inicializamos en "false"
    $validated_info = false;
    
    //bamos a buscar a todas las filas
    $row = $stmt->fetch();
    if ($row) {
        //si el password viene encryptado debemos desencryptarlo acá
        // ++ DESCRYPTAR ++//

        //encaso que no lo este, solo comparamos como acontinuación
        if ($_POST['password'] === $row['password']) {
            $login_ok = true;
        }
    }
    
    // así como nos logueamos en facebook, twitter etc!
    // Otherwise, we display a login failed message and show the login form again 
    if ($login_ok) {
        $response["success"] = 1;
        $response["message"] = "Login correcto!";
        die(json_encode($response));
    } else {
        $response["success"] = 0;
        $response["message"] = "Login INCORRECTO";
        die(json_encode($response));
    }
} else {
?>
  <h1>Login</h1> 
  <form action="login.php" method="post"> 
      Username:<br /> 
      <input type="text" name="username" placeholder="username" /> 
      <br /><br /> 
      Password:<br /> 
      <input type="password" name="password" placeholder="password" value="" /> 
      <br /><br /> 
      <input type="submit" value="Login" /> 
  </form> 
  <a href="register.php">Register</a>
 <?php
}

?> 

register.php
<?php

/*
siempre tener en cuenta "config.inc.php" 
*/
require("config.inc.php");

//if posted data is not empty
if (!empty($_POST)) {
    //preguntamos si el ussuario y la contraseña esta vacia
    //sino muere
    if (empty($_POST['username']) || empty($_POST['password'])) {
        
        // creamos el JSON
        $response["success"] = 0;
        $response["message"] = "Por favor entre el usuairo y el password";
        
        die(json_encode($response));
    }
    
    //si no hemos muerto (die), nos fijamos si exist en la base de datos
    $query        = " SELECT 1 FROM users WHERE username = :user";
    
    //acutalizamos el :user
    $query_params = array(
        ':user' => $_POST['username']
    );
    
    //ejecutamos la consulta
    try {
        // estas son las dos consultas que se van a hacer en la bse de datos
        $stmt   = $db->prepare($query);
        $result = $stmt->execute($query_params);
    }
    catch (PDOException $ex) {
        // solo para testing
        //die("Failed to run query: " . $ex->getMessage());
        
        $response["success"] = 0;
        $response["message"] = "Database Error1. Please Try Again!";
        die(json_encode($response));
    }
    
    //buscamos la información
    //como sabemos que el usuario ya existe lo matamos
    $row = $stmt->fetch();
    if ($row) {
        // Solo para testing
        //die("This username is already in use");
        
        $response["success"] = 0;
        $response["message"] = "Lo siento el usuario ya existe";
        die(json_encode($response));
    }
    
    //Si llegamos a este punto, es porque el usuario no existe
    //y lo insertamos (agregamos)
    $query = "INSERT INTO users ( username, password ) VALUES ( :user, :pass ) ";
    
    //actualizamos los token
    $query_params = array(
        ':user' => $_POST['username'],
        ':pass' => $_POST['password']
    );
    
    //ejecutamos la query y creamos el usuario
    try {
        $stmt   = $db->prepare($query);
        $result = $stmt->execute($query_params);
    }
    catch (PDOException $ex) {
        // solo para testing
        //die("Failed to run query: " . $ex->getMessage());
        
        $response["success"] = 0;
        $response["message"] = "Error base de datos2. Porfavor vuelve a intentarlo";
        die(json_encode($response));
    }
    
    //si hemos llegado a este punto
    //es que el usuario se agregado satisfactoriamente
    $response["success"] = 1;
    $response["message"] = "El usuario se ha agregado correctamente";
    echo json_encode($response);
    
    //para cas php tu puedes simpelmente redireccionar o morir
    //header("Location: login.php"); 
    //die("Redirecting to login.php");
    
    
} else {
?>
 <h1>Register</h1> 
 <form action="register.php" method="post"> 
     Username:<br /> 
     <input type="text" name="username" value="" /> 
     <br /><br /> 
     Password:<br /> 
     <input type="password" name="password" value="" /> 
     <br /><br /> 
     <input type="submit" value="Register New User" /> 
 </form>
 <?php
}

?>

229 comentarios:

  1. hola ramiro primero que nada agradecerte por el gran aporte me funciona todo solo que al salir de la aplicación y entrar de nuevo tengo que logiarme como puedo hacer para que al salir, la sesion este todavia abierta
    saludos

    ResponderEliminar
    Respuestas
    1. Yo lo intentaría por el lado del SharePreference http://cursoandroidstudio.blogspot.com.ar/2014/07/sharepreferences.html

      Eliminar
    2. O mejor aún dejar la app abierta getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

      Eliminar
    3. gracias por la respuesta, eso donde iria disculpa por lo perdido es que soy nuevo en esto de android
      agradeceria mucho tu ayuda

      Eliminar
    4. danilo como lo lograste hacer?

      Eliminar
    5. en en onresume deberias guardar ahi un dato
      @Override
      protected void onResume() {
      super.onResume();
      String valor = preferencias.getString(getString(R.string.est_Telefono), "");
      if(!valor.equals("")){
      Intent Intent =new Intent(Registrar_Usuario.this,Validacion.class);
      startActivity(Intent);
      this.finish();
      }
      }

      Eliminar
  2. Hola, excelente tutorial, solo que de forma local no me funciono, pero si al usar un host. saludos.

    ResponderEliminar
    Respuestas
    1. A mi tampoco me funciona local, sino mal recuerdo era por la versión de php, pero en otras pc si me funciona

      Eliminar
    2. yo estoy usando wamp y solo se soluciono con poner el puerto en la ip y habilitar la opcion poner "put online"

      Eliminar
  3. Perdon por el off-topic pero soy novato en android studio y estaba acostumbrado a eclipse. Tengo una duda, en eclipse los errores aparecían subrayados en rojo y aparecían posibles soluciones al pasar el ratón sobre el. A mi me resultaba muy útil, sobre todo para los import. ¿No se puede hacer lo mismo en Android Studio?

    ResponderEliminar
    Respuestas
    1. En el LogCat te salen las sugerencias y errores, pero si te vas a pasar a Android Studio es una muy buena decisión

      Eliminar
  4. Buenas Ramiro, primero de todo gran blog que me ayuda mucho con mis apps en este nuevo mundo para mi, comentarte que desde aqui http://cursoandroidstudio.blogspot.com.ar/p/inicio.html al ir a Login (queriendo ir aqui http://cursoandroidstudio.blogspot.com.ar/2015/01/base-de-datos-remotas-login.html) te lleva a Youtube y desde allí viendo la descripcion del video puedes llegar a aquí. Te lo comento porque el resto de apartados en tu pagina de Inicio te llevan a tu blog y desde alli tienes los videos. Por si ha sido un error tonto poder subsanarlo, sino pues lo siento solo queria ayudar :P

    Saludos y sigue así!

    ResponderEliminar
  5. En que carpeta pongo esos archivos .php?
    Saludos.

    ResponderEliminar
    Respuestas
    1. dentro de la carpeta "public" lo pones donde vos quieras.. yo particularmente pongo "ramiroconnect" o "miappconnect"

      Eliminar
  6. Hola ..Excelentes vídeos ..de verdad son excelentes, una pregunta .....es posible leer un archivo .txt que se encuentra en un ordenador desde un dispositivo android ? o crear desde java un archivo txt dentro de la memoria del dispositivo ? y si se puede me puede dar una pista de como

    ResponderEliminar
  7. Hola, excelente vídeo, me gustaría preguntar: si el webservice tengo esta respuesta
    if (!is_null($new_user)) {
    $this->response(array("success" => "usuario registrado"),200);
    } else {
    $this->response(array("error" => "Hay un error"), 404);
    }

    como obtengo en el formulario registro, el statusLine.getStatusCode();

    Muchas gracias

    ResponderEliminar
  8. hola Ramiro , en primer lugar felicitar por el gran trabajo, me iba a hacer una aplicación que el registro se produce sólo a distancia, es decir, no tienen el registro en la propia aplicación, debería ignorar la parte del registro o tiene algo debería estar haciendo? Os doy las gracias

    ResponderEliminar
    Respuestas
    1. Claro, en este caso el registro es "a distancia", no es local
      Como es el facebook, te podes conectar en esta computadora, o desde la compu de tu amigo sin problema.
      Más técnico se podría decir, te registrar de forma remota en la nuve, no local. Anda descubriendo esas palabras claves, remoto = distancia, te digo porque cuando googles es importante usar las palabras correctas para encontrar lo que estas buscando

      Eliminar
  9. Hola ramiro, queria decirte que puse todo el codigo como vos pero no me sale. Lo ejecuto y se queda cargando y luego se cierra cual sera mi problema

    ResponderEliminar
    Respuestas
    1. a mi me pasa igual, no se que mas puedo hacer. Copie el codigo igual, la bbdd, todo todo. Por favor ayuda.

      Eliminar
  10. Gracias capo, necesito hacer un proyecto en el laburo para conectarme a varias BBDD y me viene al pelo. De lo mejorcito que encontré, explicas muy bien! Un saludo

    ResponderEliminar
  11. mmm puedes montar en GitHub el script de la base de datos? Gracias de antemano...

    ResponderEliminar
  12. Saludo,
    Amigo te quiero felicitar por tus vídeos y documentación que nos suministrar para quienes queremos empezar en el tema.
    Te cuento lo que sucede, cuando pego el código del archivo JSONParser.java:
    algunas lineas se tachan con una linea DefaultHttpClient httpClient = new DefaultHttpClient(); con el siguiente mensaje:
    This inspection reports where deprecated code is used in the specified inspection scope.

    ResponderEliminar
    Respuestas
    1. Hola. Si eso quiere decir que funciona, pero que tengas en cuenta que en algun momento se va a dejar de funcionar. Por favor, trata de reemplazar por otra cosa..
      Es algo así lo quiere decir el "deprecated"

      Eliminar
  13. Una duda como mando a cerrar la sesion ? ya que si entro a la primera, despues me salgo de la aplicacion y vuelvo a entrar a la app y me logeo pero ahora dado un usuario incorrecto entra de todos modos

    ResponderEliminar
    Respuestas
    1. debemos adentrarnos mas en seguridad, podriamos tener este archivo que recoge el formulario....php
      //vemos si el usuario y contraseña es valido
      $var1=$_POST['usuario'];
      $var2=$_POST['pass'];
      if(strcmp($var1,"") == 0 && strcmp($var2,"") == 0)
      {
      header("Location: index.php?errorusuario=no");
      }else
      if(strcmp($var1,"xxxx") == 0 && strcmp($var2,"xxx") == 0)
      {
      //usuario y contraseña validos
      //defino una sesion y guardo datos
      session_start();
      $_SESSION['autenticado']="SI";
      header("Location: index2.php");

      }else{
      //si no existe le mando otra vez a la portada
      header("Location: index.php?errorusuario=si");
      }
      y este que seria el de seguridad....php
      //inicio de sesion
      session_start();
      //comprueba que el usuario esta autentificado
      if($_SESSION['autenticado']!="SI"){
      //si no existe, envio a la pagina de autentificacion
      header("Location: index.php");
      //ademas salgo de este script
      exit();
      }
      este lo deberiamos de incluir en todos los archivos que no deberia verlos el que no esta logueado.. para salir deberiamos tener un boton que llame a este ultimo.... php
      session_start();
      session_destroy();

      Eliminar
  14. ¿Cómo podría hacer una inserción normal de un dato a una base de datos tipo MYSQL??

    ResponderEliminar
  15. Hola Ramiro, primeramente te felicito por los aportes, espero me puedas despejar la siguiente duda, eh creado un Base de Datos ya está funcionando bien en WEB, pero en la Aplicación, cuando la ejecuto y hago login, se cierra la aplicación aún que no escriba nada, también, cuando hago el registro, sube la información al servidor, pero también forza el cierre de la aplicación, me gustaría saber si tiene algo que ver que mi dispositivo sea android 5.0.2 o si debe ser inferior a esta versión, Excelente trabajo, esperando más tutoriales. Saludos

    ResponderEliminar
  16. Una duda la Aplicación de android, cuando la ejecuto y hago login ingreso los datos y al pulsar el boton de login , se cierra la aplicación , también, cuando hago el registro, sube la información al servidor, pero también forza el cierre de la aplicación, me gustaría saber a que se debe ...Gracias Saludos

    ResponderEliminar
    Respuestas
    1. Me paso lo mismo y escribí linea por linea el código para intentar comprenderlo, eso si deberás investigar un poco, sobre los objetos JSON, revisa bastante, tus ID's para, la parte de la interfaz que estén bien escritas, a mi me funciono eso, lo hice por que agregue más campos a mi tabla. Saludos.

      Eliminar
  17. Tengo problemas con los archivos al subirlos al host, pruebo abrir el login desde el navegador, como en el video, pero me sale un mensaje: Failed to connect to the database: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2 "No such file or directory"), por consiguiente ya en la aplicacion android se cierra

    ResponderEliminar
  18. Me da el siguiente error: Error parsing data org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONObject
    Saben donde esta el error?
    Gracias

    ResponderEliminar
  19. tengo el mismo error de conversion, alguien que pueda ayudarnos porfa, soy nuevo en android

    ResponderEliminar
  20. Hola Ramiro, antes que nada quisiera agradecerte por compartir este video tutorial, tengo una consulta, como puedo realizar un web service para iniciar sesion sin necesidad de crear usuarios sino que invoque dichos usuarios desde el servidor de la empresa (equis) "x" ?

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

    ResponderEliminar
  22. Hola buenas tardes estoy trabajando con estas clases que la verdad están muy bien , trabajo con un servidor remoto y al intentar insertar un usuario en mi base de datos me sale el siguiente error:

    "04-26 16:47:26.201 2303-2303/com.example.usuario.viajemas E/WindowManager﹕ android.view.WindowLeaked: Activity com.example.usuario.viajemas.Actividadmicuenta has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{29ceb195 V.E..... R......D 0,0-684,232} that was originally added here"

    Buscando por internet dicen que hay que cerrar todos los progress antes de que se acabe un activity pero no lo consigo resolver.
    Me podrian ayudar??

    ResponderEliminar
  23. Amigo hola a mi solo me marca error al mandar los datos al servidor, pero creo es solo desde android porque si lo hago en mi servidor con el archivo en php si me abre las interfaces pero del android me marca error en la linea 85 y 114

    Linea 85: class AttemptLogin extends AsyncTask {

    Lineaa 114: Log.d("Login attempt", json.toString());

    ResponderEliminar
    Respuestas
    1. Verifica q tu clase este así

      class AttemptLogin extends AsyncTask < String, String, String >

      Eliminar
    2. Tengo el mismo problema que Fire Mix y tambien tengo escrito tal cual:
      class AttemptLogin extends AsyncTask < String, String, String >

      Creo que el error se debe a que no tiene acceso a la URLLogin ya que me pone que me lleva a la ruta localhost/cas
      pero no llega o no accede a la ruta completa (localhost/cas/login.php)... Por lo tanto me dice que el objeto json es null, cuando no puede ser null porque comprobe con un system.out.print que me imprime los parametros.

      Toda ayuda será bien recibida. Gracias a todos.

      Eliminar
  24. Hola Ramiro, muy buena tu página, nos das un excelente aporte con cada video!!!
    Fíjate que en estos momentos estamos haciendo una app para odenar comidas en restaurantes, y tenemos un problema en determinado punto del sistema, cuando hacemos un registro del cliente y presionamos botón "Continuar" para que pueda ver el menú y selecciones sus platillos.

    El registro lo hace bien y todo en la BD de MySQL, el problema está en que no redirecciona a la siguiente Layout que debería presentarle al usuario de los menús, crees que nos podrías ayudar amigo, te estaremos sumamente agradecidos!!!
    Aca mi correo = xerver-ayala@hotmail.com
    mi FB = https://www.facebook.com/XerverAyala

    ResponderEliminar
  25. Hola Ramiro, sabes como subir imagenes a una base de datos remota como hostinger y luego mostrarlas???

    ResponderEliminar
  26. Hola Ramiro, un saludo desde Colombia.
    Quiero agradecerte por esa labor tan grande y desinteresada que realizas, lo poco que sé, lo he aprendido bien y gracias a ti.
    Quería solicitar tu colaboración con un inconveniente, he creado la base de datos y los respectivos archivos php para la conexión, pero cuando voy a hacer la prueba desde el navegador me genera el siguiente error: Failed to connect to the database: SQLSTATE[28000] [1045] Access denied for user 'u683380231_root'@'localhost' (using password: YES).
    He intentado cambiando la contraseña de la base de datos, he validado la información de login pero no me deja realizar la conexión.
    De antemano, gracias

    ResponderEliminar
  27. K tal Ramiro la verda son super geniales los tutos k realizaste.. me lo estoy pasando viendo uno por uno, ya k soy nuevo en android, mas me gustaria k realices tutos de intro de android con node js y socket io. Gracias.., saludos!!!!

    ResponderEliminar
  28. Buenas,

    Soy nuevo en el mundo android, bastante nuevo de hecho... y tus tutoriales me están sirviendo de guía, muchas gracias!

    El caso es que estoy liado en hacer un login a mi app, y siguiendo tu proyecto me aparecen métodos obsoletos, al igual que le pasaba a otro lector, las cuales según dices, seguirán funcionando durante sabe dios cuanto tiempo... sabes si hay otras clases y métodos que sustituyan a éstos para evitar la obsolescencia? o hoy por hoy es lo único con lo que podemos trabajar para ello?

    De antemano muchas gracias!!!

    ResponderEliminar
    Respuestas
    1. Hola capo. Mira te cuento.
      1- Si tenes tu app funcionando subila con el deprecated o como la tengas. Un amigo muy sabio me dijo, el primero que la hace gana. Por ej un amigo hizo la app de tyc sport no official y ganaba mucha plata hasta que tyc sport hizo realmente la oficial, pero mientras tanto el hizo mucho dinero.
      2- Cuando llegue el momento donde esas clases queden obsoletas, ahí tenes que evaluar si realmente vale el esfuerzo para poder mejorarla/editarla/mantenerlas, porque muchas veces no lo son. Por ej mi primera app se llamaba "calculadora vilma" estuve 3 meses haciendola, tenía 24 (veinticuatro) mejoras, pero 1 año tuvo 50 descarga. La verdad que muy pobre!. Y cuando me paso algo parecido, la elimine!. La relación esfuerzo-ganancia no es proporcional.
      En fin, subila como la tengas, y cuando llegue el momento de arreglarla, se ve!.
      Espero que te haya servidos Juan Manuel. Saludos.

      Eliminar
  29. me aparece el ActionBarActivity en raya como instalo la libreria v7

    ResponderEliminar
  30. Hola. Me acabo de instalar android studio y al abrir tu proyecto y pulsar sobre Design me sale el siguiente error:
    Rendering Problems
    The following classes could not be found:
    - android.support.v7.internal.widget.ActionBarOverlayLayout (Fix Build Path, Edit XML, Create Class)

    Además la carpeta .grandle sale en roja. Me puedes decir como solucionarlo? Muchas gracias!

    ResponderEliminar
  31. Hola ... buen tutorial. Solo me ha presentado un problema al igual que otras personas, realiza la insercion pero cierra la aplicacion y es igual con el login.
    Espero puedas ayudarme.

    ResponderEliminar
  32. Buenas Gran ramiro , muy Buen tutorial como siempre :D

    Man quisiera saber como puedo hacer un post en la base de datos con un cimple click de un boton, sin depender de campos de escritura, EJ: Presiona boton 1--> escribe una "A" en la columna X de la tabla Y de la base de datos

    ResponderEliminar
  33. Buen tutorial gracias

    solo quiero que alguien me enseñe a insertar datos desde la aplicacion android, por favor alguien

    ResponderEliminar
  34. hola ramiro excelente tutorial solo con una duda cuando el telefono no esta conectado a internet lanza el mensaje que se ha cerrado inesperadamente, como se podría solucionar que nos mandara a los ajustes de wifi y así evitar el cierre inesperado, saludos.

    ResponderEliminar
  35. por favor quisiera saber como puedo pedir desde mysql una imagen y mostrar en android en un xml, el problema que tengo es que los comandos 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();
    son obsoletos para la version que tengo de android 1.2 me pudieran ayudar gracias dejo mi correo si saben como cristianbasto04@hotmail.com

    ResponderEliminar
  36. Hola Ramiro buen Turorial amigos me estan ayudando mucho, la pregunta es la siguiente un poco larga no tanto jeje, Bueno resulta que yo estoy trabajo en mi servidor local en WAMSERVER 2.5 he creado en phpmyadmin una base de datos llamada usuario y una tabla usuarios entonces dentro de mi carpita wam server en la carpeta WWW puse los archivos phps login,register,config cambie las siguientes cosas en config.php solo cambie esta parte:
    /los atributos de abajo son los que tenemos que modificar
    $username = "root"; mi usuario del servidor
    $password = "root"; mi contraseña del servidor
    $host = "localhost";
    $dbname = "usuario"; no usuarios(usuarios con con "s" es mi tabla

    el Login modifique esto
    $_POST['username']
    );

    en registro solo modifique el

    //si no hemos muerto (die), nos fijamos si exist en la base de datos
    $query = " SELECT 1 FROM usuarios WHERE username = :user";


    ahora en el java solo puse esto en el Login

    private static final String LOGIN_URL = "http://10.0.2.2/cas/login.php";

    en el register
    private static final String REGISTER_URL = "http://10.0.2.2/cas/register.php";

    entonces al momento de REGISTRAR me registra cualquier usuario registrado dentro de mi base datos puede ingresar pero al momento de ingresar un usuario que no esta en mi base datos la aplicación se detienen Unfortunately aapSystema(nonbre el proyecto) has stopped muchas amigos un abrazo cuidate

    ResponderEliminar
  37. Ramiro ahora Para Eliminar Los registros de una BD remota desde Android Studio también tienes un vídeo de eso??? saludos amigos

    ResponderEliminar
  38. hopla que tal este yo lo estoy haciendo pero en el readComments no puedo poner la extends de actionBarActivity no se por que espero tu respuesta gracias :)

    ResponderEliminar
  39. hola Ramiro, primero q todo, excelente trabajo bro. tengo una consulta, q agradezco tu respuesta. si estoy en la activity de login. y al hacer login quiero pasar a la siguiente activity el correo y también el nombre, como lo hago? el correo es fácil, por que lo capturo del textEdit, pero no logro hacer la consulta para traerme el nombre. gracias de antemano por tu ayuda!

    ResponderEliminar
    Respuestas
    1. por si alguien mas tiene este problema, les comento que es muy fácil la solución, nadie me resolvió el problema, pero yo les aportare. solo en el php también mando a traer los demás datos. y luego escojo el nombre que me retorna en message, que seria el nombre, y se envía a la siguiente actividad con un putExtra o lo guardan en savepreferences para acceder desde cualquier activity o fragment.

      Eliminar
  40. Amigo ayúdame con este error a la hora de visualizar los archivos php.

    Lost connection to MySQL server at 'reading initial communication packet', system error: 95

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

    ResponderEliminar
  42. Bom dia, o meu aplicativo está dando o seguinte erro http://caixapretadasaude.org.br/aplicativo/erro.PNG, http://caixapretadasaude.org.br/aplicativo/erro2.PNG alguém pode me ajudar?

    ResponderEliminar
  43. hola de verdad muchas gracias por tantos conocimientos que nos compartes estoy muy agradecido amigo saludos desde mexico... quisiera hacer una aplicacion android aqui en android studio para consultas de base de datos en mysql

    ResponderEliminar
  44. amigo mio, ramiro, gran trabajo, y espero me respondas, que a ti últimamente es un desafió conseguirte jejejee. quiero implementar una listviwe en la cula me traiga todas las empresas de la base de datos con sus columnas asi como en un anterior tutorial tuyo, pero que hay que modificar en el webservice para q funcione con el nuevo método q usas de config.inc.php de antemano, muchas gracias

    ResponderEliminar
  45. Te felicito viejo Ramiro! buena por esa, no sabes cuanto me va a servir este tutorial. Dios y la Virgen te bendigan mucho.

    ResponderEliminar
    Respuestas
    1. ajajaj, que bueno te haya servido

      Eliminar
    2. Ramiro, que opinas de implementar este método.:
      http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

      Eliminar
    3. que esta precioso el ejemplo, opino que si deberías hacerlo y yo también. Lo voy a agregar a sitios de interés. Gracias por aportar.

      Eliminar
    4. si, ando implementandolo, pero estoy medio loco con el inicio de sesión, y que no me muestra los errores cuando no hay Internet o cosas así, creo q hay que implementar esas lineas en el try, quizá podrías echarle el ojo y guiarme un poco :)

      Eliminar
    5. ya lo solucione, muchas gracias, si alguien posee algun problema, no dude en comentarlo.

      Eliminar
  46. excelente tuto ramiro colaborame con un codigo para registrar en una base de datos una id, nombre,telefono gracias

    ResponderEliminar
  47. Hola ramiro antes que nada un excelente aporte solo tengo un error en la parte del Login y en el de Register ,en la linea donde esta el
    String username= user.getText().ToString();
    String username= user.getText().ToString();

    me marca el error en el user.getText() ,dice que la linea debe tener o debe ser llamda desde un UI Tread algo asi,como puedo solucionar ese error?

    ResponderEliminar
    Respuestas
    1. tienes que cambiarlas por un arreglo
      String username = args[0];
      String password = args[1];

      y en onClick

      declara ahora si lo siguiente
      String username = user.getText().toString();
      String password = pass.getText().toString();

      Eliminar
  48. Hola Ramiro.
    Al subir los ficheros a hostinger y abrirlos no se conecta y me sale este error por pantalla:
    Failed to connect to the database: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2 "No such file or directory")

    Como puedo arreglarlo?

    ResponderEliminar
  49. mismo error


    Failed to connect to the database: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2 "No such file or directory"

    ResponderEliminar
  50. me produce el mismo error en hostinguer

    Failed to connect to the database: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2 "No such file or directory")

    ResponderEliminar
  51. Buenas Ramiro, me da error cuando voy a insertar o loguear un usuario cuando trabajo en localhost y como dice un comentario de arriba, yo también tengo problemas con esto me sale la linea en rojo en:
    String username = user.getText().toString();
    String password = pass.getText().toString();

    me marca el error en el user.getText() ,dice que la linea debe tener o debe ser llamada desde un UI Tread algo asi,como puedo solucionar ese error?

    ResponderEliminar
  52. Y en el log me sale esto que no se que significa:

    09-25 18:19:05.102 24013-24013/com.ramiromadraiga.loginbdremote E/WindowManager﹕ android.view.WindowLeaked: Activity com.ramiromadraiga.loginbdremote.Register has leaked window com.android.internal.policy.PhoneWindow$DecorView{ab4741e V.E...... R......D 0,0-1026,348} that was originally added here
    at android.view.ViewRootImpl.(ViewRootImpl.java:368)
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:299)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
    at android.app.Dialog.show(Dialog.java:319)
    at com.ramiromadraiga.loginbdremote.Register$CreateUser.onPreExecute(Register.java:73)
    at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:604)
    at android.os.AsyncTask.execute(AsyncTask.java:551)
    at com.ramiromadraiga.loginbdremote.Register.onClick(Register.java:60)
    at android.view.View.performClick(View.java:5198)
    at android.view.View$PerformClick.run(View.java:21147)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

    ResponderEliminar
  53. muchas gracias por el material muy util , pero me da error en las siguientes lineas
    String username = user.getText().toString();
    String password = pass.getText().toString();

    Method getText() must be called from the UI Thread

    debido a eso no compara los valores y devuelve null , por lo que se cae el programa creo yo ,
    cualquier ayuda la agradeceria mucho
    saludos

    ResponderEliminar
    Respuestas
    1. Hola! espero que esto les ayude de como yo lo solucione primero lo que ise fue declara un arreglo globla: String []datos = new String[1];

      despues cree un metodo para el onclick asi:
      public void iniciarSesion(View v){
      datos[0] = user.getText().toString();
      datos[1] = pass.getText().toString();
      new CreateUser().execute();
      }

      y quite todo lo relacionado con el OnClickListener ya que no es necesario
      tambien borre el llamado del texto ya que ya lo hacien en el evento onclick
      // Borrados
      String username = user.getText().toString();
      String password = pass.getText().toString();
      y mi xml queda asi: agregamos la propiedad onClick al xml

      Button
      android:id="@+id/login"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_above="@+id/register"
      android:layout_alignLeft="@+id/password"
      android:onClick="iniciarSesion"
      android:layout_alignRight="@+id/password"
      android:text="Login"

      y los demas botes seria de la misma forma. Espero que les sirva y si alguna duda pueden preguntarme.

      Eliminar
    2. Primero gracias por resolver este error que a varios afecta. Dudas acerca de tu comentario, el método iniciarSesion, ¿lo implementas dentro del onclick o lo implementas fuera y lo llamas dentro del onclick ???
      Otra, que lineas borraste del OnclickListener, ¿todas?
      ¿mSubmit.setOnClickListener(this);?
      ¿mRegister.setOnClickListener(this);?
      otra, la clase CreateUser esta implementada sólo en el Register.java y no en Login.java.
      espero que me puedas ayudar, gracias y saludos :)

      Eliminar
    3. Te muestro todas las modificaciones que realize, ya hay compara cuales fueron. y el metodo iniciarSesion lo referencias con --> (View v) que es un metodo para el evento onclick el cual tu lo asignas en la propiedad del boton en el xml, Se asignas el nombre del metodo onclick a tu boton de como se llama el metodo. ---> android:onClick="iniciarSesion"

      y si elimine mSubmit.setOnClickListener(this); yo solo lo uso el listener para funciones como el checkbox o el radiobutton.

      Eliminar
    4. import android.app.Activity;
      import android.app.ProgressDialog;
      import android.content.Intent;
      import android.content.SharedPreferences;
      import android.os.AsyncTask;
      import android.os.Bundle;
      import android.preference.PreferenceManager;
      import android.util.Log;
      import android.view.View;
      import android.widget.EditText;
      import android.widget.Toast;

      import org.apache.http.message.BasicNameValuePair;
      import org.json.JSONException;
      import org.json.JSONObject;

      import java.util.ArrayList;
      import java.util.List;

      public class Login extends Activity{

      private EditText user, pass;
      String []sesion = new String [1];

      private ProgressDialog pDialog;

      JSONParser jsonParser = new JSONParser();

      private static final String LOGIN_URL = "censurado la ubicacion/login.php";
      private static final String TAG_SUCCESS = "success";
      private static final String TAG_MESSAGE = "message";

      @Override
      protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      // setup input fields
      user = (EditText) findViewById(R.id.edtuser);
      pass = (EditText) findViewById(R.id.edtpass);

      }

      public void logeo(View v) {
      // TODO Auto-generated method stub
      sesion[0]= user.getText().toString();
      sesion[1]= pass.getText().toString();
      new AttemptLogin().execute();
      }
      public void registrarU(View v){
      Intent i = new Intent(this, Registrar.class);
      startActivity(i);
      }

      class AttemptLogin extends AsyncTask {

      @Override
      protected void onPreExecute() {
      super.onPreExecute();
      pDialog = new ProgressDialog(Login.this);
      pDialog.setMessage("Attempting login...");
      pDialog.setIndeterminate(false);
      pDialog.setCancelable(true);
      pDialog.show();
      }

      @Override
      protected String doInBackground(String... args) {
      int success;
      try {
      // Building Parameters
      List params = new ArrayList();
      params.add(new BasicNameValuePair("username", sesion[0]));
      params.add(new BasicNameValuePair("password", sesion[1]));

      Log.d("request!", "starting");
      JSONObject json = jsonParser.makeHttpRequest(LOGIN_URL, "POST",
      params);

      Log.d("Login attempt", json.toString());

      success = json.getInt(TAG_SUCCESS);
      if (success == 1) {
      Log.d("Login Successful!", json.toString());
      SharedPreferences sp = PreferenceManager
      .getDefaultSharedPreferences(Login.this);
      SharedPreferences.Editor edit = sp.edit();
      edit.putString("username", sesion[0]);
      edit.commit();

      Intent i = new Intent(Login.this, RegistrarCitas.class);
      finish();
      startActivity(i);
      return json.getString(TAG_MESSAGE);
      } else {
      Log.d("Login Failure!", json.getString(TAG_MESSAGE));
      return json.getString(TAG_MESSAGE);
      }
      } catch (JSONException e) {
      e.printStackTrace();
      }

      return null;

      }

      protected void onPostExecute(String file_url) {
      pDialog.dismiss();
      if (file_url != null) {
      Toast.makeText(Login.this, file_url, Toast.LENGTH_LONG).show();
      }
      }
      }
      }

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

      Eliminar
    6. Muchas gracias por tu respuesta, implemente lo que me dijiste y ya no estan esos errores.
      Claro que nada es tan fácil, ahora abro la aplicación y se cae, al intentar logear y registrar.
      :s estoy intentado solucionarlo. Cualquier ayuda me viene de maravilla. Saludos

      Eliminar
    7. pon tu codigo java y el xml para yo poder ver el error o que falta

      Eliminar
    8. disculpa joel podrías explicar mejor como realizaste el cambio en las lineas de codigo que pasaste por favor

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

      Eliminar
  54. Muchas gracias por tu tiempo Ramiro en compartir tu conocimiento, muchos errores me encontré pero no fue tu culpa y ademas me ayudo tener errores... fue que yo tengo una versión mas nueva el caso que se fueron quitando algunas cosas se podría decir como la función de: import org.apache.http.HttpEntity; que se mostraba en rojo, la solución fue trabajar en la misma versión de android del codigo fuente 21 y yo tengo asta el 23 ese fue el mismo problema para crear la actualizacion en Play Store.. También hay otra solución pero no entrare en detalles

    ResponderEliminar
    Respuestas
    1. Si podes comenta cuales fueron los errores y como los solucionaste. Así otros le sirve otra información. Siempre la idea es compartir.

      Eliminar
    2. Yo tengo es mismo error en las librerias y nose como resolverlo

      Eliminar
  55. Quisiera que me dieran la definición de que es una basa de datos remota

    ResponderEliminar
    Respuestas
    1. Remoto
      La palabra se utiliza en tecnologías de la información para definir sistemas o elementos de sistemas que se encuentran físicamente separados de una unidad central. Un puente remoto es un dispositivo que hace posible la comunicación entre, por ejemplo, una LAN y una red de área amplia. Fuente: http://www.mastermagazine.info/termino/6524.php

      Eliminar
  56. como podria hacer que rellene un formulario una sola vez y que esa info quede solo en el cel sin usar bases de datos

    ResponderEliminar
  57. Amigo no me reconoce estas importaciones
    import org.apache.http.NameValuePair;
    import org.apache.http.message.BasicNameValuePair;

    y por ende no me corre la aplicacion que puedo hacer

    ResponderEliminar
    Respuestas
    1. intenta descargando las librerías apache y metiendo el archivo en la carpeta libs

      http://www.java2s.com/Code/Jar/a/Downloadapachehttpcomponentshttpcorejar.htm

      Eliminar
    2. Mucho más facil es poniendo esto en el gradle:
      compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'

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

    ResponderEliminar
  59. Hola Anam. ¿Lo conseguiste?
    Yo tengo el mismo problema, he estado buscando documentación, y parece que el SDK 23 ya no tiene estas librerías por defecto, hay que importarlas. La verdad es que yo lo estoy intentando, y no lo consigo. Cuando ya he conseguido importar la librería, creo la dependencia en estructura, incluyo la instrcución en GRADLE pero entonces el proyecto no me reconoce los directorios en res.

    La segunda opción que he encontrado es la de usar OkHttp.

    Si alguien puede ayudar con un mini tutorial para resolver esto, yo se lo agradeceré-
    Un saludo.

    ResponderEliminar
  60. Hola, excelente tutorial me ayudo un monton. Solo tengo una duda y espero me puedas ayudar, lo unico que me falta es poder mantener y cerrar la sesion en la aplicacion.

    Espero me puedas ayudar :) Saludos

    ResponderEliminar
    Respuestas
    1. Googlealo como "tareas de segundo plano" y si queres que el usuario y contraseña se guarde podrías usar el "sharepreference" http://cursoandroidstudio.blogspot.com.ar/2014/07/sharepreferences.html

      Eliminar
    2. Angelica de la Torre27 de octubre de 2015, 22:18

      Muchas gracias :) ya funciona ala perfeccion. Por casualidad no tienes algun tutorial de material design?

      Eliminar
    3. todavía no he hecho nada, pero estoy pensando en hacerlo.
      Después si podes comenta como lo hiciste para que otros lo puedan leer y les sea de ayuda.

      Eliminar
    4. Como conseguiste manter el inicio de sesion y poder cerrar la sesion tambien. D:

      Eliminar
  61. Hola ramiro me funciono, excelente post, tengo una duda o como le hago para almacenar la hora actual ejemplo se loguea alas 8:00 am que la hora me la guarde en un editext para asi mandarserla a mysql a que hora se conecto o algo asi.¿como manejo esos parametros,recoger hora,guardar hora y mandarla por php y de ahi a mysql ?como sabras de algun tutorial que me ayude.De antemano muchas gracias

    ResponderEliminar
  62. Excelente tutorial,
    Tengo el siguiente problema. La BBDD funciona a la perfección al utilizarla desde el navegador, pero al hacer login (Insertar usuario y contraseña) en la aplicación de Android aparece el mensaje "Desafortunadamente Prueba se ha detenido".Todas las actividades funcionan de forma independiente, ya que las he lanzado una por una como LAUNCHER.

    Un saludo.

    ResponderEliminar
    Respuestas
    1. fijate si tenes todo lo necesario en el AndroidManifest.. como permisos para usar internet

      Eliminar
    2. puedes decirme si ya arreglaste el problema

      Eliminar
  63. Muchas gracias por tu tiempo.
    El manifest esta todo en orden, ya que al testear actividad por actividad funcion(poniendo cada una como launcher) y la linea de acceso a Internet no falta. Volveré a realizar todo de nuevo. Un saludo

    ResponderEliminar
    Respuestas
    1. 10-30 12:18:05.656: W/dalvikvm(15045): threadid=13: thread exiting with uncaught exception (group=0x4158fd88)
      10-30 12:18:05.656: E/test(15045): Exception
      FATAL EXCEPTION: AsyncTask #3
      Process: com.example.pruebabase, PID: 15045
      java.lang.RuntimeException: An error occured while executing doInBackground()
      at android.os.AsyncTask$3.done(AsyncTask.java:300)
      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
      at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
      at java.lang.Thread.run(Thread.java:841)
      Caused by: java.lang.NoSuchMethodError: org.apache.http.impl.client.DefaultHttpClient.execute
      at com.example.pruebabase.JSONParser.makeHttpRequest(JSONParser.java:108)
      at com.example.pruebabase.Login$AttemptLogin.doInBackground(Login.java:111)
      at com.example.pruebabase.Login$AttemptLogin.doInBackground(Login.java:1)
      at android.os.AsyncTask$2.call(AsyncTask.java:288)
      at java.util.concurrent.FutureTask.run(FutureTask.java:237)
      ... 4 more
      E/WindowManager(15045): android.view.WindowLeaked: Activity com.example.pruebabase.Login has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{419cd4e0 V.E..... R......D 0,0-456,144} that was originally added here
      at android.view.ViewRootImpl.(ViewRootImpl.java:352)
      at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
      at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
      at android.app.Dialog.show(Dialog.java:294)
      at com.example.pruebabase.Login$AttemptLogin.onPreExecute(Login.java:95)
      at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
      at android.os.AsyncTask.execute(AsyncTask.java:535)
      at com.example.pruebabase.Login.onClick(Login.java:74)
      at android.view.View.performClick(View.java:4575)
      at android.view.View$PerformClick.run(View.java:18561)
      at android.os.Handler.handleCallback(Handler.java:733)
      at android.os.Looper.loop(Looper.java:136)
      at android.app.ActivityThread.main(ActivityThread.java:5136)
      at java.lang.reflect.Method.invokeNative(Native Method)
      at java.lang.reflect.Method.invoke(Method.java:515)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:819)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635)
      at dalvik.system.NativeStart.main(Native Method)

      Eliminar
  64. ¿Que librerias/.jar debo añadir para que funcione mi proyecto?

    ResponderEliminar
    Respuestas
    1. Ninguna!
      Solo pon esto en el gradle!


      compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'

      Eliminar
  65. Muchas gracias por el tutorial, muy bien explicado pero tengo un detalle en la clase doInbackgound me sale este error: Method getText() must be called from the UI Thread
    No se como corregirlo, si alguien pudiera ayudarme, tenga en cuenta que soy nuevo en android no le entiendo muy bien, muchas gracias :)

    ResponderEliminar
  66. Hola ramiro, excelente tutorial, lo eh probado directamente de los archivos para descargar y funciona perfecto, el problema es que al hacerlo con mi propio dominio me ocasiona problema con las librerías, y nunca en mi vida eh programado en android es la primera vez mira:
    Error:(13, 23) error: package org.apache.http does not exist
    Esta es una linea del resto y el otro problema es este:
    Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
    > Compilation failed; see the compiler error output for details.

    Alguien puede explicarme que puedo hacer?

    ResponderEliminar
  67. Hola Ramiro, programo con Netbeans, he visto en tus videos y realmente te felicito por la labor que haces, he visto como es el desempeno con Android Studio, por favor recomiendame una buena literatura para trabajar bien con Studio ya que con Netbeans como dicen en mi pais tarbajas a pulmon, gracias.

    ResponderEliminar
    Respuestas
    1. El getting started, guía ofical de google http://developer.android.com/intl/es/training/index.html
      Yo sinceramente, cuando empece no entendí nada de esta página.. aprendí a mucho YOUTUBE.. después cuando ya sabía un poco, la empece a mirar de nuevo.
      Porque la verdad cada uno subo lo que quiere.. donde puede estar bien, o puede estar mal.. en cambio lo developers.google, es lo oficial, siempre va a estar bien

      Eliminar
  68. Ramiro buenos tardes.

    Muy re bueno el tutorial. Tengo una duda, si es que ya inicio sesion en el Home de la aplicacion, como mantengo la sesion iniciada despues de cerrar la app. Al cerrarla me aparece denuevo el login en ves de que guarde la sesion.
    De antemano Muuuuchas gracias.

    ResponderEliminar
    Respuestas
    1. hay una función que ahora no recuerdo, es para que siga la app funcionando en el background, entonces la app sigue funcionando siempre.. la otra vez guardar el usuario y contraseña con sharepreference..

      Eliminar
  69. Hola tengo una mega duda, soy nueva en esto y me arriesgue hacer una app con lo sig:

    Estoy desarollando una app que lee codigos qr (ya lo hace) y que tambien agregre, consulte y elimine datos desde la app a la base de datos que esta hecha en MySQLworkbench, no entiendo muy bien como desarrollar esa parte, lei y tengo que hacerlo con un webservices, espero me puedan orientar se los agradeceria. Saludos

    ResponderEliminar
  70. Buenas crack, podrías hacer el json para versión apk mayor de 23?? ya que los métodos que usas quedan anticuados, gracias y un saludo!

    ResponderEliminar
    Respuestas
    1. nop, solo hago tutos nuevos y le queda al expectador en sacarle el provecho y actualizarlo.
      Siempre van es estar desactualizado además.

      Eliminar
  71. Gracias Ramiro me ha sido de mucha ayuda el tutorial. ;)

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

    ResponderEliminar
  73. Hola gracias por el tutorial, me ha servido demasiado, soy nueva con android y esta muy bien explicado, ya tengo todo pero en JSONParser.java me marca error en todas las librerias que tienen que ver con apache, me puse a investigar y encontre que es porque a la nueva version de android studio le quitaron apache, pero no puedo encontrar como hacer que funcione.
    Tambien dicen que hay que agregar algo al gradle, pero tampoco me funciona.

    Tienes alguna idea de como resolverlo porfavor. gracias.

    ResponderEliminar
  74. Hola; Que buen video FELICITACIONES, tengo la siguiente duda, entro en mi link correspondiente pero me sale de una
    {"success":0,"message":"Problema con la base de datos, vuelve a intentarlo"} y no me da más opciones como si no se estuviera conectando.

    El código fuente del archivo login.php esta sesión no lo esta tomando:

    if (!empty($_POST)) {
    //obtener los usuarios respecto a la usuario que llega por parámetro
    $query = "
    SELECT
    id,
    username,
    password
    FROM users
    WHERE
    username = :lifescom_lifes17
    ";

    $query_params = array(
    ':username' => $_POST['lifescom_lifes17']
    );

    try {
    $stmt = $db->prepare($query);
    $result = $stmt->execute($query_params);
    }
    catch (PDOException $ex) {
    //para testear pueden utilizar lo de abajo
    //die("la consulta murio " . $ex->getMessage());

    $response["success"] = 0;
    $response["message"] = "Problema con la base de datos, vuelve a intentarlo";
    die(json_encode($response));

    }

    Al parecer no está evaluando la condición inicial que es la de mostrar la información del usuario (id,username,password) y entra al apartado try para mostrar esta información
    $response["success"] = 0; $response["message"] = "Problema con la base de datos, vuelve a intentarlo";

    ResponderEliminar
    Respuestas
    1. tu error es que tu estas pasando como variable el :lifescom_lifes17, a la consulta y solo tienes como variable el :username.

      tu codigo seria algo asi:

      $query = "
      SELECT
      id,
      username,
      password
      FROM users
      WHERE
      username = :username
      ";

      $query_params = array(
      ':username' => $_POST['lifescom_lifes17']
      );

      Eliminar
    2. ah y una aclaracion que el $_POST[] es otra variable que envias con el submit o el json.
      ejemplo:

      etiqueta de formulario --> input type="text" name="username"

      cuando tu haces un submit el 'name' se envia con un post o get como una variable de esta forma:
      $_POST['username'] o $_GET['username'].

      espero que te sirva ;)

      Eliminar
  75. Hola me pueden ayudar cn la conxion a postgres

    ResponderEliminar
  76. Hola disculpa sabes que esto lo estoy probando de forma local con xammp pero al momento de correr en el emulador me sale app has stopped

    ResponderEliminar
  77. Hola a todos. La app en el emulador o en mi móvil si estoy conectada al wifi de casa me va perfectamente. El problema es cuando mi móvil está haciendo uso de los datos o tiene una dirección IP que no pertenece al rango de mi casa. Qué error puede ser? Cómo lo puedo solucionar? Gracias

    ResponderEliminar
  78. Que tal ramiro, muy buen video pero me sale el siguiente errror, te agradeceria si me pudieras ayudar.

    Te dejo el link para que veas el error:
    http://pruebabd.esy.es/luisconect/get_all_empresas.php

    ResponderEliminar
  79. Apenas me inicio y decidí empezar por hechar andar el servidor y por php. Tengo el problema con el register.php que me saca el error "Error base de datos2. Porfavor vuelve a intentarlo"}. Solo lo modifique para que recibiba mas datos la mase de datos, espero su ayuda (dejo el link del codigo mas abajo).

    http://pastebin.com/raw/PxgU5wnS

    ResponderEliminar
  80. hola rodrigo un favor me pasarias el usuario y la contraseña de la cuenta de hostinger de esta aplicacion por favor

    ResponderEliminar
  81. Hola Ramiro,

    Felicitaciones por tu maravilloso tutorial.

    He seguido todo tal cual , lo explicas en tus videos.
    Pero al momento de teclear en la barra del navegador , para comprobar la conexión con mi base de datos ( por cierto también uso Hostinger) me sale el siguiente error:

    Failed to connect to the database: SQLSTATE[28000] [1045] Access denied for user 'u812368499_lili'@'10.2.1.14' (using password: YES)


    AYuda!!!


    Gracias,

    ResponderEliminar
  82. Quiero autoresponderme , en este error, por si de caso , a alguien le ha tiene este mismo error,

    La solución es muy sencilla, se tiene que crear una nueva base de datos, hay que hacer un backup de la base de datos que teniamos creada inicialmente, y importamos nuestras tablas a esta nueva base de datos, esto para no tener que crear nuevamente nuestras tablas, !!!.

    Y funciona comprobado.

    Un saludo.

    ResponderEliminar
  83. Tenia el error con los archivos JSONParser, con las librerias
    org.apache.http.cliente

    Deciros que arriba hay un link para bajar un .jar, pues no sirve!! hablo para android studio, no se para las demás plataformas.

    Después de buscar mucho en google , he solucionado el problema,

    Incluir estas lineas, en el build gradle:


    compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'

    compile 'com.android.support:appcompat-v7:23.1.1'

    A mi me ha funcionado en Android Studio.

    ResponderEliminar
    Respuestas
    1. Exactamente en que parte del build gradle ??

      Eliminar
  84. Hola Ramiro tengo una pregunta los PHP los creas desde MySQL o por que medio los creas es que no me queda muy claro ?

    ResponderEliminar
    Respuestas
    1. Yo utilizo "Sublime Text 2" pero podes usar el que vos quieras, dreamweaver, notepad c++, etc. El que te resulte mas comodo.

      Eliminar
  85. Hola ramiro muchas gracias por el tutorial, ahora al momento de pegar el código se me generan una me serie de errores, me imagino que debe ser por que no tengo las librerías en el AndroidStudio que tu utilizaste , por favor dime el nombre delas librerías que utilizaste

    ResponderEliminar
    Respuestas
    1. Tenia errores en el JASONParser.java y en el Login.java Gracias al comentario MaliJ Solucione el error del JsonParser.java pero

      En el Login.java:

      Strings Username = user.getText().toStrings();
      Strings Password = pass.getText().toStrings();

      tengo este error, si alguien me puede ayudar con este error le agradecería bastante, gracias.

      Eliminar
  86. hola muy buenos tutoriales tengo una duda y necesito ayuda, tengo mi plicacion pero solo quiero mostrar el ultimo dato agregado a la base de datos y que me lo muestre en un textview, en que parte se puede tomar esta variable y mostrarla o hay que hacerle al JSON algo mas GRACIAS

    ResponderEliminar
    Respuestas
    1. eso se hace en el archivo de php....
      con un lastInsertId();

      Eliminar
  87. hola muy buenos tutoriales tengo una duda y necesito ayuda, tengo mi plicacion pero solo quiero mostrar el ultimo dato agregado a la base de datos y que me lo muestre en un textview, en que parte se puede tomar esta variable y mostrarla o hay que hacerle al JSON algo mas GRACIAS

    ResponderEliminar
    Respuestas
    1. tenes que trabajar con un archivo .php que extraiga el último registro, como se hace?. Tenes que ver el login.php y register.php ahí hago la consultas php.
      Extraes y los metes en los textbox

      Eliminar
  88. hola que tal, de antemano gracias por el turorial, tengo una duda no puedo importar lo siguiente:
    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.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.utils.URLEncodedUtils;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.json.JSONException;
    import org.json.JSONObject;

    ResponderEliminar
  89. Ami me da error en todas estas librerias:


    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.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.utils.URLEncodedUtils;
    import org.apache.http.impl.client.DefaultHttpClient;


    he probado en el gradle poner el legacy y nada, si me pude ayudar porfavor.

    ResponderEliminar
  90. Hola Ramiro , podrían actualizar este tutorial , ya que hay bastantes errores en las librerías de http client , y en Strings Username = user.getText().toStrings();
    Strings Password = pass.getText().toStrings(); tanto en la clase Login como en la Register , y por lo que veo para solucionarlo cambian bastante el código , se podría actualizar todo y si no fuera mucho agregar una opción para que muestre en un LAyout los datos de mi base , por ejemplo si quisiera ver los datos de un usuario registrado para modificarlo o darlo de baja ? , hace mucho pido esto podría ser por favor ?, desde ya muchas gracias .

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

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

    ResponderEliminar
  93. Hombre buenas noches, gracias por el tutorial está excelente pero lamentablemente no me funciona tal cual como usted, tengo un problema con estas librerías me salen en error.

    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.utils.URLEncodedUtils;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.json.JSONException;

    ResponderEliminar
    Respuestas
    1. Hola Sebastian como solucionaste el tema de las librerías, tengo el mismo problema.
      Saludos muchas Gracias

      Eliminar
    2. Agrega la siguiente linea en archivo build.gradle, en dependeces
      compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'

      Eliminar
  94. Muy cool el tutorial, lo logré hacer pero tengo una pregunta si deseo registrar mas datos como nombre o telefono o demas como lo haría ?

    ResponderEliminar
    Respuestas
    1. solo le agregas mas campos, hasta ahora son: user, pass
      debajo de estos, agregale nom, tel, y seguis todo el proceso

      Eliminar
    2. Hola que tal, estaría muy bien poder contar con un tutorial sobre como agregar más campos, puesto que intenté hacerlo y no es tan sencillo como "agregar más campos", estuve haciendolo y al parecer aún tengo algunos fallos al respecto. Saludos y buen tutorial.

      Eliminar
    3. en php seria agregar tus campos de esta forma.

      $query = "INSERT INTO usuarios ( username, password, correo, no_telefono, estatus ) VALUES ( :user, :pass , :email, :cell, '1') ";

      //actualizamos los token
      $query_params = array(
      ':user' => $_POST['username'],
      ':pass' => $_POST['password'],
      ':email' => $_POST['correo'],
      ':cell' => $_POST['no_telefono']
      );

      Eliminar
  95. Esta genial... Pero si tengo una aplicación y para inscribirme me pide mis datos y cuando lo lleno me corre directo a la aplicación ahora si deseo ingresar de nuevo me aparece el login ¿quisiera saber como se hace para que corra directo mi aplicación sin pedirme el login?

    ResponderEliminar
    Respuestas
    1. @Override
      protected void onResume() {
      super.onResume();
      String valor = preferencias.getString(getString(R.string.est_Telefono), "");
      if(!valor.equals("")){
      Intent Intent =new Intent(Registrar_Usuario.this,Validacion.class);
      startActivity(Intent);
      this.finish();
      }
      }

      Eliminar
    2. disculpa pero donde se agrega esa parte de codigo

      Eliminar
  96. Tengo un error quiero convinar esto con un login de facebook pero me genra errores en el API, como puedo arreglar eso,algunas librerías no son soportadas por el API23 y la de facebook me genera errores con el API 21

    ResponderEliminar
  97. Hola Tengo un error en los String username = user.getText().toString();
    String password = pass.getText().toString()

    Me deja Registrar a un nuevo usuario pero en el momento que voy a ingresar y no ingresa

    ResponderEliminar
  98. error Using Variables on UI Thread from Worker Thread

    ResponderEliminar
  99. para felicitarlo por los tutoriales, tengo un inconveniente con hostinger ya que no me deja crear una cuenta gratuita, me gustaría que me recomendara otro hosting gratuito y si puedes realizar un vídeo tutorial para su respectivo funcionamiento, muchas gracias y espero que me puedas colaborar.

    ResponderEliminar
    Respuestas
    1. quien me puede colaborar con lo siguiente:

      lo que pasa es que no me funcionó con hostinger gratuito entoces estoy utilizando 2freehosting.com y no se como sacar la URL para conectar la base de datos, ejemplo la de hostinger utilizan la siguiente URL: basesdedatosremota.meximas.com/cas/login.php

      Eliminar
  100. Hola, Ramiro.

    Llevo 5 días tratando de resolver mi problema al tratar de conectar mi app en Android con mi base de datos MySQL, alojada en mi servidor de Hostinger.

    Me parece bien tu método, pero a parte de éso, necesito que la app pueda usar buscar y usar atributos de alguna tabla de mi base de datos (alguno de estos atributos son de tipo MEDIUMBLOB, o sea, son archivos excel y pdf). Mi pregunta es: mediante JSON y alguna página que haga esa operación de descarga, yo prodría obtener esos archivos?

    Espero tu pronta respuesta. Saludos.

    ResponderEliminar
  101. Buenas , tengo un problema, al iniciar la apk en android se me sa
    le un problema el apk ya corriendo, es en el register dado que para crear una cuenta, apretando registe me sale "login incorrecto" se podra areglar ese problema ya que en el hosting funciona normalmente.

    gracias

    ResponderEliminar
  102. Hola ramiro, muy buen tutorial.
    Cuando paso la aplicacion a mi telefono, al presionar el boton login, me sale "aplicacion se detuvo"
    por qué será?
    cuando pruebo localhost:2020/login.php me funciona bien
    es como si el telefono no conecta con la base de datos
    que debo hacer? llevo días intentado solucionar el problema pero nada
    será que tengo que configurar algo en mi computadora?
    te agradeceria que me ayudaras por favor :(

    ResponderEliminar
  103. Ramiro, estoy iniciando en android y es una muy buena estrategia entrega la aplicacion con el acceso a la bd, normalmente cuando uno quiere aprender programacion solo encuentra errores y nada que funcione, en cambio en tu ejemplo de una tienes una aplicacion que funciona , muy buena esa estrategia ,, felicitaciones

    ResponderEliminar
  104. Buenas Ramiro.
    Antes de nada felicitarte por tus aportes. Me son súper útiles.
    Quería comentarte que en tu programa has puesto los: "String username = user.getText().toString(); y String password = pass.getText().toString();" dentro del doInBackground. Ésto peta porque pones una función de UI dentro de algo de ASYNC. Yo lo solucioné moviéndolo dentro de la función "OnClick".
    Espero que te ayude y sigue así crack, ayudas a mucha gente.
    Saludos,
    __Albert__

    ResponderEliminar
  105. hola tengo un problema cuando intento loguearme y se corta la conexion al internet la app se detiene y queria saber como puedo hacer que en vez que se detenga me salga algun mensaje o ejecutarlo en segundo plano tu que me recomiendas y buen tuto felicidades

    ResponderEliminar
  106. como puedo resolver este error que sale en estas lineas:

    String username = user.getText().toString();
    String password = pass.getText().toString();

    ResponderEliminar
    Respuestas
    1. Hola tengo Android 2.1.2 yo lo solucioné asi:

      en la clase Login, en el método onClick :

      @Override
      public void onClick(View v) {
      // TODO Auto-generated method stub
      switch (v.getId()) {
      case R.id.login:
      String username = user.getText().toString();
      String password = pass.getText().toString();
      new AttemptLogin().execute(username, password);
      break;
      case R.id.register:
      Intent i = new Intent(this, Register.class);
      startActivity(i);
      break;

      default:
      break;
      }
      }

      y despues en AttemptLogin en doInBackground... cambia los String username y String password:

      protected String doInBackground(String... args) {
      int success;
      String username = args[0],
      password = args[1];
      ...
      ...

      A mi me funcionó, saludos.

      YO TAMBIEN TENGO UN PROBLEMA EN EL METODO doInBackground de la clase Login, me tira error en Log.d("Login attempt" , json.toString()) Y EN LA CLASE AttemptLogin;

      el error que me tira es:

      NULL POINTER EXCEPTION

      ojalá y me puedan ayudar.

      Eliminar
  107. Hola buen dia como puedo solucionar el error que me da en el JSONParser ademas me tiraa error en el Login y el Registrer, ¿tiene que ver el nivel de API que estoy usando o tengo que hacer cambios al codigo?

    ResponderEliminar
  108. Hola Ramiro tengo problemas con el codigo podras subir un video actualizado sobre este mismo tema la verdad es muy interesante

    ResponderEliminar
  109. Cuando me intento logear sin tener conectado el cel a internet truena la app

    ResponderEliminar
  110. Buenas noches ramiro, tengo un problema cuando copio el codigo donde dice:
    import org.apache.http.NameValuePair;
    import org.apache.http.message.BasicNameValuePair;

    Me envia Error como podria solucionar.
    Gracias

    ResponderEliminar
  111. Hola Ramiro.
    Excelente tutorial.
    Realmente si funciona.

    Lo que tengo es un pequeño problema con los acentos y "ñ". En mi base de datos nos aparece el nombre o el datos completo.

    Cuando alguien quiere registrarse por ejemplo nombre es Néstor.
    En la tabla solo aparece "N" ...
    Cómo lo soluciono?

    ResponderEliminar
  112. buenas tardes Ramiro gracias por compartir tu conocimiento con un novato como yo , la app funciona de maravilla y de verdad agradezco tu dedicacion y esfuerzo en hacer estos videos , pero quisiera saber de que manera mantener iniciada la sesion y cerrarla , y tambien si hay alguna manera de saber quien esta en linea, t lo agradeceria muchisimo y sigue asi Dios t bendiga

    ResponderEliminar
  113. Te amo era justo lo que necesitaba... Funciona perfectamente. Gracias sigue asi.

    ResponderEliminar
  114. YO TAMBIEN TENGO UN PROBLEMA EN EL METODO doInBackground de la clase Login, me tira error en Log.d("Login attempt" , json.toString()) Y EN LA CLASE AttemptLogin;

    el error que me tira es:

    NULL POINTER EXCEPTION

    ojalá y me puedan ayudar.

    ResponderEliminar
  115. Hola y si quiero obtener datos y poner datos y actualizar datos desde dentro de la aplicación como se podría hacer? Esto solo valdría para login y registrar pero para modificar datos y actualizarlos y meter datos desde la misma aplicación no valdría no?

    ResponderEliminar
  116. Hola ! al iniciar todo bien después cuando me salgo al poner cualquier usuario aunque este incorrecto me deja entrar de nuevo crees puedas ayudarme?

    ResponderEliminar
  117. Alguien me puede ayudar?
    Llevo varios días con el mismo problema y no puedo más...
    He pasado de la api23 a la 18 para poder trabajar con las librerias Apache y he añadido en el Manifest compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2' . Y cuando pensaba que ya estaría todo arreglado me encuentro al ejecutar con esto:


    FAILURE: Build failed with an exception.

    * What went wrong:
    Execution failed for task ':app:processDebugResources'.
    > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Users\...\AppData\Local\Android\sdk\build-tools\23.0.3\aapt.exe'' finished with non-zero exit value 1

    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

    Un saludo

    ResponderEliminar
    Respuestas
    1. Ya lo solicione al cambiar la Api 23 a la 18 android se cargo no se como el sdk... Un saludo.

      Eliminar
  118. Tengo un problemilla a la hora de ejecutar la app.
    Se que me funciona los .php porque los probé pero cuando quiero ejecutar la app desde android rompe a la hora de entrar en el registro o login (he de decir que antes tengo un menú por el cual tengo 2 botones registrarse y loguearse, tu escoges y te llevan a sus correspondientes views).

    Los errores que me salen por pantalla al querer acceder al register me sale que se debe al params.add(new BasicNameValuePair("username", username[0]));
    Y por este problema me salen 2 más en la clase JSONParser. Es como si no le estuviera pasando ningun valor o no lo reconociera...

    El uso de username[0] se debe a que tengo una variable global que la llamo String iniciarSesion[];

    Se agradecería mucho la ayuda...


    Saludo.

    ResponderEliminar
  119. Tengo problemas cuando ejecuto la maquina virtual al conectar con:
    private static final String LOGIN_URL = "http://localhost/cas/login.php";

    ResponderEliminar
  120. hola a la hora de querer correr mi consulta me manda este error a que se debe.

    Notice: Undefined variable: login_ok in C:\xampp\htdocs\UThuejotzingo\consulta.php on line 52
    {"success":0,"message":"Login INCORRECTO"}

    Y la linea tiene esto
    if ($login_ok) {
    $response["success"] = 1;
    $response["message"] = "Login correcto!";
    die(json_encode($response));
    } else {
    $response["success"] = 0;
    $response["message"] = "Login INCORRECTO";

    die(json_encode($response));
    }

    ResponderEliminar
  121. hola ramiro muchas gracias por los video tutoriales disculpa que te moleste pero como le puedo hacer que por medio de un qr me mande a otro activity

    ResponderEliminar
  122. Hola Ramiro, excelente aporte, funciona a la perfección la aplicación.
    Yo la echado a andar perfectamente, pero hace unos dias me ha dado un error en:

    JSONObject json =jsonParser.makeHttpRequest(LOGIN_URL, "POST", params);

    En concreto makeHttpRequest, he probado cambiando la version del sdk, incluyendo múltiples librerias, etc. Y no he dado con la tecla.

    Alguna idea de como se puede solventar el error??

    pd: estoy trabajando con:
    compileSdkVersion 25
    minSdkVersion 19
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"

    Un saludo

    ResponderEliminar