In my previous article Android Login and Registration Screen Design I explained designing the login and registration interfaces. But it has no real time functionality. In this tutorial I am going to explain how to build complete login and registration system in android using PHP, MySQL and SQLite. Also this tutorial covers how to build simple API using PHP and MySQL.

android login and registration screen design

Below are the final outputs of this project.

android login and registration with mysql php

Prerequisites

This tutorial is combination of few of my previous articles. Make sure you went through the below articles if you are very beginner.

1. Android working with Volley Library – Used to make HTTP calls.

2. Android Login and Registration Screen Design – Explained the designing of Login and Registration screens.

API (Application Programming Interface)

To interact with MySQL database we need to build a REST API first. REST Api job is to get the request from client, interact with database and finally give the response back to client. So we’ll create a simple PHP, MySQL API first. Our API do’s below jobs.

Accepts requests in GET/POST methods
Interact with database by inserting / fetching data.
Finally will give response back in JSON format

Android Mysql PHP connect

1. Downloading & Installing WAMP

Download & Install WAMP server from www.wampserver.com/en/. Once installed, launch the program from Start ⇒ All Programs ⇒ WampServer ⇒ StartWampServer. If you are on Mac, alternatively you can use MAMP for the same.

You can test your server by opening the address http://localhost/ in your browser. Also you can check phpmyadmin by opening http://localhost/phpmyadmin

Following is a screencast of Downloading and Installing WAMP Server.

2. Creating MySQL Database and Tables

Open phpmyadmin and execute below queries to create necessary database and table. Here we are creating only one table users to store users login information.

create database android_api /** Creating Database **/

use android_api /** Selecting Database **/

create table users(
   id 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 **/

3. Creating PHP Project

Goto the location where wamp installed and open www folder. The default installation location of wamp would be C:/wamp. Below is the final PHP project structure we are going to create in this article.

android-login-and-registration-project-structure

1. Go into www folder and create a folder named android_login_api. This will be the root directory of our project.

2. In android_login_api, create another directory named include. In this folder, we keep all the helper classes.

3. Now inside include, create a php file named Config.php and add below content. Replace the DB_USER and DB_PASSWORD values with your’s.

<?php

/**
 * Database config variables
 */
define("DB_HOST", "localhost");
define("DB_USER", "root");
define("DB_PASSWORD", "root");
define("DB_DATABASE", "android_api");
?>

4. Create a class named DB_Connect.php in include and paste below code. In this class we handle opening and closing of database connection.

<?php
class DB_Connect {
    private $conn;

    // Connecting to database
    public function connect() {
        require_once 'include/Config.php';
        
        // Connecting to mysql database
        $this->conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
        
        // return database handler
        return $this->conn;
    }
}

?>

5. Create DB_Functions.php inside include with below content. This file contains functions to store user in database, get user from database. You can also add methods like update user, delete user.
unique id – I am generating unique user id in php using uniqid(”, true) function. Sample user id will be like 4f074eca601fb8.88015924
Encrypted Password – The passwords are stored using base64_encode method. Each password needs two columns to store it in database. One is to store encrypted password and other is to store salt used to encrypt the password.

<?php

/**
 * @author Ravi Tamada
 * @link https://www.androidhive.info/2012/01/android-login-and-registration-with-php-mysql-and-sqlite/ Complete tutorial
 */

class DB_Functions {

    private $conn;

    // constructor
    function __construct() {
        require_once 'DB_Connect.php';
        // connecting to database
        $db = new Db_Connect();
        $this->conn = $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

        $stmt = $this->conn->prepare("INSERT INTO users(unique_id, name, email, encrypted_password, salt, created_at) VALUES(?, ?, ?, ?, ?, NOW())");
        $stmt->bind_param("sssss", $uuid, $name, $email, $encrypted_password, $salt);
        $result = $stmt->execute();
        $stmt->close();

        // check for successful store
        if ($result) {
            $stmt = $this->conn->prepare("SELECT * FROM users WHERE email = ?");
            $stmt->bind_param("s", $email);
            $stmt->execute();
            $user = $stmt->get_result()->fetch_assoc();
            $stmt->close();

            return $user;
        } else {
            return false;
        }
    }

    /**
     * Get user by email and password
     */
    public function getUserByEmailAndPassword($email, $password) {

        $stmt = $this->conn->prepare("SELECT * FROM users WHERE email = ?");

        $stmt->bind_param("s", $email);

        if ($stmt->execute()) {
            $user = $stmt->get_result()->fetch_assoc();
            $stmt->close();

            // verifying user password
            $salt = $user['salt'];
            $encrypted_password = $user['encrypted_password'];
            $hash = $this->checkhashSSHA($salt, $password);
            // check for password equality
            if ($encrypted_password == $hash) {
                // user authentication details are correct
                return $user;
            }
        } else {
            return NULL;
        }
    }

    /**
     * Check user is existed or not
     */
    public function isUserExisted($email) {
        $stmt = $this->conn->prepare("SELECT email from users WHERE email = ?");

        $stmt->bind_param("s", $email);

        $stmt->execute();

        $stmt->store_result();

        if ($stmt->num_rows > 0) {
            // user existed 
            $stmt->close();
            return true;
        } else {
            // user not existed
            $stmt->close();
            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;
    }

}

?>

3.1 Registration Endpoint

Now we have all the required classes ready. Let’s start creating the endpoint for user registration. This endpoint accepts name, email and password as POST parameters and store the user in MySQL database.

6. In android_login_api root directory, create register.php and below code.

<?php

require_once 'include/DB_Functions.php';
$db = new DB_Functions();

// json response array
$response = array("error" => FALSE);

if (isset($_POST['name']) && isset($_POST['email']) && isset($_POST['password'])) {

    // receiving the post params
    $name = $_POST['name'];
    $email = $_POST['email'];
    $password = $_POST['password'];

    // check if user is already existed with the same email
    if ($db->isUserExisted($email)) {
        // user already existed
        $response["error"] = TRUE;
        $response["error_msg"] = "User already existed with " . $email;
        echo json_encode($response);
    } else {
        // create a new user
        $user = $db->storeUser($name, $email, $password);
        if ($user) {
            // user stored successfully
            $response["error"] = FALSE;
            $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"] = TRUE;
            $response["error_msg"] = "Unknown error occurred in registration!";
            echo json_encode($response);
        }
    }
} else {
    $response["error"] = TRUE;
    $response["error_msg"] = "Required parameters (name, email or password) is missing!";
    echo json_encode($response);
}
?>

3.2 Login Endpoint

Just like registration, we need to create another endpoint for login. This endpoint accepts email and password as POST parameters. After receiving the email and password, it checks in database for matched user. If the user is matched, it echoes the success the json response.

7. Create a php file named login.php inside android_login_api with the below content.

<?php
require_once 'include/DB_Functions.php';
$db = new DB_Functions();

// json response array
$response = array("error" => FALSE);

if (isset($_POST['email']) && isset($_POST['password'])) {

    // receiving the post params
    $email = $_POST['email'];
    $password = $_POST['password'];

    // get the user by email and password
    $user = $db->getUserByEmailAndPassword($email, $password);

    if ($user != false) {
        // use is found
        $response["error"] = FALSE;
        $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 is not found with the credentials
        $response["error"] = TRUE;
        $response["error_msg"] = "Login credentials are wrong. Please try again!";
        echo json_encode($response);
    }
} else {
    // required post params is missing
    $response["error"] = TRUE;
    $response["error_msg"] = "Required parameters email or password is missing!";
    echo json_encode($response);
}
?>

3.3 Types of JSON Responses

The following are the different types of JSON responses for registration and login endpoints.

3.3.1 Registration

URL: http://localhost/android_login_api/register.php

PARAMS: name, email, password

Registration success response

{
    "error": false,
    "uid": "55fa7220a2c187.50984590",
    "user": {
        "name": "Ravi Tamada",
        "email": "ravi@androidhive.info",
        "created_at": "2015-09-17 13:26:16",
        "updated_at": null
    }
}

Registration error in storing

{
    "error": 1,
    "error_msg": "Unknown error occurred in registration!"
}

Registration error – User Already Existed

{
    "success": 0,
    "error": 2,
    "error_msg": "User already existed with ravi8x@androidhive.info"
}

3.3.2 Login

URL: http://localhost/android_login_api/login.php

PARAMS: email, password

Login Success

{
    "error": false,
    "uid": "55fa7220a2c187.50984590",
    "user": {
        "name": "Ravi Tamada",
        "email": "ravi@androidhive.info",
        "created_at": "2015-09-17 13:26:16",
        "updated_at": null
    }
}

Login error – Incorrect username / password

{
    "tag": "login",
    "success": 0,
    "error": 1,
    "error_msg": "Login credentials are incorrect. Please try again!"
}

Now we have completed the PHP part. Let’s start the android part.

4. Creating the Android Project

The app we’re gonna build will have three simple screens Login Screen, Registration Screen and a welcome Dashboard Screen.

1. In Android Studio, create a new project from File ⇒ New Project and fill all the required details.

2. Create three packages named app, activity and helper under src folder.

3. Open build.gradle and add volley library support by adding
compile ‘com.mcxiaoke.volley:library-aar:1.0.0’ under dependencies.

dependencies {
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'com.mcxiaoke.volley:library-aar:1.0.0'
}

4. Open strings.xml located under res ⇒ values and add below string values.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Android Login and Registration</string>
    <string name="hint_email">Email</string>
    <string name="hint_password">Password</string>
    <string name="hint_name">Fullname</string>
    <string name="btn_login">LOGIN</string>
    <string name="btn_register">REGISTER</string>
    <string name="btn_link_to_register">Not a member? Sign up now.</string>
    <string name="btn_link_to_login">Already registred! Login Me.</string>
    <string name="welcome">Welcome</string>
    <string name="btn_logout">LOGOUT</string>
    <string name="name">Fullname</string>

</resources>

5. Open colors.xml located under res ⇒ values and add the color values. If you don’t find colors.xml, create a new file with the name.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <color name="bg_login">#26ae90</color>
    <color name="bg_register">#2e3237</color>
    <color name="bg_main">#428bca</color>
    <color name="white">#ffffff</color>
    <color name="input_login">#222222</color>
    <color name="input_login_hint">#999999</color>
    <color name="input_register">#888888</color>
    <color name="input_register_bg">#3b4148</color>
    <color name="input_register_hint">#5e6266</color>
    <color name="btn_login">#26ae90</color>
    <color name="btn_login_bg">#eceef1</color>
    <color name="lbl_name">#333333</color>
    <color name="btn_logut_bg">#ff6861</color>

</resources>

6. Under app package create a class named AppConfig.java and add below code. In this class we declare the login and registration urls. While testing you need to replace the ip address with your localhost pc ip.

package info.androidhive.loginandregistration.app;

public class AppConfig {
	// Server user login url
	public static String URL_LOGIN = "http://192.168.0.102/android_login_api/login.php";

	// Server user register url
	public static String URL_REGISTER = "http://192.168.0.102/android_login_api/register.php";
}

7. Under app package, create a class named AppController.java. This class extends from Application which should be executed on app launch. In this class we initiate all the volley core objects.

package info.androidhive.loginandregistration.app;

import android.app.Application;
import android.text.TextUtils;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

public class AppController extends Application {

	public static final String TAG = AppController.class.getSimpleName();

	private RequestQueue mRequestQueue;

	private static AppController mInstance;

	@Override
	public void onCreate() {
		super.onCreate();
		mInstance = this;
	}

	public static synchronized AppController getInstance() {
		return mInstance;
	}

	public RequestQueue getRequestQueue() {
		if (mRequestQueue == null) {
			mRequestQueue = Volley.newRequestQueue(getApplicationContext());
		}

		return mRequestQueue;
	}

	public <T> void addToRequestQueue(Request<T> req, String tag) {
		req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
		getRequestQueue().add(req);
	}

	public <T> void addToRequestQueue(Request<T> req) {
		req.setTag(TAG);
		getRequestQueue().add(req);
	}

	public void cancelPendingRequests(Object tag) {
		if (mRequestQueue != null) {
			mRequestQueue.cancelAll(tag);
		}
	}
}

8. Now open AndroidManifest.xml and add INTERNET permission. Add the AppController class to <application> tag. Also add other activities (LoginActivity, RegisterActivity and MainActivity) which we are going to create shortly. I am keeping LoginActivity as launcher activity as it should be seen on app launch.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="info.androidhive.loginandregistration"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="21" />

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

    <application
        android:name="info.androidhive.loginandregistration.app.AppController"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".LoginActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop"
            android:windowSoftInputMode="adjustPan" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".RegisterActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop"
            android:windowSoftInputMode="adjustPan" />
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop" />
    </application>

</manifest>

9. Under helper package, create a class named SessionManager.java and add below code. This class maintains session data across the app using the SharedPreferences. We store a boolean flag isLoggedIn in shared preferences to check the login status.

My previous article Android User Session Management using Shared Preferences gives you a good overview of managing the session data using SharedPreferences.

package info.androidhive.loginandregistration.helper;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;

public class SessionManager {
	// LogCat tag
	private static String TAG = SessionManager.class.getSimpleName();

	// Shared Preferences
	SharedPreferences pref;

	Editor editor;
	Context _context;

	// Shared pref mode
	int PRIVATE_MODE = 0;

	// Shared preferences file name
	private static final String PREF_NAME = "AndroidHiveLogin";
	
	private static final String KEY_IS_LOGGEDIN = "isLoggedIn";

	public SessionManager(Context context) {
		this._context = context;
		pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
		editor = pref.edit();
	}

	public void setLogin(boolean isLoggedIn) {

		editor.putBoolean(KEY_IS_LOGGEDIN, isLoggedIn);

		// commit changes
		editor.commit();

		Log.d(TAG, "User login session modified!");
	}
	
	public boolean isLoggedIn(){
		return pref.getBoolean(KEY_IS_LOGGEDIN, false);
	}
}

10. Under helper package, create a class named SQLiteHandler.java and paste the below code. This class takes care of storing the user data in SQLite database. Whenever we needs to get the logged in user information, we fetch from SQLite instead of making request to server.

/**
 * Author: Ravi Tamada
 * URL: www.androidhive.info
 * twitter: http://twitter.com/ravitamada
 * */
package info.androidhive.loginandregistration.helper;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.util.HashMap;

public class SQLiteHandler extends SQLiteOpenHelper {

	private static final String TAG = SQLiteHandler.class.getSimpleName();

	// 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_USER = "user";

	// 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 SQLiteHandler(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	// Creating Tables
	@Override
	public void onCreate(SQLiteDatabase db) {
		String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_USER + "("
				+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
				+ KEY_EMAIL + " TEXT UNIQUE," + KEY_UID + " TEXT,"
				+ KEY_CREATED_AT + " TEXT" + ")";
		db.execSQL(CREATE_LOGIN_TABLE);

		Log.d(TAG, "Database tables created");
	}

	// Upgrading database
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// Drop older table if existed
		db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER);

		// 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
		long id = db.insert(TABLE_USER, null, values);
		db.close(); // Closing database connection

		Log.d(TAG, "New user inserted into sqlite: " + id);
	}

	/**
	 * Getting user data from database
	 * */
	public HashMap<String, String> getUserDetails() {
		HashMap<String, String> user = new HashMap<String, String>();
		String selectQuery = "SELECT  * FROM " + TABLE_USER;

		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
		Log.d(TAG, "Fetching user from Sqlite: " + user.toString());

		return user;
	}

	/**
	 * Re crate database Delete all tables and create them again
	 * */
	public void deleteUsers() {
		SQLiteDatabase db = this.getWritableDatabase();
		// Delete All Rows
		db.delete(TABLE_USER, null, null);
		db.close();

		Log.d(TAG, "Deleted all user info from sqlite");
	}

}

4.1 Adding the Login Screen

Now we’ll implement the login module by creating the screen and adding the code to make login request to php, mysql server.

11. Create an xml file named activity_login.xml under res ⇒ layout.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/bg_login"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="10dp" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:orientation="vertical"
        android:paddingLeft="20dp"
        android:paddingRight="20dp" >

        <EditText
            android:id="@+id/email"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:background="@color/white"
            android:hint="@string/hint_email"
            android:inputType="textEmailAddress"
            android:padding="10dp"
            android:singleLine="true"
            android:textColor="@color/input_login"
            android:textColorHint="@color/input_login_hint" />

        <EditText
            android:id="@+id/password"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:background="@color/white"
            android:hint="@string/hint_password"
            android:inputType="textPassword"
            android:padding="10dp"
            android:singleLine="true"
            android:textColor="@color/input_login"
            android:textColorHint="@color/input_login_hint" />

        <!-- Login Button -->

        <Button
            android:id="@+id/btnLogin"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dip"
            android:background="@color/btn_login_bg"
            android:text="@string/btn_login"
            android:textColor="@color/btn_login" />

        <!-- Link to Login 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="@string/btn_link_to_register"
            android:textAllCaps="false"
            android:textColor="@color/white"
            android:textSize="15dp" />
    </LinearLayout>

</LinearLayout>

12. Create an activity class named LoginActivity.java under activity package. In this class

checkLogin() – Method verifies the login details on the server by making the volley http request.

/**
 * Author: Ravi Tamada
 * URL: www.androidhive.info
 * twitter: http://twitter.com/ravitamada
 */
package info.androidhive.loginandregistration.activity;

import android.app.Activity;
import android.app.ProgressDialog;
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.Toast;

import com.android.volley.Request.Method;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

import info.androidhive.loginandregistration.R;
import info.androidhive.loginandregistration.app.AppConfig;
import info.androidhive.loginandregistration.app.AppController;
import info.androidhive.loginandregistration.helper.SQLiteHandler;
import info.androidhive.loginandregistration.helper.SessionManager;

public class LoginActivity extends Activity {
    private static final String TAG = RegisterActivity.class.getSimpleName();
    private Button btnLogin;
    private Button btnLinkToRegister;
    private EditText inputEmail;
    private EditText inputPassword;
    private ProgressDialog pDialog;
    private SessionManager session;
    private SQLiteHandler db;

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

        inputEmail = (EditText) findViewById(R.id.email);
        inputPassword = (EditText) findViewById(R.id.password);
        btnLogin = (Button) findViewById(R.id.btnLogin);
        btnLinkToRegister = (Button) findViewById(R.id.btnLinkToRegisterScreen);

        // Progress dialog
        pDialog = new ProgressDialog(this);
        pDialog.setCancelable(false);

        // SQLite database handler
        db = new SQLiteHandler(getApplicationContext());

        // Session manager
        session = new SessionManager(getApplicationContext());

        // Check if user is already logged in or not
        if (session.isLoggedIn()) {
            // User is already logged in. Take him to main activity
            Intent intent = new Intent(LoginActivity.this, MainActivity.class);
            startActivity(intent);
            finish();
        }

        // Login button Click Event
        btnLogin.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {
                String email = inputEmail.getText().toString().trim();
                String password = inputPassword.getText().toString().trim();

                // Check for empty data in the form
                if (!email.isEmpty() && !password.isEmpty()) {
                    // login user
                    checkLogin(email, password);
                } else {
                    // Prompt user to enter credentials
                    Toast.makeText(getApplicationContext(),
                            "Please enter the credentials!", Toast.LENGTH_LONG)
                            .show();
                }
            }

        });

        // Link to Register Screen
        btnLinkToRegister.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {
                Intent i = new Intent(getApplicationContext(),
                        RegisterActivity.class);
                startActivity(i);
                finish();
            }
        });

    }

    /**
     * function to verify login details in mysql db
     * */
    private void checkLogin(final String email, final String password) {
        // Tag used to cancel the request
        String tag_string_req = "req_login";

        pDialog.setMessage("Logging in ...");
        showDialog();

        StringRequest strReq = new StringRequest(Method.POST,
                AppConfig.URL_LOGIN, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                Log.d(TAG, "Login Response: " + response.toString());
                hideDialog();

                try {
                    JSONObject jObj = new JSONObject(response);
                    boolean error = jObj.getBoolean("error");

                    // Check for error node in json
                    if (!error) {
                        // user successfully logged in
                        // Create login session
                        session.setLogin(true);

                        // Now store the user in SQLite
                        String uid = jObj.getString("uid");

                        JSONObject user = jObj.getJSONObject("user");
                        String name = user.getString("name");
                        String email = user.getString("email");
                        String created_at = user
                                .getString("created_at");

                        // Inserting row in users table
                        db.addUser(name, email, uid, created_at);

                        // Launch main activity
                        Intent intent = new Intent(LoginActivity.this,
                                MainActivity.class);
                        startActivity(intent);
                        finish();
                    } else {
                        // Error in login. Get the error message
                        String errorMsg = jObj.getString("error_msg");
                        Toast.makeText(getApplicationContext(),
                                errorMsg, Toast.LENGTH_LONG).show();
                    }
                } catch (JSONException e) {
                    // JSON error
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                }

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "Login Error: " + error.getMessage());
                Toast.makeText(getApplicationContext(),
                        error.getMessage(), Toast.LENGTH_LONG).show();
                hideDialog();
            }
        }) {

            @Override
            protected Map<String, String> getParams() {
                // Posting parameters to login url
                Map<String, String> params = new HashMap<String, String>();
                params.put("email", email);
                params.put("password", password);

                return params;
            }

        };

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
    }

    private void showDialog() {
        if (!pDialog.isShowing())
            pDialog.show();
    }

    private void hideDialog() {
        if (pDialog.isShowing())
            pDialog.dismiss();
    }
}

Now if you run the app, you should see the login screen. But login might not work as we don’t have any user information in mysql database. That can be done by adding the registration screen.

android login screen design

4.1 Adding the Registration Screen

13. Create an xml layout named activity_register.xml under res ⇒ layout.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/bg_register"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="10dp" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:orientation="vertical"
        android:paddingLeft="20dp"
        android:paddingRight="20dp" >

        <EditText
            android:id="@+id/name"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:background="@color/input_register_bg"
            android:hint="@string/hint_name"
            android:padding="10dp"
            android:singleLine="true"
            android:inputType="textCapWords"
            android:textColor="@color/input_register"
            android:textColorHint="@color/input_register_hint" />

        <EditText
            android:id="@+id/email"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:background="@color/input_register_bg"
            android:hint="@string/hint_email"
            android:inputType="textEmailAddress"
            android:padding="10dp"
            android:singleLine="true"
            android:textColor="@color/input_register"
            android:textColorHint="@color/input_register_hint" />

        <EditText
            android:id="@+id/password"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:background="@color/input_register_bg"
            android:hint="@string/hint_password"
            android:inputType="textPassword"
            android:padding="10dp"
            android:singleLine="true"
            android:textColor="@color/input_register"
            android:textColorHint="@color/input_register_hint" />

        <!-- Login Button -->

        <Button
            android:id="@+id/btnRegister"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dip"
            android:background="#ea4c88"
            android:text="@string/btn_register"
            android:textColor="@color/white" />

        <!-- 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="@string/btn_link_to_login"
            android:textAllCaps="false"
            android:textColor="@color/white"
            android:textSize="15dp" />
    </LinearLayout>

</LinearLayout>

14. Create an activity class named RegisterActivity.java under activity package.

registerUser() – Will store the user by passing name, email and password to php,mysql server.

db.addUser() – Will insert the user in SQLite database once he is successfully registered.

/**
 * Author: Ravi Tamada
 * URL: www.androidhive.info
 * twitter: http://twitter.com/ravitamada
 */
package info.androidhive.loginandregistration.activity;

import android.app.Activity;
import android.app.ProgressDialog;
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.Toast;

import com.android.volley.Request.Method;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

import info.androidhive.loginandregistration.R;
import info.androidhive.loginandregistration.app.AppConfig;
import info.androidhive.loginandregistration.app.AppController;
import info.androidhive.loginandregistration.helper.SQLiteHandler;
import info.androidhive.loginandregistration.helper.SessionManager;

public class RegisterActivity extends Activity {
    private static final String TAG = RegisterActivity.class.getSimpleName();
    private Button btnRegister;
    private Button btnLinkToLogin;
    private EditText inputFullName;
    private EditText inputEmail;
    private EditText inputPassword;
    private ProgressDialog pDialog;
    private SessionManager session;
    private SQLiteHandler db;

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

        inputFullName = (EditText) findViewById(R.id.name);
        inputEmail = (EditText) findViewById(R.id.email);
        inputPassword = (EditText) findViewById(R.id.password);
        btnRegister = (Button) findViewById(R.id.btnRegister);
        btnLinkToLogin = (Button) findViewById(R.id.btnLinkToLoginScreen);

        // Progress dialog
        pDialog = new ProgressDialog(this);
        pDialog.setCancelable(false);

        // Session manager
        session = new SessionManager(getApplicationContext());

        // SQLite database handler
        db = new SQLiteHandler(getApplicationContext());

        // Check if user is already logged in or not
        if (session.isLoggedIn()) {
            // User is already logged in. Take him to main activity
            Intent intent = new Intent(RegisterActivity.this,
                    MainActivity.class);
            startActivity(intent);
            finish();
        }

        // Register Button Click event
        btnRegister.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                String name = inputFullName.getText().toString().trim();
                String email = inputEmail.getText().toString().trim();
                String password = inputPassword.getText().toString().trim();

                if (!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) {
                    registerUser(name, email, password);
                } else {
                    Toast.makeText(getApplicationContext(),
                            "Please enter your details!", Toast.LENGTH_LONG)
                            .show();
                }
            }
        });

        // Link to Login Screen
        btnLinkToLogin.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {
                Intent i = new Intent(getApplicationContext(),
                        LoginActivity.class);
                startActivity(i);
                finish();
            }
        });

    }

    /**
     * Function to store user in MySQL database will post params(tag, name,
     * email, password) to register url
     * */
    private void registerUser(final String name, final String email,
                              final String password) {
        // Tag used to cancel the request
        String tag_string_req = "req_register";

        pDialog.setMessage("Registering ...");
        showDialog();

        StringRequest strReq = new StringRequest(Method.POST,
                AppConfig.URL_REGISTER, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                Log.d(TAG, "Register Response: " + response.toString());
                hideDialog();

                try {
                    JSONObject jObj = new JSONObject(response);
                    boolean error = jObj.getBoolean("error");
                    if (!error) {
                        // User successfully stored in MySQL
                        // Now store the user in sqlite
                        String uid = jObj.getString("uid");

                        JSONObject user = jObj.getJSONObject("user");
                        String name = user.getString("name");
                        String email = user.getString("email");
                        String created_at = user
                                .getString("created_at");

                        // Inserting row in users table
                        db.addUser(name, email, uid, created_at);

                        Toast.makeText(getApplicationContext(), "User successfully registered. Try login now!", Toast.LENGTH_LONG).show();

                        // Launch login activity
                        Intent intent = new Intent(
                                RegisterActivity.this,
                                LoginActivity.class);
                        startActivity(intent);
                        finish();
                    } else {

                        // Error occurred in registration. Get the error
                        // message
                        String errorMsg = jObj.getString("error_msg");
                        Toast.makeText(getApplicationContext(),
                                errorMsg, Toast.LENGTH_LONG).show();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "Registration Error: " + error.getMessage());
                Toast.makeText(getApplicationContext(),
                        error.getMessage(), Toast.LENGTH_LONG).show();
                hideDialog();
            }
        }) {

            @Override
            protected Map<String, String> getParams() {
                // Posting params to register url
                Map<String, String> params = new HashMap<String, String>();
                params.put("name", name);
                params.put("email", email);
                params.put("password", password);

                return params;
            }

        };

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
    }

    private void showDialog() {
        if (!pDialog.isShowing())
            pDialog.show();
    }

    private void hideDialog() {
        if (pDialog.isShowing())
            pDialog.dismiss();
    }
}

Run the app and navigate to register screen by tapping on the link below login button.

android registration screen design

4.3 Adding the Home Screen

Until now we are done with both login and registration screen. Now we’ll add the final screen to show the logged in user information. This information will be fetched from SQLite database once user is logged in.

15. Create an xml file named activity_main.xml under res ⇒ layout and add below code.

<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"
    tools:context="${relativePackage}.${activityClass}" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:gravity="center"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/welcome"
            android:textSize="20dp" />

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:textColor="@color/lbl_name"
            android:textSize="24dp" />

        <TextView
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="13dp" />

        <Button
            android:id="@+id/btnLogout"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="40dip"
            android:background="@color/btn_logut_bg"
            android:text="@string/btn_logout"
            android:textAllCaps="false"
            android:textColor="@color/white"
            android:textSize="15dp" />
    </LinearLayout>

</RelativeLayout>

16. Open the MainActivity.java and do below changes. Here we are just fetching the logged user information from SQLite and displaying it on the screen. The logout button will logout the user by clearing the session and deleting the user from SQLite table.

package info.androidhive.loginandregistration;

import info.androidhive.loginandregistration.helper.SQLiteHandler;
import info.androidhive.loginandregistration.helper.SessionManager;

import java.util.HashMap;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView txtName;
	private TextView txtEmail;
	private Button btnLogout;

	private SQLiteHandler db;
	private SessionManager session;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		txtName = (TextView) findViewById(R.id.name);
		txtEmail = (TextView) findViewById(R.id.email);
		btnLogout = (Button) findViewById(R.id.btnLogout);

		// SqLite database handler
		db = new SQLiteHandler(getApplicationContext());

		// session manager
		session = new SessionManager(getApplicationContext());

		if (!session.isLoggedIn()) {
			logoutUser();
		}

		// Fetching user details from sqlite
		HashMap<String, String> user = db.getUserDetails();

		String name = user.get("name");
		String email = user.get("email");

		// Displaying the user details on the screen
		txtName.setText(name);
		txtEmail.setText(email);

		// Logout button click event
		btnLogout.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				logoutUser();
			}
		});
	}

	/**
	 * Logging out the user. Will set isLoggedIn flag to false in shared
	 * preferences Clears the user data from sqlite users table
	 * */
	private void logoutUser() {
		session.setLogin(false);

		db.deleteUsers();

		// Launching the login activity
		Intent intent = new Intent(MainActivity.this, LoginActivity.class);
		startActivity(intent);
		finish();
	}
}

Now if you run the app, you should see the below screen after successful login.

android welcome dashboard screen after login

5. Testing the App

For a beginner it will be always difficult to run this project for the first time. But don’t worry, the following steps will helps you testing this app. (The ip address looks like 192.168.0.100)

Make sure that both devices (the device running the PHP project and the android device) are on the same wifi network.

Give correct username , password and database name of MySQL in Config.php

Replace the URL ip address of URL_LOGIN and URL_REGISTER in AppConfig.java with your machine ip address. You can get the ip address by running ipconfig in cmd

What’s Next?

If you understand this article very clearly, its time to improvise your knowledge by following the below articles.

> Read How to create REST API for Android app using PHP, Slim and MySQL to learn how to develop a proper REST API for your android app.

> Android Hosting PHP, MySQL RESTful services to DigitalOcean explains how to deploy your REST services online. So that the urls will be accessible globally.

Change Log

Updated On 28th Feb 2016 (Android Studio IDE)
Subscribe
Notify of
guest
973 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
trackback

[…] Android Login and Registration with PHP, MySQL and SQLiteTutorial about android login and registration process using PHP,MySql and Sqlite . … android:textColor="#21dbd4" android:textStyle="bold" /> </LinearLayout> … […]

trackback

[…] am making a simple logging system in android. I am following this tutorial. While testing my app I am keep getting NullException error. This error is on this line […]

trackback

[…] have been trying to follow this tutorial:http://www.androidhive.info/2012/01/android-login-and-registration-with-php-mysql-and-sqlite/. It is to create an android login app. I’ve read through the comments and it does not […]

trackback

[…] have been trying to follow this tutorial:http://www.androidhive.info/2012/01/android-login-and-registration-with-php-mysql-and-sqlite/. It is to create an android login app. I’ve read through the comments and it does not […]

trackback

[…] Android Login and Registration with PHP, MySQL and SQLite Mindenkiben észreveszem a jót, a szeretetreméltót.Related posts: […]

rajeev
rajeev
3 years ago

Hi Getting error Required param name or email or password is missing can u please tell me what is the error

Here is the android conection source code can u please let me know what is the error

URL url = new URL(“http://192.168.43.113/android_login_api/register.php”);

HttpURLConnection http = (HttpURLConnection)url.openConnection();

//if(http.getResponseCode() == HttpURLConnection.HTTP_OK){
Log.d(“con”,” “+”Connected…”);
// http.setRequestMethod(“POST”);

http.setRequestMethod(“POST”);
http.setDoInput(true);
http.setDoOutput(true);

String username = URLEncoder.encode(“namee”,”UTF-8″) +”=” +URLEncoder.encode(“suresh”,”UTF-8″);
String email = “&”+URLEncoder.encode(“email”,”UTF-8″) +”=”+ URLEncoder.encode(“suresh@gmail.com”,”UTF-8″);
String password = “&”+URLEncoder.encode(“password”,”UTF-8″)+”=” +URLEncoder.encode(“123456″,”UTF-8”);

String temp = username + email + password;

Log.d(“con”,” “+” “+temp );
OutputStream os = http.getOutputStream();
OutputStreamWriter os1 = new OutputStreamWriter(os);
os1.write(temp);

os1.flush();
os1.close();

Log.d(“con”,” “+”Connecting for input “+http.getResponseCode());
//if(http.getResponseCode() == HttpURLConnection.HTTP_OK){

Log.d(“con”,” “+”Connecteddddd for input “);

InputStream is = http.getInputStream();
BufferedReader reader = new BufferedReader(new
InputStreamReader(http.getInputStream()));
String line;
StringBuilder sr = new StringBuilder();
while ((line = reader.readLine())!=null){

sr.append(line);

}

is.close();
reader.close();
Log.d(“con”,sr.toString());

Ravi Tamada
3 years ago
Reply to  rajeev

You are sending name parameter as “namee”. (notice an extra ‘e’)

M Ased Ahmed
3 years ago
Reply to  Ravi Tamada

Hi i am using your code but getting error Required param email or password is missing can u please help me?

Ravi Tamada
3 years ago
Reply to  M Ased Ahmed

Could you post the screenshot of your Postman?

M Ased Ahmed
3 years ago
Reply to  Ravi Tamada

comment image

Ciaran Callaghan
Ciaran Callaghan
3 years ago
Reply to  M Ased Ahmed

I am also having this problem

Przemysław Walczak
Przemysław Walczak
3 years ago

my too.

Pravinraj Mohan
Pravinraj Mohan
3 years ago
Reply to  M Ased Ahmed

Remove the parameters! Click on the body tab (third one). then pass your parameters as form request. Will work!

M Ased Ahmed
3 years ago

Fatal error: Call to undefined method mysqli_stmt::get_result() in /home/android_login_api/include/DB_Functions.php on line 64

trupti
trupti
3 years ago
Reply to  M Ased Ahmed

Fatal error: Call to undefined method mysqli_stmt::get_result() in /home/android_login_api/include/DB_Functions.php

rama nathan
rama nathan
3 years ago
Reply to  Ravi Tamada

I am also getting the same error… parameter missing….comment image

Hamdan Shafiq
Hamdan Shafiq
3 years ago
Reply to  Ravi Tamada

comment image

Ravi Tamada
3 years ago
Reply to  Hamdan Shafiq

Its emulator, not postman. Postman is a tool to send http requests to an url. Please install that and try once.

Some think like this
https://www.youtube.com/watch?v=CJcf-Zn9oRI

Hamdan Shafiq
Hamdan Shafiq
3 years ago
Reply to  Ravi Tamada

emulator installed already

Ravi Tamada
3 years ago
Reply to  Hamdan Shafiq

Have you watched the video I have commented earlier?

Hamdan Shafiq
Hamdan Shafiq
3 years ago
Reply to  Ravi Tamada

comment image

Hamdan Shafiq
Hamdan Shafiq
3 years ago
Reply to  Ravi Tamada

comment image

Hamdan Shafiq
Hamdan Shafiq
3 years ago
Reply to  Ravi Tamada

not showing any out put

Karan Brahmaxatriya
Karan Brahmaxatriya
3 years ago

hey Ravi sir i m using ur code its work perfectly bt after login and register successfully not going to next activity please help me to go other activty after login its imp

Ravi Tamada
3 years ago

Check the LogCat for any errors.

Karan Brahmaxatriya
Karan Brahmaxatriya
3 years ago
Reply to  Ravi Tamada

Getting this in Log Cat file
Login Response: {“VerifiedMember”:[{“user_id”:”76″,”first_name”:”A”,”phone”:””}],”success”:1,”message”:”success”}

Karan Brahmaxatriya
Karan Brahmaxatriya
3 years ago
Reply to  Ravi Tamada

bt not going to new activity

Ravi Tamada
3 years ago

Pls post the code where the json is parsed and activity is launched.

Karan Brahmaxatriya
Karan Brahmaxatriya
3 years ago
Reply to  Ravi Tamada

private void checkLogin(final String email, final String password) {
// Tag used to cancel the request
String tag_string_req = “req_login”;

pDialog.setMessage(“Logging in …”);
showDialog();

StringRequest strReq = new StringRequest(Method.POST,
AppConfig.URL_LOGIN, new Response.Listener() {

@Override
public void onResponse(String response) {
Log.d(TAG, “Login Response: ” + response.toString());
hideDialog();

try {
JSONObject jObj = new JSONObject(response);
int intError = jObj.getInt(“success”);
boolean error = (intError > 0) ? true : false;

/*
boolean error = jObj.getBoolean(“success”);
*/

// Check for error node in json
if (!error) {
// user successfully logged in
// Create login session
session.setLogin(true);

// Now store the user in SQLite

JSONObject user = jObj.getJSONObject(“VerifiedMember”);
String first__name = user.getString(“first_name”);
String email = user.getString(“phone”);

// Launch main activity
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
startActivity(intent);
finish();

// Inserting row in users table
db.addUser(first__name, email);

} else {
// Error in login. Get the error message
String errorMsg = jObj.getString(“message”);
Toast.makeText(getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show();

}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
Toast.makeText(getApplicationContext(), “Json error: ” + e.getMessage(), Toast.LENGTH_LONG).show();
}

}
}, new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, “Login Error: ” + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}
}) {

@Override
protected Map getParams() {
// Posting parameters to login url
Map params = new HashMap();
params.put(“username”, email);
params.put(“password”, password);

return params;
}

};

// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}

Karan Brahmaxatriya
Karan Brahmaxatriya
3 years ago
Reply to  Ravi Tamada

sir pls have a look on it its urgent for me

Karan Brahmaxatriya
Karan Brahmaxatriya
3 years ago
Reply to  Ravi Tamada

Wt happen?
pls help me

Ravi Tamada
3 years ago

Where is the code?

Karan Brahmaxatriya
Karan Brahmaxatriya
3 years ago
Reply to  Ravi Tamada

posted it twice pls check it and solve it

Ravi Tamada
3 years ago

Is there finish() statement in MainActivity?

Karan Brahmaxatriya
Karan Brahmaxatriya
3 years ago
Reply to  Ravi Tamada

yes

Karan Brahmaxatriya
Karan Brahmaxatriya
3 years ago
Reply to  Ravi Tamada

Yes

Karan Brahmaxatriya
Karan Brahmaxatriya
3 years ago
Reply to  Ravi Tamada

Getting this in Log Cat file
Login Response : {“VerifiedMember”:[{“user_id”:”23″,”first_name”:”karan”,”phone”:””}],”success”:1,”message”:”success”}

Karan Brahmaxatriya
Karan Brahmaxatriya
3 years ago
Reply to  Ravi Tamada

private void checkLogin(final String email, final String password) {
// Tag used to cancel the request
String tag_string_req = “req_login”;

pDialog.setMessage(“Logging in …”);
showDialog();

StringRequest strReq = new StringRequest(Method.POST,
AppConfig.URL_LOGIN, new Response.Listener() {

@Override
public void onResponse(String response) {
Log.d(TAG, “Login Response: ” + response.toString());
hideDialog();

try {
JSONObject jObj = new JSONObject(response);
int intError = jObj.getInt(“success”);
boolean error = (intError > 0) ? true : false;

/*
boolean error = jObj.getBoolean(“success”);
*/

// Check for error node in json
if (!error) {
// user successfully logged in
// Create login session
session.setLogin(true);

// Now store the user in SQLite

JSONObject user = jObj.getJSONObject(“VerifiedMember”);
String first__name = user.getString(“first_name”);
String email = user.getString(“phone”);

// Launch main activity
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
startActivity(intent);
finish();

// Inserting row in users table
db.addUser(first__name, email);

} else {
// Error in login. Get the error message
String errorMsg = jObj.getString(“message”);
Toast.makeText(getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show();

}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
Toast.makeText(getApplicationContext(), “Json error: ” + e.getMessage(), Toast.LENGTH_LONG).show();
}

}
}, new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, “Login Error: ” + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}
}) {

@Override
protected Map getParams() {
// Posting parameters to login url
Map params = new HashMap();
params.put(“username”, email);
params.put(“password”, password);

return params;
}

};

// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}

private void showDialog() {
if (!pDialog.isShowing())
pDialog.show();
}

private void hideDialog() {
if (pDialog.isShowing())
pDialog.dismiss();
}
}

Karan Brahmaxatriya
Karan Brahmaxatriya
3 years ago

Any one can help me please unable to go new activity after succefully login and register pls help me to slove this issue….

Hardik Ajmera
Hardik Ajmera
3 years ago

Sir I’m using your code but app crashes as soon as I click on Register Button can you pls help me

Ravi Tamada
3 years ago
Reply to  Hardik Ajmera

Check your LogCat for errors.

Hardik Ajmera
Hardik Ajmera
3 years ago
Reply to  Ravi Tamada

my LOGCAT
at android.view.View.performClick(View.java:5637)

at android.view.View$PerformClick.run(View.java:22429)

at android.os.Handler.handleCallback(Handler.java:751)

at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)

at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)

Ravi Tamada
3 years ago
Reply to  Hardik Ajmera

Paste the complete error.

Josue Carrillo
Josue Carrillo
3 years ago

Hi! im getting the error ” json error: value <br of type java.lang.String cannot be converted to JSONObject android " Any idea..?

Josue Carrillo
Josue Carrillo
3 years ago
Reply to  Josue Carrillo

my logcat:

org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject
07-17 17:23:46.027 881-881/info.androidhive.loginandregistration W/System.err: at org.json.JSON.typeMismatch(JSON.java:111)
07-17 17:23:46.027 881-881/info.androidhive.loginandregistration W/System.err: at org.json.JSONObject.(JSONObject.java:160)
07-17 17:23:46.027 881-881/info.androidhive.loginandregistration W/System.err: at org.json.JSONObject.(JSONObject.java:173)
07-17 17:23:46.027 881-881/info.androidhive.loginandregistration W/System.err: at info.androidhive.loginandregistration.activity.LoginActivity$3.onResponse(LoginActivity.java:126)
07-17 17:23:46.027 881-881/info.androidhive.loginandregistration W/System.err: at info.androidhive.loginandregistration.activity.LoginActivity$3.onResponse(LoginActivity.java:118)

Anderson Goncalves
3 years ago

Works like a charm! Thank you!

Sewak
Sewak
3 years ago

Hello i sucessfully register but when i click login nothing happens why? no going to main activity?

Sewak Singh
Sewak Singh
3 years ago
Reply to  Sewak

D/Volley: [1] Request.finish: 4829 ms: [ ] http://swamiganganandji.in/app/login.php 0xbd319556 NORMAL 6
07-20 21:54:30.891 3813-3813/info.androidhive.loginandregistration

Sewak Singh
Sewak Singh
3 years ago

unable to download new code i have V2 send me new one on sewaksm@gmail.com

Agi Arif
Agi Arif
3 years ago

sir.. im having problem with this code:
import info.androidhive.loginandregistration.R;

cannot resolve symbol ‘R”.. how the solution with my problem.. help me thanks..

Ciaran Callaghan
Ciaran Callaghan
3 years ago
Reply to  Agi Arif

import info.androidhive.loginandregistration.R;
this should be:
import {the name of your package}.R;

Vir Bhatt
Vir Bhatt
3 years ago

Hello Ravi,
I am getting error in get_result() in DB_Functions.php.

When I am sending the request from Advanced Rest Client. It is giving this :

Fatal error: Call to undefined method mysqli_stmt::get_result() in C:xampphtdocsandroid_login_apiincludeDB_Functions.php on line 21

Hikigaya Hachiban
Hikigaya Hachiban
3 years ago

Hello Ravi,
i am new to programming and i followed your tutorial but when i run it, it shows nothing, the screen will only become white. just that….

what should i do about it?
please help!

Ravi Tamada
3 years ago

Check the LogCat for errors

Hikigaya Hachiban
Hikigaya Hachiban
3 years ago
Reply to  Ravi Tamada

LogCat? where do i found this?

sorry if my english is wrong!

Hikigaya Hachiban
Hikigaya Hachiban
3 years ago
Reply to  Ravi Tamada

ahh….i found it…thank you

Hamdan Shafiq
Hamdan Shafiq
3 years ago

i am new to programming and i followed your tutorial but when i run it,
it shows nothing, the screen will only become white. plz help me for this error

Ravi Tamada
3 years ago
Reply to  Hamdan Shafiq

Check LogCat, there would be errors.

Hamdan Shafiq
Hamdan Shafiq
3 years ago
Reply to  Hamdan Shafiq

comment image

Chinmay Bakshi
Chinmay Bakshi
3 years ago

App is installed but as soon as i open the app it crashes.

Ravi Tamada
3 years ago
Reply to  Chinmay Bakshi

Check the LogCat for errors!

Hikigaya Hachiban
Hikigaya Hachiban
3 years ago
Reply to  Ravi Tamada

Hello Ravi,
the application still view the white screen, is it possible that the android version is not compatible with my emulator?

Gemson Gonzales
Gemson Gonzales
3 years ago

Good day Ravi, I’m using your program and made it work perfectly except for one thing. When an account is logged in for the first time this error shows up but I believe it does nothing to the activity

E/SQLiteLog: (2067) abort at 14 in [INSERT INTO user(email,name,created_at,uid) VALUES (?,?,?,?)]: UNIQUE constraint failed: user.email
E/SQLiteDatabase: Error inserting email=tryhard@gmail.com name=tryhard created_at=2017-07-27 10:50:06 uid=597954de2753f3.76395920
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: user.email (code 2067)

It only shows when a user is logged in for the first time on second login it doesn’t show up. It’ll be a great help if you can give me your idea about what causes this error

Gemson Gonzales
Gemson Gonzales
3 years ago

i already fixed this by adding CONFLICT_REPLACE on insert method. Just in case someone get this error here’s what i did.
you need to import this one:
import static android.database.sqlite.SQLiteDatabase.CONFLICT_REPLACE;
then declare it as int “private static int conflictAlgorithm = CONFLICT_REPLACE;”
and I replaced my insert code with this:
long id = db.insertWithOnConflict(TABLE_USER, null, values, conflictAlgorithm);

Thank you for this example Ravi, great help now I can start with what i want to do

Ravi Tamada
3 years ago

I think this causes a problem. Make sure you are not deleting older account, may be that can be somebody else’s account.

Ravi Tamada
3 years ago

Hi Gemson

You are inserting an email which is already existed in db. You need to check if it’s present already, then only insert the new email.

Gemson Gonzales
Gemson Gonzales
3 years ago

Good day Ravi, I used your program and made it work but I got this error that I believe does nothing to the activity The first time you logged in a user this error shows up

E/SQLiteLog: (2067) abort at 14 in [INSERT INTO user(email,name,created_at,uid) VALUES (?,?,?,?)]: UNIQUE constraint failed: user.email
E/SQLiteDatabase: Error inserting email=whatever@gmail.com name=whatever created_at=2017-07-27 11:06:23 uid=597958afbf2a73.40056887
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: user.email (code 2067)

This only shows up on first time log in of the user, on second log in and so on it doesn’t show up anymore. What do you think causes this error? Would be a great help if you can give me your idea about this.

kelvin skip
kelvin skip
3 years ago

hello my login is givin a json error and my registration details do not go to the database please help.

Chinmay Bakshi
Chinmay Bakshi
3 years ago

Hey My data is entered in data base but when i am trying to login it show an error and not letting me to move from login screen check out the screenshot
My data is being entered but not displayedcomment image

comment image

log cat ->comment image

Ravi Tamada
3 years ago
Reply to  Chinmay Bakshi

Hit the login url from Postman and see whether you are getting proper json or not.

madDY
madDY
3 years ago

sir i have an issue…. after inserting the fields of registration from android emulator, then its not save in mySQL database ….. can you please tell me?????????

Thirumani Mohan kumar
Thirumani Mohan kumar
3 years ago
Reply to  madDY

i found same problem . Can anybody solve this? plz replay fast.

Vu Dinh Phong
Vu Dinh Phong
3 years ago

What is the Different if we extends class from Activity vs AppCompatActivity? thank you!

shashi patil
shashi patil
3 years ago

why didn’t you wrote any examples on service and intent service… it will help to understand better for many people… thank you

Ravi Tamada
3 years ago
Reply to  shashi patil

Hmm, I’ll write one.

umer
umer
3 years ago

{“error”:true,”error_msg”:”Required parameters (name, email or password) is missing!”}

{“error”:true,”error_msg”:”Required parameters email or password is missing!”}

i did everything correct then why i have this error
plzzz help me

Ravi Tamada
3 years ago
Reply to  umer

You are not sending the request parameters. Give your android request code.

Hamza Abidi
Hamza Abidi
3 years ago
Reply to  Ravi Tamada

i have a time out problem
@Override
public void onErrorResponse(VolleyError error) {
if(error instanceof TimeoutError)
Log.e(TAG, “Login Error: TIME OUT ERROR”);
else if(error instanceof ServerError)
Log.e(TAG, “Login Error: SERVER ERROR”);
Log.e(TAG, “Login Error: ” + error.getMessage());
Toast.makeText(context.getApplicationContext(),
“Login Error: ” + error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}

i tried to change the time out by doing this but
I still have the same problem :

strReq.setRetryPolicy(new DefaultRetryPolicy(
AppConfig.MY_SOCKET_TIMEOUT_MS, // 1000*15
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Farly Wuwungan
Farly Wuwungan
3 years ago
Reply to  Ravi Tamada

i have a same problem. i dont know where the code.
can you give android request code example?

Ravi Tamada
3 years ago
Reply to  Farly Wuwungan

Hi Farly

You have to understand the code correctly otherwise your life becomes tougher . Try to understand the article and read every line of code.

Death Star
Death Star
2 years ago
Reply to  Ravi Tamada

Thanks a ton for the response Ravi. Here it is
[27-Oct-2017 13:41:47 UTC] PHP Warning: require(../scripts/config.inc.php): failed to open stream: No such file or directory in C:wamp64wwwbtcmcxindex.php on line 16

[27-Oct-2017 13:41:47 UTC] PHP Stack trace:

[27-Oct-2017 13:41:47 UTC] PHP 1. {main}() C:wamp64wwwbtcmcxindex.php:0

[27-Oct-2017 13:41:47 UTC] PHP Fatal error: require(): Failed opening required ‘../scripts/config.inc.php’ (include_path=’.;C:phppear’) in C:wamp64wwwbtcmcxindex.php on line 16

[27-Oct-2017 13:41:47 UTC] PHP Stack trace:

[27-Oct-2017 13:41:47 UTC] PHP 1. {main}() C:wamp64wwwbtcmcxindex.php:0

[27-Oct-2017 17:50:59 UTC] PHP Fatal error: Call to a member function bind_param() on boolean in C:wamp64wwwbtcmcxincludeDB_Functions.php on line 36

[27-Oct-2017 17:50:59 UTC] PHP Stack trace:

[27-Oct-2017 17:50:59 UTC] PHP 1. {main}() C:wamp64wwwbtcmcxregister.php:0

[27-Oct-2017 17:50:59 UTC] PHP 2. DB_Functions->storeUser() C:wamp64wwwbtcmcxregister.php:24

[27-Oct-2017 17:51:16 UTC] PHP Fatal error: Call to a member function bind_param() on boolean in C:wamp64wwwbtcmcxincludeDB_Functions.php on line 36

[27-Oct-2017 17:51:16 UTC] PHP Stack trace:

[27-Oct-2017 17:51:16 UTC] PHP 1. {main}() C:wamp64wwwbtcmcxregister.php:0

[27-Oct-2017 17:51:16 UTC] PHP 2. DB_Functions->storeUser() C:wamp64wwwbtcmcxregister.php:24

[27-Oct-2017 17:52:40 UTC] PHP Fatal error: Call to a member function bind_param() on boolean in C:wamp64wwwbtcmcxincludeDB_Functions.php on line 36

[27-Oct-2017 17:52:40 UTC] PHP Stack trace:

[27-Oct-2017 17:52:40 UTC] PHP 1. {main}() C:wamp64wwwbtcmcxregister.php:0

[27-Oct-2017 17:52:40 UTC] PHP 2. DB_Functions->storeUser() C:wamp64wwwbtcmcxregister.php:24

[27-Oct-2017 17:54:43 UTC] PHP Fatal error: Call to a member function bind_param() on boolean in C:wamp64wwwbtcmcxincludeDB_Functions.php on line 36

[27-Oct-2017 17:54:43 UTC] PHP Stack trace:

[27-Oct-2017 17:54:43 UTC] PHP 1. {main}() C:wamp64wwwbtcmcxregister.php:0

[27-Oct-2017 17:54:43 UTC] PHP 2. DB_Functions->storeUser() C:wamp64wwwbtcmcxregister.php:24

[27-Oct-2017 17:54:49 UTC] PHP Fatal error: Call to a member function bind_param() on boolean in C:wamp64wwwbtcmcxincludeDB_Functions.php on line 36

[27-Oct-2017 17:54:49 UTC] PHP Stack trace:

[27-Oct-2017 17:54:49 UTC] PHP 1. {main}() C:wamp64wwwbtcmcxregister.php:0

[27-Oct-2017 17:54:49 UTC] PHP 2. DB_Functions->storeUser() C:wamp64wwwbtcmcxregister.php:24

[27-Oct-2017 17:54:50 UTC] PHP Fatal error: Call to a member function bind_param() on boolean in C:wamp64wwwbtcmcxincludeDB_Functions.php on line 36

[27-Oct-2017 17:54:50 UTC] PHP Stack trace:

[27-Oct-2017 17:54:50 UTC] PHP 1. {main}() C:wamp64wwwbtcmcxregister.php:0

[27-Oct-2017 17:54:50 UTC] PHP 2. DB_Functions->storeUser() C:wamp64wwwbtcmcxregister.php:24

[27-Oct-2017 17:54:51 UTC] PHP Fatal error: Call to a member function bind_param() on boolean in C:wamp64wwwbtcmcxincludeDB_Functions.php on line 36

[27-Oct-2017 17:54:51 UTC] PHP Stack trace:

[27-Oct-2017 17:54:51 UTC] PHP 1. {main}() C:wamp64wwwbtcmcxregister.php:0

[27-Oct-2017 17:54:51 UTC] PHP 2. DB_Functions->storeUser() C:wamp64wwwbtcmcxregister.php:24

[27-Oct-2017 17:58:37 UTC] PHP Fatal error: Call to a member function bind_param() on boolean in C:wamp64wwwbtcmcxincludeDB_Functions.php on line 36

[27-Oct-2017 17:58:37 UTC] PHP Stack trace:

[27-Oct-2017 17:58:37 UTC] PHP 1. {main}() C:wamp64wwwbtcmcxregister.php:0

[27-Oct-2017 17:58:37 UTC] PHP 2. DB_Functions->storeUser() C:wamp64wwwbtcmcxregister.php:24

[28-Oct-2017 07:41:24 UTC] PHP Fatal error: Call to a member function bind_param() on boolean in C:wamp64wwwbtcmcxincludeDB_Functions.php on line 36

[28-Oct-2017 07:41:24 UTC] PHP Stack trace:

[28-Oct-2017 07:41:24 UTC] PHP 1. {main}() C:wamp64wwwbtcmcxregister.php:0

[28-Oct-2017 07:41:24 UTC] PHP 2. DB_Functions->storeUser() C:wamp64wwwbtcmcxregister.php:24

Death Star
Death Star
2 years ago
Reply to  Death Star

This is line 36 in DB_FUBCTIONS.php
$stmt->bind_param(“sssss”, $uuid, $name, $email, $encrypted_password, $salt);

vips
vips
2 years ago
Reply to  Death Star

so what is missing here it seems all fine like ravi dictated and i m using local server wamp btw

Bluehost Coupons 2019
Reply to  Death Star

⇒ Make sure that both devices (the device running the PHP project and the android device) are on the same wifi network.

Ravi Tamada
2 years ago
Reply to  Death Star

Seems the relative path is not working. Use __DIR__ before the path.
https://stackoverflow.com/questions/5364233/php-fatal-error-failed-opening-required-file

require_once __DIR__.'/../scripts/config.inc.php';

vips
vips
2 years ago
Reply to  Ravi Tamada

well i have also tried this but nothing happand,stil suffers with {“error”:true,”error_msg”:”Required parameters email or password is missing!”}’, i guess it is not able to get access to the parameters but anyhow i don’t understand this thing

hari
hari
2 years ago
Reply to  Ravi Tamada

Even I am facing the same issue

Rodrigue
Rodrigue
2 years ago
Reply to  Ravi Tamada

hi Ravi l have problem with php code fatal error require_once() failed opening required ‘include/DB_Functions.php’ (include_path=’.;C:phppear’) in C:Wampwwwandroid_login_api… how to solve that problem

Rodrigue
Rodrigue
2 years ago
Reply to  Rodrigue

hi Ravi l use now postman when l enter parameters name email password result is error_msg: unknown error occured in registration please help me by give me a maximun of details

Kunal Singh
Kunal Singh
1 year ago
Reply to  Ravi Tamada

if you are usin post man try putting it under the tab “body”
and not Params
that worked for me

Omar Balout
Omar Balout
2 years ago
Reply to  Ravi Tamada

Dear Ravi if i wanted to host my db on line how do i modify this to get values and save values on my server

trupti
trupti
3 years ago

Working on localhost but on server error occur Fatal error: Call to undefined method mysqli_stmt::get_result() in /home/android_login_api/include/DB_Functions.php

Ananda Satriyo
Ananda Satriyo
3 years ago
Reply to  trupti

your function.php name see it bro and you will realize, i got confused for a moment too
just rename the fuction.php file and it will resolve your rob

hugo
hugo
3 years ago
Reply to  Ananda Satriyo

What do you mean “rename”?

Rename the archive DB_FUNCTIONS to E.g DB_FUNC
or rename Line 64: $user = $stmt->”get_result()”->fetch_assoc();
to $user = $stmt->”get_results()”->fetch_assoc(); ?

Explain me because i have the same problem in my own server :/

EFabricio Vera Núñez
EFabricio Vera Núñez
3 years ago
Reply to  hugo

Could you solve it?

Techlingda Tutorials
Techlingda Tutorials
2 years ago

no

Techlingda Tutorials
Techlingda Tutorials
2 years ago
Reply to  hugo

I rename database name to android_api to carbon_android_api

Ananda Satriyo
Ananda Satriyo
3 years ago

I got so confusing error massage, when i got clicked the register button, i got a error dialog mesagge it says {“error”:true,”error_msg”:”Login credentials are wrong. Please try again!”}

and from the logcat just showing this error
can you help me?

08-04 17:04:36.753 31150-31150/com.example.fallen.loginphp I/ViewRootImpl: CPU Rendering VSync enable = true
08-04 17:04:36.793 31150-31150/com.example.fallen.loginphp I/ViewRootImpl: CPU Rendering VSync enable = true
08-04 17:04:38.663 31150-31150/com.example.fallen.loginphp I/ViewRootImpl: CPU Rendering VSync enable = true
08-04 17:04:39.763 31150-31150/com.example.fallen.loginphp D/RegisterActivity: Register Response: {“error”:true,”error_msg”:”Login credentials are wrong. Please try again!”}
08-04 17:04:39.783 31150-31150/com.example.fallen.loginphp W/Toast: From com.example.fallen.loginphp, go ahead.
08-04 17:04:39.793 31150-31150/com.example.fallen.loginphp I/ViewRootImpl: CPU Rendering VSync enable = true

Thirumani Mohan kumar
Thirumani Mohan kumar
3 years ago
Reply to  Ananda Satriyo

use “$_GET” in place of “$_POST” in file register.php

sandhita mittal
sandhita mittal
3 years ago

Hi. My registration is working successfully but I am getting this error when i use the login activity.
BasicNetwork.performRequest: Unexpected response code 500

Please help.

Ravi Tamada
3 years ago

It seems you have php / mysql error. Check apache /php error logs .

sandhita mittal
sandhita mittal
3 years ago
Reply to  Ravi Tamada

Hi Ravi. Thanks for the prompt reply. I am not getting that error anymore. But php file is unable to read my parameters. I am getting {“error”:true,”error_msg”:”Required parameters email or password is missing!”} in my android logcat. Please advise.

Ravi Tamada
3 years ago

Can you try the url with Postman or paste the android request code here.

sandhita mittal
sandhita mittal
3 years ago
Reply to  Ravi Tamada

It’s not working with POSTMAN also. My login.php is as below:

FALSE);

if ( isset($_POST[’email’]) && isset($_POST[‘password’])){

// receiving the post params
$email = $_POST[’email’];
$password = $_POST[‘password’];

// get the user by email and password
$user = $db->getUserByEmailAndPassword($email, $password);

if ($user != false) {
// use is found
$response[“error”] = FALSE;
$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 is not found with the credentials
$response[“error”] = TRUE;
$response[“error_msg”] = “Login credentials are wrong. Please try again!”;

}
} else {
// required post params is missing
$response[“error”] = TRUE;
$response[“error_msg”] = “Required parameters email or password is missing!”;
echo json_encode($response);

}
?>

Android Login code is as below:

private void checkLogin(final String email, final String password) {
// Tag used to cancel the request
String tag_string_req = “req_login”;

pDialog.setMessage(“Logging in …”);
showDialog();

Log.i(“login”, “login”);
StringRequest strReq = new StringRequest(Method.POST,
AppConfig.URL_LOGIN, new Response.Listener() {

@Override
public void onResponse(String response) {

Log.d(TAG, “Login Response: ” + response.toString());
hideDialog();

}
}, new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, “Login Error: ” + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}
}) {

@Override
protected Map getParams() throws AuthFailureError {
// Posting params to register url
Map params = new HashMap();

params.put(“email”, email);
params.put(“pass”, password);

return params;
}

};

sandhita mittal
sandhita mittal
3 years ago

sorry this is the correct android code.

private void checkLogin(final String email, final String password) {
// Tag used to cancel the request
String tag_string_req = “req_login”;

pDialog.setMessage(“Logging in …”);
showDialog();

StringRequest strReq = new StringRequest(Method.POST,
AppConfig.URL_LOGIN, new Response.Listener() {

@Override
public void onResponse(String response) {
Log.d(TAG, “Login Response: ” + response.toString());
hideDialog();

try {
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean(“error”);

// Check for error node in json
if (!error) {
// user successfully logged in
// Create login session
session.setLogin(true);

// Now store the user in SQLite
String uid = jObj.getString(“uid”);

JSONObject user = jObj.getJSONObject(“user”);
String name = user.getString(“name”);
String email = user.getString(“email”);
String created_at = user
.getString(“created_at”);

// Inserting row in users table
db.addUser(name, email, uid, created_at);

// Launch main activity
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
startActivity(intent);
finish();
} else {
// Error in login. Get the error message
String errorMsg = jObj.getString(“error_msg”);
Toast.makeText(getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
Toast.makeText(getApplicationContext(), “Json error: ” + e.getMessage(), Toast.LENGTH_LONG).show();
}

}
}, new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, “Login Error: ” + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}
}) {

@Override
protected Map getParams() {
// Posting parameters to login url
Map params = new HashMap();
params.put(“email”, email);
params.put(“password”, password);

return params;
}

};

// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}

sandhita mittal
sandhita mittal
3 years ago

And my postman query is using raw, application/json.

{
“email”: “a@a.com”,
“password”:”pop”

}

Shivam Goyal
Shivam Goyal
3 years ago

hello ravi,
i want to login or register by phone number otp, how should i change the program so that it give me results.

cyah
cyah
3 years ago

hi, i added more columns to my table “users” and when i register the user it gives me the error ‘unknown error occurred in registration’ but when i remove those columns, it works fine. why am i getting the error?

Nikhil patil
Nikhil patil
3 years ago

comment image my rest api is not working getting error {“error”:true,”error_msg”:”Required parameters (name, email or password) is missing!”} but i am giving the params ,i am testing it in postman

Marhan S Rogers
Marhan S Rogers
3 years ago
Reply to  Nikhil patil

hi i got the same error, how do i resolve this? pls..

Nikhil patil
Nikhil patil
3 years ago
Reply to  Nikhil patil

above error is solve bt having issue in android app the error is fatal error
below is log output.

08-08 11:59:48.860 32001-32001/com.mytaxi.specters.mytaxi E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mytaxi.specters.mytaxi, PID: 32001
java.lang.NullPointerException: Attempt to invoke virtual method ‘void com.mytaxi.specters.mytaxi.AppController.addToRequestQueue(com.android.volley.Request, java.lang.String)’ on a null object reference
at com.mytaxi.specters.mytaxi.RegisterActivity.registerUser(RegisterActivity.java:192)
at com.mytaxi.specters.mytaxi.RegisterActivity.access$300(RegisterActivity.java:35)
at com.mytaxi.specters.mytaxi.RegisterActivity$1.onClick(RegisterActivity.java:84)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22433)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6208)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781)

ara
ara
3 years ago

hi. i try this code but when i click button login it stop.why?

Mohamed Zaid Farook
Mohamed Zaid Farook
3 years ago

I followed the entire tutorial but i am struggling to connect using the request code. When i ran the request code in postman i get the same message as above. I get a java.net.connect Exception. I am trying for a long time can u pls help?

stanley
stanley
3 years ago

Same

Padmanabham Vishwakarma
Padmanabham Vishwakarma
3 years ago

Hi..I am always getting below message :
Required parameters email or password is missing!”;

Muhamad Bagzada
Muhamad Bagzada
3 years ago

Great work Mr.Ravi , It’s successfully but i want to showing all data in database(online) by ListView !?

Merve
Merve
3 years ago

Hi,there is a problem.
E/DataScheduler: isDataSchedulerEnabled():false
E/RegisterActivity: Registration Error: null Why and how to solve this?

Merve
Merve
3 years ago

in addition ,{“error”:true,”error_msg”:”Required parameters (name, email or password) is missing!”}

Vu Dinh Phong
Vu Dinh Phong
3 years ago

Why do we use StringRequest? I try to change to JsonObjectRequest but it gave me error, since the json response start with { . Thank you!

Oliver
Oliver
3 years ago

Dear Ravi,
I compare all codes with yours, all are the same, but when I run app, it crashes! Logcat points to some Null pointer Exception! I think it has problem with sending params in post method .
I checked all things , but I can’t find the problem, please help me ..
thanks.

Ramesh Rathod
3 years ago
Reply to  Oliver

Check This AppController added or not in your manifest

Marhan S Rogers
Marhan S Rogers
3 years ago
Reply to  Ramesh Rathod

hi thanks it worked!

Nabeel Hafeez
Nabeel Hafeez
3 years ago

Hi Ravi,
How import DB in PHPMyAdmin?
When I try to import the error shown below:
#1064 – You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘use android_api

Ramesh Rathod
3 years ago
Reply to  Nabeel Hafeez

php syntax error find and fix and try again

CJ Caimoy
CJ Caimoy
3 years ago
Reply to  Nabeel Hafeez

COPY AND PASTE THE CODE BELOW

create database android_api ;
use android_api;

create table users(
id 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
);

Gerd Marinelli
Gerd Marinelli
2 years ago
Reply to  Nabeel Hafeez

… just import piece by piece:

create database android_api /** Creating Database **/

then:

use android_api /** Selecting Database **/

then:

create table users(
id 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 **/

Then all will be fine

طیبہ علاؤالدین
طیبہ علاؤالدین
3 years ago

app crashes ,plzz help,logcat error:
08-19 02:34:23.759 3707-3707/? I/art: Not late-enabling -Xcheck:jni (already on)
08-19 02:34:23.760 3707-3707/? W/art: Unexpected CPU variant for X86 using defaults: x86
08-19 02:34:23.882 3707-3707/? W/System: ClassLoader referenced unknown path: /data/app/com.example.tayyibah.androidloginandregistration-2/lib/x86
08-19 02:34:23.939 3707-3707/com.example.tayyibah.androidloginandregistration I/InstantRun: Instant Run Runtime started. Android package is com.example.tayyibah.androidloginandregistration, real application class is com.example.tayyibah.androidloginandregistration.app.AppController.
08-19 02:34:26.731 3707-3707/com.example.tayyibah.androidloginandregistration W/System: ClassLoader referenced unknown path: /data/app/com.example.tayyibah.androidloginandregistration-2/lib/x86
08-19 02:34:26.817 3707-3707/com.example.tayyibah.androidloginandregistration W/ResourceType: Failure getting entry for 0x7f0b0001 (t=10 e=1) (error -75)
08-19 02:34:26.818 3707-3707/com.example.tayyibah.androidloginandregistration D/AndroidRuntime: Shutting down VM
08-19 02:34:26.819 3707-3707/com.example.tayyibah.androidloginandregistration E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tayyibah.androidloginandregistration, PID: 3707
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tayyibah.androidloginandregistration/com.example.tayyibah.androidloginandregistration.activity.LoginActivity}: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class
Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
at android.view.LayoutInflater.createView(LayoutInflater.java:645)
at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:717)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:785)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
at android.view.LayoutInflater.inflate(LayoutInflater.java:377)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:414)
at android.app.Activity.setContentView(Activity.java:2414)
at com.example.tayyibah.androidloginandregistration.activity.LoginActivity.onCreate(LoginActivity.java:47)
at android.app.Activity.performCreate(Activity.java:6662)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: android.content.res.Resources$NotFoundException: Drawable com.example.tayyibah.androidloginandregistration:color/bg_login with resource ID #0x7f0b0001
Caused by: android.content.res.Resources$NotFoundException: Resource “com.example.tayyibah.androidloginandregistration:color/bg_login” (7f0b0001) is not a Drawable (color or path): TypedValue{t=0x1/d=0x7f0b0001 a=-1 r=0x7f0b0001}
at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:687)
at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:571)
at android.content.res.Resources.loadDrawable(Resources.java:854)
at android.content.res.TypedArray.getDrawable(TypedArray.java:928)
at android.view.View.(View.java:4175)
at android.view.ViewGroup.(ViewGroup.java:578)
at android.widget.LinearLayout.(LinearLayout.java:211)
at android.widget.LinearLayout.(LinearLayout.java:207)
08-19 02:34:26.820 3707-3707/com.example.tayyibah.androidloginandregistration E/AndroidRuntime: at android.widget.LinearLayout.(LinearLayout.java:203)
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
at android.view.LayoutInflater.createView(LayoutInflater.java:645)
at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:717)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:785)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
at android.view.LayoutInflater.inflate(LayoutInflater.java:377)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:414)
at android.app.Activity.setContentView(Activity.java:2414)
at com.example.tayyibah.androidloginandregistration.activity.LoginActivity.onCreate(LoginActivity.java:47)
at android.app.Activity.performCreate(Activity.java:6662)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

Mam3adegh Salehi
Mam3adegh Salehi
3 years ago

hi, thanks a lot ravi, i have this error when using register form:

E/Volley: [4410] BasicNetwork.performRequest: Unexpected response code 403 for http://192.168.1.4/android_free_api/register.php

can anyne help me!?

Daffodills Solutions
Daffodills Solutions
3 years ago

Hi Ravi,

I like your code. It is works fine. This is totally free api right? Is there any licence. I am going to use in my project thats why am asking.

Thanks,
Daffo

Ravi Tamada
3 years ago

Hi

It’s totally free. If you are comfortable with this article. Try learning this series too.
https://www.androidhive.info/2014/01/how-to-create-rest-api-for-android-app-using-php-slim-and-mysql-day-12-2/

Daffodills Solutions
Daffodills Solutions
3 years ago
Reply to  Ravi Tamada

Thanks you so much Ravi. I did slightly some modification. Thanks a lot.

Thanks,
Daffo.

Ravi Tamada
3 years ago

Cheers!

Bouna Nadia
Bouna Nadia
3 years ago

Hi Ravi
Thanks for the tuto but my problem is that i can’t turn on wifi on my android emulator so i can’t test the app . I tried to install adb wifi plugin but the problem consist… i saw on your demo video that you have used android emulator and not an usb device and i want to do the same thing because i dont have an android smartphone to connect it via usb.. i have iphone…i hope you answer me soon thank you ^_^

Ravi Tamada
3 years ago
Reply to  Bouna Nadia

Hi Bouna

If your pc is connected to internet, you emulator too will have the internet.

Go through this discussion
https://stackoverflow.com/questions/2039964/how-to-connect-android-emulator-to-the-internet

Bouna Nadia
Bouna Nadia
3 years ago
Reply to  Ravi Tamada

Thank you , my emulator is connected via cellular data and not via wireless (i can’t turn it on with the emulator there’s no option in the settings) , i have 0 errors and when i try to test the application and i check my DB i found nothing new so i can’t login , i thought that the problem come from the network because you said that the pc and the emulator must be connected to the same WIFI… i don’t know ! what do you think about this? (PS: im beginner :/ )
comment image

Dhwani Bhansali
Dhwani Bhansali
3 years ago

hey,
At the time of submitting data to database I’m getting error that “Forbidden, you don’t have permission to access database on this server” I also have tried by changing permissions into httpd.conf but it didn’t work. please help me

Youssif Al Shamali
Youssif Al Shamali
3 years ago

Hi Ravi,
when im trying to register or login this Toast Appears : java.net.connectexception connection refused

what it means and why this happens ??
no changes happen in the mysql !!

Thanks in Advance
Yousif Alshamali

Mohammad Mirzakhani
Mohammad Mirzakhani
3 years ago

i have the same problem.
anybody can help?

Praful Dhabekar
Praful Dhabekar
2 years ago

Have you inserted the right IP address in following code?

//Server register url
public static final String URL_REGISTER = “http://192.168.0.1/android_login_api/register.php”

192.168.0.1 is mine IP Address, yours maybe different.

Achabla
Achabla
3 years ago

Hi Ravi, I have a slightly strange problem. When I try to register on online database. It registers, but doesn’t show the response. When I press The Register Button again it says user already exist, and then I find it in the database. However the Login button doesn’t work. What could be the problem.

Mahantesh Gurav
Mahantesh Gurav
2 years ago
Reply to  Achabla

In register.php
Adding if($user = true) worked for me.

Here you have to add
// create a new user

if ($user = true)

Hamza Abidi
Hamza Abidi
3 years ago

i have a time out problem
@Override
public void onErrorResponse(VolleyError error) {
if(error instanceof TimeoutError)
Log.e(TAG, “Login Error: TIME OUT ERROR”);
else if(error instanceof ServerError)
Log.e(TAG, “Login Error: SERVER ERROR”);
Log.e(TAG, “Login Error: ” + error.getMessage());
Toast.makeText(context.getApplicationContext(),
“Login Error: ” + error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}

i tried to change the time out by doing this but
I still have the same problem :

strReq.setRetryPolicy(new DefaultRetryPolicy(
AppConfig.MY_SOCKET_TIMEOUT_MS, // 1000*15
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Auston Ajith
Auston Ajith
3 years ago

:disqus There is a spelling mistake in your post which makes mysql problems
correct this “DB_Functons.php” to “DB_Functions.php”

Ravi Tamada
3 years ago
Reply to  Auston Ajith

Updated. Thank you.

973
0
Would love your thoughts, please comment.x
()
x