Android Login and Registration With PHP MySQL

Filed Under: Android

Android Login and Registration are very common scenarios. You will find registration and login operation in all the apps where we want user information. In this tutorial, we’ll set up a local web server and MySQL database. We will develop android login and registration application. We will use PHP script to connect to the MySQL database.

Android Login Registration

The first step is to create the backend web server. I am working on Mac OS X and XAMPP can be used to set up a local Apache web server and MySQL database quickly.

Setting Up XAMPP Server

XAMPP(or WAMP) is a one-click installer software that creates an environment for developing a PHP, MySQL web application (that we’ll be connecting with our android application).

Download and install XAMPP from here.

Launch the XAMPP app after installation and you will be greeted with below screen.

xampp application

You can test your server by opening http://localhost. The following screen should appear.

android xampp dashboard

Also, you can check phpMyAdmin by opening http://localhost/phpmyadmin. Let’s see what it shows!

android phpmyadmin error

OOPS! You might end up with a screen like this. Seems like the MySQL server isn’t properly running. Go To the Manage Servers tab in the XAMPP application and click restart all. The servers should be running properly as seen in the image below.

android xampp manage servers

Now test phpMyAdmin in the localhost and you’ll end up with a screen similar to this.
android phpmyadmin

Now let’s test a sample php script. Create a new test.php file and add the following lines into it.


<?php
echo "Hello, World";
?>

In the above code:

  • ?php starts opening tag for any PHP script.
  • ?> means closing tag like closing bracket in Java.

Note: Knowing PHP is not mandatory for this tutorial.

if you’re using a MAC then goto Applications->Xampp->htdocs. Create a new folder here lets say test_android and copy paste the test.php that was created before. Now open the url http://localhost/test_android/test.php

You’ll end up with a screen like this:
android php hello world

Setting Up MySQL Database

Open the phpMyAdmin by visiting http://localhost/phpmyadmin.
Now select the Databases Tab that’s present in the top left of the headers row. Give a random name and create it. The newly created empty database would be visible in the left sidebar.

android phpmyadmin database create

Let’s create a users table in the newly created Database. Run the following query in the console


CREATE TABLE  `firstDB`.`users` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `username` VARCHAR( 20 ) NOT NULL ,
    `password` VARCHAR( 20 ) NOT NULL
)

If the table is successfully created, you’ll end up with a screen similar to this:

android phpmyadmin create table

Connecting PHP to MySQL Database

To connect a PHP script to MySQL database three input values are required.
Following are the inputs and there default values for a XAMPP server

  • Host name: localhost
  • MySQL user name : root
  • MySQL password : It is blank. “”

Let’s create a test-connect.php script and add it in the htdocs->test-android folder.


<?php
$host="localhost";
$user="root";
$password="";
$con=mysql_connect($host,$user,$password);
if($con) {
    echo '<h1>Connected to MySQL</h1>';
} else {
    echo '<h1>MySQL Server is not connected</h1>';
}
?>

mysql_connect() is a PHP’s inbuilt function to connect to MySQL database with the parameters listed above.

Try running http://localhost/test_android/test-connect.php and see the output. If it’s not connected, then try restarting the XAMPP servers.

Android Login Registration App

Now that we’ve discussed the basic setup of PHP and MySQL, let’s get into the android login application part. We’ll be developing a sign-in/register application. To keep it short and simple we’ll be checking if the username and email are unique during registration. Before we jump onto the app logic let’s work on the PHP scripts and MySQL Database.

First, let’s DROP the Table users and create a fresh one in the context of the above application.


CREATE TABLE IF NOT EXISTS `firstDB`.`users` (
`id` int(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`username` varchar(70) NOT NULL,
`password` varchar(40) NOT NULL,
`email` varchar(50) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime DEFAULT NULL

)

Following are the PHP scripts that you can copy paste in the htdocs->test_android folder.

config.php


<?php
    define("DB_HOST", "localhost");
    define("DB_USER", "root");
    define("DB_PASSWORD", "");
    define("DB_NAME", "firstDB");
    ?>

The script for Database connection is given below.

db-connect.php


<?php
    
    include_once 'config.php';
    
    class DbConnect{
        
        private $connect;
        
        public function __construct(){
            
            $this->connect = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
            
            if (mysqli_connect_errno($this->connect)){
                echo "Unable to connect to MySQL Database: " . mysqli_connect_error();
            }
        }
        
        public function getDb(){
            return $this->connect;
        }
    }
    ?>

The following script contains all the core functions of the application.

user.php


<?php
    
    include_once 'db-connect.php';
    
    class User{
        
        private $db;
        
        private $db_table = "users";
        
        public function __construct(){
            $this->db = new DbConnect();
        }
        
        public function isLoginExist($username, $password){
            
            $query = "select * from ".$this->db_table." where username = '$username' AND password = '$password' Limit 1";
            
            $result = mysqli_query($this->db->getDb(), $query);
            
            if(mysqli_num_rows($result) > 0){
                
                mysqli_close($this->db->getDb());
                
                
                return true;
                
            }
            
            mysqli_close($this->db->getDb());
            
            return false;
            
        }
        
        public function isEmailUsernameExist($username, $email){
            
            $query = "select * from ".$this->db_table." where username = '$username' AND email = '$email'";
            
            $result = mysqli_query($this->db->getDb(), $query);
            
            if(mysqli_num_rows($result) > 0){
                
                mysqli_close($this->db->getDb());
                
                return true;
                
            }
               
            return false;
            
        }
        
        public function isValidEmail($email){
            return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
        }
        
        public function createNewRegisterUser($username, $password, $email){
              
            $isExisting = $this->isEmailUsernameExist($username, $email);
            
            if($isExisting){
                
                $json['success'] = 0;
                $json['message'] = "Error in registering. Probably the username/email already exists";
            }
            
            else{
                
            $isValid = $this->isValidEmail($email);
                
                if($isValid)
                {
                $query = "insert into ".$this->db_table." (username, password, email, created_at, updated_at) values ('$username', '$password', '$email', NOW(), NOW())";
                
                $inserted = mysqli_query($this->db->getDb(), $query);
                
                if($inserted == 1){
                    
                    $json['success'] = 1;
                    $json['message'] = "Successfully registered the user";
                    
                }else{
                    
                    $json['success'] = 0;
                    $json['message'] = "Error in registering. Probably the username/email already exists";
                    
                }
                
                mysqli_close($this->db->getDb());
                }
                else{
                    $json['success'] = 0;
                    $json['message'] = "Error in registering. Email Address is not valid";
                }
                
            }
            
            return $json;
            
        }
        
        public function loginUsers($username, $password){
            
            $json = array();
            
            $canUserLogin = $this->isLoginExist($username, $password);
            
            if($canUserLogin){
                
                $json['success'] = 1;
                $json['message'] = "Successfully logged in";
                
            }else{
                $json['success'] = 0;
                $json['message'] = "Incorrect details";
            }
            return $json;
        }
    }
    ?>

In the above code, the $json contains the JSONObjects returned.

The following PHP script is the one that is called upon first from the application.

index.php


<?php
    
    require_once 'user.php';
    
    $username = "";
    
    $password = "";
    
    $email = "";
    
    if(isset($_POST['username'])){
        
        $username = $_POST['username'];
        
    }
    
    if(isset($_POST['password'])){
        
        $password = $_POST['password'];
        
    }
    
    if(isset($_POST['email'])){
        
        $email = $_POST['email'];
        
    }
    
    $userObject = new User();
    
    // Registration
    
    if(!empty($username) && !empty($password) && !empty($email)){
        
        $hashed_password = md5($password);
        
        $json_registration = $userObject->createNewRegisterUser($username, $hashed_password, $email);
        
        echo json_encode($json_registration);
        
    }
    
    // Login
    
    if(!empty($username) && !empty($password) && empty($email)){
        
        $hashed_password = md5($password);
        
        $json_array = $userObject->loginUsers($username, $hashed_password);
        
        echo json_encode($json_array);
    }
    ?>

In the above code, we check whether the email field is empty or not. If it is, we’ll call the login function in the PHP script, else we’ll go to the registration function. The JSON response returns two params : success(0 or 1) and the message.

  • The md5() function uses the RSA Data Security, Inc. MD5 Message-Digest Algorithm to create a hash string of the password.
  • To check if the email address is a valid we’ve implemented a isValidEmail() method. FILTER_VALIDATE_EMAIL works on PHP versions 5.2.0+

Android Login Registration Project Structure

android login, android registration

In this project, we’ve used three libs for implementing the HTTP Calls in our application.
The JSONParser class is used for doing the POST and GET HTTP Calls to the localhost and returning the response in the form of a JSONObject.

Android Login Registration Code

The activity_main.xml layout is defined below.


<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:paddingLeft="24dp"
            android:paddingRight="24dp"
            android:id="@+id/linearLayout">

                <EditText android:id="@+id/editName"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="Username"
                    android:textColor="#FF192133"
                    android:textColorHint="#A0192133"
                    android:fontFamily="sans-serif-light"
                    android:focusable="true"
                    android:focusableInTouchMode="true" />

                <EditText android:id="@+id/editPassword"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="textPassword"
                    android:textColor="#FF192133"
                    android:textColorHint="#A0192133"
                    android:fontFamily="sans-serif-light"
                    android:hint="Password"
                    android:focusable="true"
                    android:focusableInTouchMode="true" />

                <EditText android:id="@+id/editEmail"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="textEmailAddress"
                    android:textColor="#FF192133"
                    android:visibility="gone"
                    android:textColorHint="#A0192133"
                    android:fontFamily="sans-serif-light"
                    android:hint="Email"
                    android:focusable="true"
                    android:focusableInTouchMode="true" />

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/btnSignIn"
                android:text="SIGN IN"
                android:textStyle="bold"
                />

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/btnRegister"
                android:text="REGISTER"
                android:textStyle="bold"
                />

        </LinearLayout>

    </RelativeLayout>

</ScrollView>

The MainActivity.java is given below.


package com.journaldev.loginphpmysql;

import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
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 org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {


    EditText editEmail, editPassword, editName;
    Button btnSignIn, btnRegister;

    String URL= "http://10.0.3.2/test_android/index.php";

    JSONParser jsonParser=new JSONParser();

    int i=0;

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

        editEmail=(EditText)findViewById(R.id.editEmail);
        editName=(EditText)findViewById(R.id.editName);
        editPassword=(EditText)findViewById(R.id.editPassword);

        btnSignIn=(Button)findViewById(R.id.btnSignIn);
        btnRegister=(Button)findViewById(R.id.btnRegister);

        btnSignIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AttemptLogin attemptLogin= new AttemptLogin();
                attemptLogin.execute(editName.getText().toString(),editPassword.getText().toString(),"");
            }
        });

        btnRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if(i==0)
                {
                    i=1;
                    editEmail.setVisibility(View.VISIBLE);
                    btnSignIn.setVisibility(View.GONE);
                    btnRegister.setText("CREATE ACCOUNT");
                }
                else{

                    btnRegister.setText("REGISTER");
                    editEmail.setVisibility(View.GONE);
                    btnSignIn.setVisibility(View.VISIBLE);
                    i=0;

                    AttemptLogin attemptLogin= new AttemptLogin();
                    attemptLogin.execute(editName.getText().toString(),editPassword.getText().toString(),editEmail.getText().toString());

                }

            }
        });


    }

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

        @Override

        protected void onPreExecute() {

            super.onPreExecute();

        }

        @Override

        protected JSONObject doInBackground(String... args) {



            String email = args[2];
            String password = args[1];
            String name= args[0];

            ArrayList params = new ArrayList();
            params.add(new BasicNameValuePair("username", name));
            params.add(new BasicNameValuePair("password", password));
            if(email.length()>0)
            params.add(new BasicNameValuePair("email",email));

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


            return json;

        }

        protected void onPostExecute(JSONObject result) {

            // dismiss the dialog once product deleted
            //Toast.makeText(getApplicationContext(),result,Toast.LENGTH_LONG).show();

            try {
                if (result != null) {
                    Toast.makeText(getApplicationContext(),result.getString("message"),Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(getApplicationContext(), "Unable to retrieve any data from server", Toast.LENGTH_LONG).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }


        }

    }
}

That’s a pretty big code! Let’s draw the important inferences from the above code.

  1. http://10.0.3.2 is the localhost rerouting address. This address works exclusively if you’re using the Genymotion emulator. Use http://10.0.2.2 for the AVD Emulator which is much improved now. If you’re running the application on your own device using your computer’s WIFI address instead. Example: http://192.168.0.143.
  2. When the REGISTER Button is clicked we programmatically hide the SIGN IN Button and display the Email Address input text field instead.
  3. The AttemptLogin class executes the network HTTP requests to our localhost in the background.
    The username password and email parameters are added to an ArrayList that are passed in the method makeHttpRequest(URL, “POST”, params); of the JSONParser class.
  4. In the onPostExecute Method we display the message string returned from the server in a Toast message.

The JSONParser.java class is given below.


package com.journaldev.loginphpmysql;

import android.util.Log;

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

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

/**
 * Created by anupamchugh on 29/08/16.
 */
public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static JSONArray jArr = null;
    static String json = "";
    static String error = "";

    // constructor
    public JSONParser() {

    }

    // function get json from url
    // by making HTTP POST or GET mehtod
    public JSONObject makeHttpRequest(String url, String method,
                                      ArrayList params) {

        // Making HTTP request
        try {

            // check for request method
            if(method.equals("POST")){
                // request method is POST
                // defaultHttpClient
                HttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));
                try {
                    Log.e("API123", " " +convertStreamToString(httpPost.getEntity().getContent()));
                    Log.e("API123",httpPost.getURI().toString());
                } catch (Exception e) {
                    e.printStackTrace();
                }

                HttpResponse httpResponse = httpClient.execute(httpPost);
                Log.e("API123",""+httpResponse.getStatusLine().getStatusCode());
                error= String.valueOf(httpResponse.getStatusLine().getStatusCode());
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            }else if(method.equals("GET")){
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }

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

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
            Log.d("API123",json);
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try to parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
            jObj.put("error_code",error);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }

    private String convertStreamToString(InputStream is) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        is.close();
        return sb.toString();
    }
}

In the above code, we’re calling the respective classes HTTPPost or HTTPGet depending on the the second parameter that’s passed in the makeHttpRequest function.

jObj.put("error_code",error);

Above, we are appending the response status code returned from the server in the final JSONObject that’s returned to the MainActivity class.

Note: Don’t forget to add the following permission in your AndroidManifest.xml file.


<uses-permission android:name="android.permission.INTERNET"/>
Many Users have posted their comments at the bottom of this tutorial, stating they’re getting “Unable to retrieve data” Toast.
Please note that since Android 6.0 and above you need to add the following attribute in your application tag in the Manifest.xml file:

android:usesCleartextTraffic="true"

Why so?
In order to allow the network security of the emulator/device to do http calls.

Please check the output with the latest screengrabs from Android Q emulator below.
Latest source code with the changes in the AndroidManifest.xml file is updated in the link and our Github Repository.

The output of the application in action is given below.

Android Registration User

In the below screengrab we register a new user and it gets added in the Database.
We then login using the credentials we entered during registration.

Android Login With Php Mysql Final Output

Android Login With Php Mysql Final Output

This brings an end to the Android Login with PHP MySQL Tutorial. You can download the project from the link below. It contains the test_android folder too that holds the PHP files. Copy it into the xampp->htdocs folder! Good Luck.

You can also access the full source code from our Github Repository below:

Comments

  1. guru says:

    protected void onPostExecute(JSONObject result) {

    try {
    if (result != null)
    {
    if (result.getString(“message”).equals(“Successfully logged in”)) {
    Intent intent = new Intent(MainActivity.this, Main2Activity.class);
    startActivity(intent);
    finish();
    } else {
    Toast.makeText(MainActivity.this, “Invalid credentials”, Toast.LENGTH_LONG).show();
    }
    } else {
    Toast.makeText(getApplicationContext(), “Unable to retrieve any data from server”, Toast.LENGTH_LONG).show();
    }
    }catch (JSONException e) {
    e.printStackTrace();

    1. Philip says:

      thank you sir

  2. guru says:

    while I run the app this error occurs,

    E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #4
    Process: com.example.myfirstdemo, PID: 32079
    java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:354)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
    at java.util.concurrent.FutureTask.run(FutureTask.java:271)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:764)
    Caused by: java.lang.IllegalArgumentException: Illegal character in path at index 35: http://192.168.100.222/androidlogin page/index.php
    at java.net.URI.create(URI.java:847)
    at org.apache.http.client.methods.HttpPost.(HttpPost.java:84)
    at com.example.myfirstdemo.JSONParser.makeHttpRequest(JSONParser.java:54)
    at com.example.myfirstdemo.MainActivity$AttemptLogin.doInBackground(MainActivity.java:106)
    at com.example.myfirstdemo.MainActivity$AttemptLogin.doInBackground(MainActivity.java:80)
    at android.os.AsyncTask$2.call(AsyncTask.java:333)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
    at java.lang.Thread.run(Thread.java:764) 
    Caused by: java.net.URISyntaxException: Illegal character in path at index 35: http://192.168.100.222/androidlogin page/index.php
    at java.net.URI$Parser.fail(URI.java:2892)
    at java.net.URI$Parser.checkChars(URI.java:3065)
    at java.net.URI$Parser.parseHierarchical(URI.java:3149)
    at java.net.URI$Parser.parse(URI.java:3097)
    at java.net.URI.(URI.java:583)
    at java.net.URI.create(URI.java:845)
    at org.apache.http.client.methods.HttpPost.(HttpPost.java:84) 
    at com.example.myfirstdemo.JSONParser.makeHttpRequest(JSONParser.java:54) 
    at com.example.myfirstdemo.MainActivity$AttemptLogin.doInBackground(MainActivity.java:106) 
    at com.example.myfirstdemo.MainActivity$AttemptLogin.doInBackground(MainActivity.java:80) 
    at android.os.AsyncTask$2.call(AsyncTask.java:333) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
    at java.lang.Thread.run(Thread.java:764) 
    D/EGL_emulation: eglMakeCurrent: 0xe33231c0: ver 3 0 (tinfo 0xeaabfc40)
    D/AutofillManager: onActivityFinishing(): calling cancelLocked()
    Application terminated.

    1. Anupam says:

      Your url has some invalid character. Please create a valid url name path.

      1. guru says:

        i try this (String URL= “http://10.0.2.2/loginpage/index.php”;) and also(String URL= “http://192.168.100.222/loginpage/index.php”;).

        now error occur like this

        E/Buffer Error: Error converting result java.lang.NullPointerException
        E/JSON Parser: Error parsing data org.json.JSONException: End of input at character 0 of

        in logcat

        1. guru says:

          its working

      2. guru says:

        where to use intent sir

        1. guru says:

          protected void onPostExecute(JSONObject result) {

          // dismiss the dialog once product deleted
          //Toast.makeText(getApplicationContext(),result,Toast.LENGTH_LONG).show();

          try {
          if (result != null) {
          Toast.makeText(getApplicationContext(),result.getString(“message”),Toast.LENGTH_LONG).show();

          // login to activity
          Intent intent = new Intent(getApplicationContext(),Main2Activity.class);
          startActivity(intent);

          }

          else {
          Toast.makeText(getApplicationContext(), “Unable to retrieve any data from server”, Toast.LENGTH_LONG).show();
          }
          } catch (JSONException e) {
          e.printStackTrace();
          }

          after give intent ,if i click incorrect user name and password ,login working …

          how to create the method intent ….

          1. Anupam says:

            Hi,
            You are creating an intent of the next activity irrespective of the response from the login API.
            Hence it goes to the next screen irrespective of whether the user name password is correct or not.

          2. guru says:

            this method also working same like before …
            where to post the code …and use it .plz help i m new

      3. guru says:

        use intent like this in post execution ,it works

        Intent intent_name = new Intent();
        intent_name.setClass(getApplicationContext(),DestinationClassName.class);
        startActivity(intent_name);

        1. Ramirez says:

          Hi admin I want break a logon of one apk that use php to login .can you help me

  3. Muhammad Zawawi Bin Manja says:

    I follow your steps carefully and it WORKED!!

    It work when using android emulator. For the standard Android Emulator use http://10.0.2.2. If you’re running the application on your own device using your computer’s WIFI address instead. Example: http://192.168.0.143.

  4. Ria says:

    Hello ,

    By using this code I am able to do login function but I got some issues in registration.Registration function is not working for my code . Can use of radio button and calander format be the issue for that to add data in table . Please reply.

    1. Anupam says:

      Please download the latest code from the Link/Github Repository.

  5. Andrea says:

    Hi,

    i did everything using Genymotion with the IP Address only for that and, as many users, I have the same problem when i try to register “Unable to retrieve data from server”, I used also my IP without using Genymotion but nothing changes…

    1. Vishal says:

      did you solve this problem i have the same.. plz help me if u have solution.. please… thanks

  6. Le says:

    Hello Admin,
    I got problem in login . It shows me message “Incorrect Details” even though I entered the right username and password that I have been registered. I also tried to add trim() in every edittext, but it doesn’t work at all only for sign in. Is there any solution I can use to solve this error?

    1. Le says:

      I just figured out how to solve this error. I deleted the converted password in index.php to normal string and it works!. I still don’t know why if I set the password into md5 in php and when I try to login it becomes failed. Anyway, thanks for the code Mr.Anum. I look forward to another tutorial. Thank you!

      // Login

      if(!empty($username) && !empty($password) && empty($email)){

      $json_array = $userObject->loginUsers($username, $password);

      echo json_encode($json_array);
      }
      ?>

  7. muhammed says:

    hello sir i have use your code but i am getting and error that unable to retrive data from the server

  8. Sharib Tanweer says:

    Not Working This Code All PHP.
    unable to register any data from server.

  9. Dlewis says:

    Hi,can I talk to you on android issues please. Thanks

  10. Fateh Akmal says:

    Thank You Very Much for the tutorial, I did it 1st time and it worked successfully. Now I need to display the detail of the user that has logged in. Would you mine to share the tutorial to display user’s information from the database please~? Thank You

  11. Akhilendra Pandey says:

    HI Anupam,

    I am not bale to retrieve any data from server.

    1. Anupam says:

      Please download the latest code from the Link/Github Repository.

  12. ryan says:

    hello, i am new to this how do i create 2 types of user?

  13. Hamza Naeem says:

    In the onPostExecute() funtion. The “result” is unable save the data. Due to which it is executing “else” toast. I donot understand where i went wrong. Plz help

    1. erick says:

      did you try to use postman ?

      were on the same error in onpostexecute
      pls feedback TY

      1. jkm says:

        which postman::

  14. Mim says:

    Why I can’t sign in? It says “Error in registering. Probably the username/email already exists.”

    The username and email is not the same from db.

    Help me please..

  15. Saba says:

    My application stops when i run it. It shows “com. Example. Login has stopped”. Checked for logcat and it shows error in onCreate method

  16. Saqueeb Shariff says:

    Sir, Can i get the same procedure for fetching the database from mysql & php?

  17. Nur says:

    i got this kind of error, help me please

    FAILURE: Build failed with an exception.

    * What went wrong:
    Execution failed for task ‘:app:transformResourcesWithMergeJavaResForDebug’.
    > More than one file was found with OS independent path ‘META-INF/DEPENDENCIES’

    * Try:
    Run with –stacktrace option to get the stack trace. Run with –info or –debug option to get more log output. Run with –scan to get full insights.

  18. johnlopev says:

    Hello there!

    Everything works perfectly. I have a question. How to check if the user is logged in already and then automatically redirected to the home page activity. Instead of logging every time I open the app.

    Thanks!

    1. Anupam says:

      Once the user has successfully logged in for the first time, save a key-value in the Shared Preferences.
      Check that everytime you open the application.

      Typically, to know whether the user has logged in, Oauth is integrated and implemented.

  19. bhagyashri says:

    When I press Sign In or create account button it says” unable to retrieve data from server”..i am running on my phone

    1. Abir says:

      Me too it says “unable to retrieve data from server ” plz help

  20. Nirav says:

    HI.

    I am using above mention codes. My application works fine only over my wifi but I am not able to use to from mobile network and other wifi networks. Please guide.

    1. aluto says:

      I guess you need to setup some kind of hosting. Because with mobile data on your phone, you cannot run it elsewhere except in localhost .

      if this is incorrect, pls tell me

  21. Nirav says:

    HI. I Have done everything. I am able to login as well but I want one more function I would be glad if you help.

    After successful login I want to switch activity as well. ( From MainActivity to other activity.)

  22. Mbulelo says:

    Hi….I’m getting the “unable to retrieve any data from the server”….. please help

    1. bhagyashri says:

      same error i get it what to do?

    2. Syirasky says:

      check your db connect php script .. because the example given contains error .. it should be mysqli_connect , not like in the example mysql_connect

  23. amit says:

    how to add registration by otp

    1. Anupam says:

      You need to write a php code for it.

      1. mbulelo says:

        Hi….When I press the Create Account button, I get the message “unable to retrieve any data from server”….please help on how I could overcome this problem or what I am doing wrong.

  24. Joe Joe Oej says:

    I want to read this article offline, how can i do that? Cause i’am not always connected to the internet. . .

    1. Anupam says:

      Hi Joe Joe,
      Luckily we have the Android Application ready just in time for you. We do provide an option to bookmark tutorials there.
      You can download it from the below link.
      https://play.google.com/store/apps/details?id=com.journaldev.app&hl=en_IN

  25. Swanand Joshi says:

    I want to set a role_id for admin and users how should I use them in both php and android.
    I planning to use with SharedPreferences but I don’t have much idea how it will fulfill please help

  26. Ashok says:

    When i am click on the create account button i am getting message as “unable to retrieve the server”
    please help me to solve this problem

    1. admin says:

      i get this notif too

  27. Joe Paul says:

    Thanku for the post. But my users who are registered are not shown in mysql.
    Can u pls help me.

  28. janki says:

    Hi sir..if i want to redirect after successful login then where should i put intent code means at which position..i tried but in that if user is not registered then also it will redirect activity..so please help to solve this problem.

    1. Anupam says:

      Check in the postExecute method if the “success” param is true.
      if(result.getBoolean(“success”)
      {
      //Create intent.
      }

  29. ghost says:

    Thank you for the amazing tutorial!
    Is it still recommended to use HttpClient ?
    if i wanted to use the URLConnecton what should i replace in the code?

    Thanks

  30. Akshay says:

    you forgot to see add library in android code and thats why main xml file is not created properly and in mani activity occur so many errors

  31. Akash says:

    Hi,
    i am facing depreciation for defaultHttpClient which is being triked off in my code how can i resolve that issue.

    1. Anupam says:

      Hi Akash,
      Add the following to your build.gradle.
      useLibrary 'org.apache.http.legacy'

  32. VJ says:

    loginphpmysql.iml thus it is required to put into the android project what is the use of that

  33. firefox mozilla not responding says:

    great post so thanks because this post is so amazing.

    1. Anupam says:

      Appreciate that!

  34. shahid Ali says:

    sir how can i get values from database to my activity???

  35. Grae says:

    The code works, but whenever I register a user, different password saves on the database. If I try to login, it says incorrect details though it is correct. What should I do?

  36. JUSTIN JOHN says:

    hello do i have to make any changes in code in php files? for eg dbconnect.php? mine is showing unable to retrive data from server! hope ull help?

    1. Praful Dhabekar says:

      Maybe you have to change password in config.php file.

  37. venkatesh says:

    100% working but can u please give us logout activity also

    1. Anupam says:

      Just create a new Activity Venkatesh. And add the intent to the new Activity in the current one.

  38. Cédric says:

    Thanks a lot for the nice tutorial. Now how to put an intent to login to direct it to a new activity?

    1. Anupam says:

      startActivity(new Intent(LoginActivity.java, NewActivity.java));

      1. beginner says:

        “startActivity(new Intent(LoginActivity.java, NewActivity.java));” sir where should i put this code? thanks

  39. sam says:

    package com.login;

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

    import static android.R.attr.name;

    public class SignActivity extends Activity {

    TextView snam,pass,loc,con,uname;
    EditText enam,epass,email,econ,eunam;
    Button subtn;
    sqlite sq;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign);

    enam = (EditText) findViewById(R.id.sena);
    epass = (EditText) findViewById(R.id.sepas);
    email = (EditText) findViewById(R.id.semail);
    econ = (EditText) findViewById(R.id.secpas);
    eunam = (EditText) findViewById(R.id.seuna);
    subtn = (Button) findViewById(R.id.subtn);

    subtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

    if (enam.getText().toString().equals(“”)|| email.getText().toString().equals(“”)) {

    enam.setError(“field is empty”);
    }
    else {

    ContentValues conValue = new ContentValues();
    conValue.put(“name”, enam.getText().toString());
    conValue.put(“loc”, email.getText().toString());
    conValue.put(“unam”, eunam.getText().toString());
    conValue.put(“pass”, epass.getText().toString());
    sqlite sqli = new sqlite(SignActivity.this);
    long i = sqli.insertAction(conValue, “login”);
    Toast.makeText(SignActivity.this, “successfully entered”+i, Toast.LENGTH_LONG).show();

    enam.setText(“”);
    email.setText(“”);
    epass.setText(“”);
    econ.setText(“”);
    eunam.setText(“”);
    }
    }
    });
    }
    }

  40. fawaz says:

    hi sir,

    is it possible to connect it with a server

  41. Dushantha says:

    public class AttemptLogin extends AsyncTask { /// i have an error in this portion can you please help

    @Override

    protected void onPreExecute() {

    super.onPreExecute();

    1. Aqsa Ayub says:

      i’m having the same error actually the problem is in dobackground method …..kindly help if you have debug this error..

      1. JUSTIN JOHN says:

        anyone got solution to this Async task?

        1. Grae says:

          it says on stackoverflow: replace AsyncTask with AsyncTask

  42. arjun says:

    I am not able to anything.
    Neither Sign In nor Register. Whatever I am trying to do it says Incorrect details. However there is no any whitespace between data. email is in correct format, still i am unable to register.

  43. Dushantha says:

    It is very useful tutorial…you have done great job with sharing knowledge with us…So i hope you will continue this..

    1. arjun says:

      In each case it arises “Incorrect Details” toast message??

    2. Anupam says:

      Dushantha, glad it helped you!

  44. Akhil ps says:

    public class AttemptLogin extends AsyncTask { /// i have an error in this portion can you please help

    @Override

    protected void onPreExecute() {

    super.onPreExecute();

  45. Urvashi Sondagar says:

    hi ,

    I m doing my final year MCA project on Canteen Automation System it will include two system i.e desktop application and android . i have developed android application in android studio and desktop in asp.net with C# and my database should be the common so that i can access same data from both mobile and desktop . can you please suggest which database i should use ?? i m very much confused between mysql and sql .
    your suggestion will help for me.

  46. Sarah Lee says:

    Hello

    is there a way to use web server such as 000webhost instead of xampp?

  47. lol says:

    “unable to retrieve data from server” – I get E/JSON Parser: Error parsing data org.json.JSONException: Value <script of type java.lang.String cannot be converted to JSONObject. Seems like I'm getting HTML respnsone instead of JSON.

  48. shabih says:

    i cant get login it will registered me but when i press login its says invalid details …

    1. Anupam says:

      Hi shabih,
      Apparently the there must be some whitespace after the email/password text.
      To ensure that whitespace isn’t taken into consideration, use
      editText.getText().toString().trim();

      Thanks

  49. Dev says:

    I’m facing some problem… Its not adding content to the db neither buttons are working.pls help me pls.

  50. Dev says:

    I’m facing some problem… Its not adding content to I he db neither buttons are working.pls help me

  51. Andy says:

    When I press Sign In or create account button it says” unable to retrieve data from server”..i am running on my phone

  52. LUSAATA DENIS says:

    thank you,
    i am still facing challenges to an apple running on my phone to login on the mysql database, i have followed all the steps,
    i tried when i setup hostednetwork on my laptop failed, also i tried when am using home wireless where both my phone and laptop are connected to also failed.
    when i click on login button it shows no change.

  53. yas says:

    perfect!! thxxxxx best tutorial .

    1. Anupam says:

      Hi yas,
      Happy to hear that

      Thanks

      1. ansa says:

        @Override

        protected JSONObject doInBackground(String… args) {

        String email = args[2];
        String password = args[1];
        String name= args[0];
        why this code gives erorr”method does not override” please tell the solution

        1. Anupam says:

          Hi Ansa,
          The AsyncTask declaration is like this:
          private class AttemptLogin extends AsyncTask<String, String, JSONObject> {
          //the methods are overridden here.
          }

          The code gives you an error because this wasn’t defined:
          <String, String, JSONObject>

          Apparently, it wasn’t visible in the post before. Though it’s present in the full source code when you download.
          I’ve updated the post. So it should be visible in the post too.

          Thanks

  54. Cli says:

    Hi Sir can i know what is the problem if the method of AttempLogin gives an error of it must be declared as abstract or implement abstract method ‘doInBackground(Params…)’ in ‘AsyncTask’ ?

    1. Mamman says:

      Finanally solved it, here’s the solution
      private class AddAsyncTask extends AsyncTask

      1. Massolihen Dasuki says:

        private class AttemptLogin extends AsyncTask

        1. Anupam says:

          Glad it helped you Mamman 🙂

      2. JUSTIN JOHN says:

        ???? where to add this

        1. Anupam says:

          The AsyncTask declaration is like this:
          private class AttemptLogin extends AsyncTask<String, String, JSONObject> {
          //the methods are overridden here.
          }

          The code gives you an error because this wasn’t defined:
          <String, String, JSONObject>

          Apparently, it wasn’t visible in the post before. Though it’s present in the full source code when you download.
          I’ve updated the post. So it should be visible in the post too.

    2. Anupam says:

      Hi Cli,

      The AsyncTask declaration is like this:
      private class AttemptLogin extends AsyncTask<String, String, JSONObject> {
      //the methods are overridden here.
      }

      The code gives you an error because this wasn’t defined:
      <String, String, JSONObject>

      Apparently, it wasn’t visible in the post before. Though it’s present in the full source code when you download.
      I’ve updated the post. So it should be visible in the post too.

      Thanks

  55. Munawar says:

    Sir First of all thank you very much .. and secondly sir plz teach ma that……. when i click sign in button then how to open a new activity form..

    1. Anupam says:

      Hi Munawar,
      Use Intents

      Thanks

  56. aamrin says:

    how i add verification code like whatsapp and other app verifies number how i add that source code in this code project please reply as soon as possible and help me for this coding.thanku

  57. Bruno says:

    How can I log out?

    1. Anupam says:

      Try creating a PHP function for that, just the same way as the login. Probably use an auth_token and clear it.

  58. Maper says:

    Hey, thanks for you perfect tutorial .. this was the most clear tutorial in the internet for me concerning login and registration in android!

    But one question:
    What is the best way to achieve that the new acitivty is only started after a successful login?

    If i am not mistaken, the new intent code should be inserted here:

    if (result != null) {
    Toast.makeText(getApplicationContext(),result.getString(“message”),Toast.LENGTH_LONG).show();
    // Open startBildschirm
    Intent intent = new Intent(getApplicationContext(), XXXACTIVTYXXX.class);
    startActivity(intent);

    The problem is that the new activity is started in any case…
    Should I check
    if result.getString(‘message’) == “Sucessfull Login” -> start Intent
    or is there a better way?

    Thank you so much!

    1. Anupam says:

      Hi Maper,

      Yes you’re right. This is the ideal way indeed.
      if result.getString(‘message’).equals(“Successful Login”))
      {
      //Intent statement
      }

      1. Devesh Soni says:

        sir help me to solve this error – AttempLogin gives an error of it must be declared as abstract or implement abstract method ‘doInBackground(Params…)’ in ‘AsyncTask’

        1. Anupam says:

          Hi Devesh,
          The AsyncTask declaration is like this:
          private class AttemptLogin extends AsyncTask<String, String, JSONObject> {
          //the methods are overridden here.
          }

          The code gives you an error because this wasn’t defined:
          <String, String, JSONObject>

          Apparently, it wasn’t visible in the post before. Though it’s present in the full source code when you download.
          I’ve updated the post. So it should be visible in the post too.

          Thanks

      2. abdul sibak says:

        a lot of concern about “unable to retrieve data from the server” has been mentioned in the comments . why does the dev doesnt addressing this concern??

        1. Anupam says:

          Hi Adbul,
          The latest code and the reason for it not working for many users has been updated in the post.

          Thanks

  59. Rose says:

    When I press Sign In or create account button it says” unable to retrieve data from server”. Please help me to resolve it.

    1. Anupam says:

      Hi Rose,
      “unable to retrieve data from server” indicates that the result retrieved from the web server is NULL. You should cross check the following things in your code:
      Is your network connection stable?
      Is your xampp sever running correctly?
      Is your localhost url http://10.0.3.2 ? It depends on whether you’re using genymotion or the standard emulator.

      1. Fisch says:

        I’m having the same problem…

        Is your network connection stable? -Yes
        Is your xampp sever running correctly? -Yes

        The only thing is that I’m using the standard emulator.

        Please help.

        1. Praful Dhabekar says:

          bro did you got the solution?

          1. Akshit says:

            Did any of you get a solution to this? I’m stuck here too!

          2. Akshit says:

            I wasn’t connecting my phone and laptop on a common network. I shared my phone’s hotspot with my laptop and it worked! Hope this helps.

          3. Anupam says:

            Great Observation Akshit. This should help quite a few people. Nicely figured it out!

  60. Bibhuti says:

    Where do i put the New Intent code to start a new activity after successful Login and Register???????? PLZ HELP?

    1. Anupam says:

      Hi Bibhuti,

      if (result != null) {
      Toast.makeText(getApplicationContext(),result.getString(“message”),Toast.LENGTH_LONG).show();
      //INTENT statement goes in here.
      }

  61. Bibhuti says:

    Thank u sir…..its 100% correct……i got it…..awesome codes

    1. Anupam says:

      Hi Bibhuti,
      Happy to know that

      Thanks

      1. raghu says:

        Though Intent Condition has Entered it is not working!!!

    2. raghu says:

      Hi Bibhuti,

      It’s not working for me….. once post u’r code

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages