Monday, July 16, 2012

Android Login activity with MySQL database connection

Here I'm going to create a simple Android log in application  which can post data to a java web service and read data from MySQL database using a java web service to authenticate the user. Tested on Android 2.2.
(In latest versions of Android you cannot access the web in same way mentioned here. if you are planning implement web access for version 3.0 or higher than that follow one of below methods
1.Async Task
 http://codeoncloud.blogspot.com/2013/07/android-web-service-access-using-async.html
2.Handlers
http://codeoncloud.blogspot.com/2013/06/android-java-soap-web-service-access.html )

Quick demo :



The complete project has three main components

1. A MySQL database which holds user name and password.
2. A java web service deployed on Tomcat server.
3.Android application to access the database through the java web service to verify the user.

1. Databse
First we have to create a database and table to store user information. To create the database I used MySQL command line client. (If you like you can use phpmyadmin it is easier)
In order to create the database, a table and to populate the database run following queries.
a. Create the database
CREATE DATABSE androidlogin;
b. Select the database
USE androidlogin;
c. Create a table
CREATE TABLE user(
username VARCHAR(20) NOT NULL,
password VARCHAR(20) NOT NULL);
d.Populate the database
INSERT INTO user(username,password)
VALUES('admin','123');

2. Java webservice
Create the java web service in Eclipse. Follow the steps mentioned here. Additionally you have to import JDBC connector to the web service project.  
Here is the content for java web service.
package com.userlogin.ws;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Login {
 public String authentication(String userName,String password){
  
  String retrievedUserName = "";
  String retrievedPassword = "";
  String status = "";
  try{
   
   Class.forName("com.mysql.jdbc.Driver");
   Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/androidlogin","root","chathura");
   PreparedStatement statement =  con.prepareStatement("SELECT * FROM user WHERE username = '"+userName+"'");
   ResultSet result = statement.executeQuery();
   
   while(result.next()){
    retrievedUserName = result.getString("username");
    retrievedPassword = result.getString("password");
    }
   
   if(retrievedUserName.equals(userName)&&retrievedPassword.equals(password)){
    status = "Success!";
   }
   
   else{
    status = "Login fail!!!";
   }
   
  }
  catch(Exception e){
   e.printStackTrace();
  }
  return status;
 
 }

}

> For more details read my first post.
> "root" and "chathura" in line 17 are user and the password of the database. You need to change those according to your settings.

3. Android application.
a. Code for main activity
package com.androidlogin.ws;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class AndroidLoginExampleActivity extends Activity {
 private final String NAMESPACE = "http://ws.userlogin.com";
    private final String URL = "http://111.223.128.10:8085/AndroidLogin/services/Login?wsdl";
    private final String SOAP_ACTION = "http://ws.userlogin.com/authentication";
    private final String METHOD_NAME = "authentication";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button login = (Button) findViewById(R.id.btn_login);
        login.setOnClickListener(new View.OnClickListener() {
   
   public void onClick(View arg0) {
    loginAction();
    
   }
  });
    }
    
    private void loginAction(){
     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
     
        EditText userName = (EditText) findViewById(R.id.tf_userName);
        String user_Name = userName.getText().toString();
        EditText userPassword = (EditText) findViewById(R.id.tf_password);
        String user_Password = userPassword.getText().toString();
        
      //Pass value for userName variable of the web service
        PropertyInfo unameProp =new PropertyInfo();
        unameProp.setName("userName");//Define the variable name in the web service method
        unameProp.setValue(user_Name);//set value for userName variable
        unameProp.setType(String.class);//Define the type of the variable
        request.addProperty(unameProp);//Pass properties to the variable
       
      //Pass value for Password variable of the web service
        PropertyInfo passwordProp =new PropertyInfo();
        passwordProp.setName("password");
        passwordProp.setValue(user_Password);
        passwordProp.setType(String.class);
        request.addProperty(passwordProp);
          
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        
        try{
            androidHttpTransport.call(SOAP_ACTION, envelope);
               SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
                
               TextView result = (TextView) findViewById(R.id.tv_status);
               result.setText(response.toString());
          
        }
        catch(Exception e){
          
        }
       }
    
}

> You need to import ksoap2 library for the Android project.
> You cannot access the URL in above code because the web service is deployed in Tomcat server installed in my computer not in a cloud server therefore you have to replace that with an URL for your own web service. 
>  For more details check these posts.
 1. Post 1
 2. Post 2

b. Content of main.xml


    

        
    

    



    

    


    

c. You need to add internet permission to the project
Manifest.xml


    
    

    
        
            
                

                
            
        
    



You can download Android project here
(After downloading the project first remove imported ksoap2 library from the project and re import ksoap2 from your hard disk )

Please post your ideas :)

Thursday, July 12, 2012

Android MySQL Client (Part 2)

Insert data to a database.

My first tutorial Android MySQL client is about read data from a MySQL database. Here I'm going to insert data to MySQL database using an Android program. Concept is same as before (Before start test this read first tutorial.)

Program has three main parts.
1. Database (MySQL)
2. Java web service.
3. Android application.

Java web service deployed on Tomcat server has a method which accepts two values and it runs a quarry on database to insert data & also this method returns a string.
The Android application calls that web service method remotely with two values using ksoap library. Then web service runs a query on database table and inserts data




1. First create the database and table.

CREATE DATABASE login;

USE login;

CREATE TABLE users(
name varchar(20),
password  varchar(20)
);

2. Then create the web service
Here is the content of my web service
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class Users {
 
 public String insertData(String userName,String userPassword){
  
  try{
   
   Class.forName("com.mysql.jdbc.Driver");
   Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/login","root","chathura");
   PreparedStatement statement =  con.prepareStatement("INSERT INTO users(name,password) VALUES ('"+userName+"','"+userPassword+"');");
   int result = statement.executeUpdate();
  }
  
   catch(Exception exc){
    System.out.println(exc.getMessage());
    }

  return "Insertion successfull!!";
  }

}
In line 12 root and chathura are user and the password. Change those with your username and the password.
This java web service has JDBC connector to access the database. Click here to download the connector.Import JDBC connector to your project. This tutorial is about importing the ksaop library. In the same way you can import JDBC library also. It is simple
You can implement the web service easily by following my these posts.
1. Create java web service in Eclipse using Axis2 (Part 01) 
2. Create java web service in Eclipse using Axis2 (Part 02) 

3. Android application.

The Android application uses ksoap2 library to access java web service. You can find More details about implementation of Android client applications from here. If you are planning to use new Android version read this tutorial.

Here is the code for Android application.
You need to change name space, url, soap action and method name according to your web service.

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class AndroidMySQLClientActivity extends Activity{
    private final String NAMESPACE = "http://ws.login.com";
    private final String URL = "http://175.157.3.42:8085/InsertToUsers/services/Users?wsdl";
    private final String SOAP_ACTION = "http://ws.login.com/insertData";
    private final String METHOD_NAME = "insertData";
    Button btninsert;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btninsert = (Button)findViewById(R.id.btn_insert);
        btninsert.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
             insertValues();
            }
        });
    }
    
    public void insertValues(){
     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
     EditText userName = (EditText) findViewById(R.id.editText1);
     String user_Name = userName.getText().toString();
     EditText userPassword = (EditText) findViewById(R.id.editText2);
     String user_Password = userPassword.getText().toString();
     
     //Pass value for userName variable of the web service
        PropertyInfo unameProp =new PropertyInfo();
        unameProp.setName("userName");//Define the variable name in the web service method
        unameProp.setValue(user_Name);//Define value for fname variable
        unameProp.setType(String.class);//Define the type of the variable
        request.addProperty(unameProp);//Pass properties to the variable
      
      //Pass value for userPassword variable of the web service
        PropertyInfo passwordProp =new PropertyInfo();
        passwordProp.setName("userPassword");
        passwordProp.setValue(user_Password);
        passwordProp.setType(String.class);
        request.addProperty(passwordProp);
         
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
     
        try{
         androidHttpTransport.call(SOAP_ACTION, envelope);
            SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
            
            TextView result = (TextView) findViewById(R.id.textView2);
            result.setText(response.toString());
      
     }
     catch(Exception e){
      
     }
    }

}

4.Code for main.xml file


    

    

    

        
    

    


    

5. Content of the Manifest.xml (Add internet permission)

    
    
    
        
            
                
                
            
        
    


Note : Click here to download the Android project.
Do you think this is helpful ? Please write your ideas :)

Wednesday, July 11, 2012

Android Httpclient

In this tutorial I'm going to build a simple BMI calculator to show how we can post data to a URL using HTTP POST.

Here is the sample php code that you can use
<?php
       $userWeight = $_POST['weight'];
       $userHeight = $_POST['height'];
       $powerOfHeight = pow($userHeight,2);
       echo($userWeight/$powerOfHeight);
?>

Android activity
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;


public class AndroidWebActivity extends Activity implements OnClickListener {
 Button calculate;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        calculate = (Button)findViewById(R.id.button1);
        calculate.setOnClickListener((OnClickListener) this);
    }
   
    public void bmi(){
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://codeincloud.tk/bmi.php");
     
        try{
     EditText weight = (EditText) findViewById(R.id.editText1);
     String myWeight = weight.getText().toString();
     
     EditText height = (EditText) findViewById(R.id.EditText01);
     String myHeight = height.getText().toString();
     
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
         nameValuePairs.add(new BasicNameValuePair("weight", myWeight));
         nameValuePairs.add(new BasicNameValuePair("height", myHeight));
         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
         HttpResponse response = httpclient.execute(httppost);
         
         String bmiResult = inputStreamToString(response.getEntity().getContent()).toString();
         TextView result = (TextView) findViewById(R.id.textView4);
         result.setText("Your BMI : "+bmiResult);
     }
     
        catch(Exception e){
      e.printStackTrace();
     }
    }
    
    private StringBuilder inputStreamToString(InputStream is) {
        String rLine = "";
        StringBuilder answer = new StringBuilder();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        
        try {
         while ((rLine = rd.readLine()) != null) {
          answer.append(rLine);
           }
        } 
        
        catch (IOException e) {
            e.printStackTrace();
         }
        return answer;
       }
    
    public void onClick(View view) {
        if(view == calculate){
         bmi();
        }
      }
}

Here is the code of main.xml used in above application

    
    
   
    
       
    
    
    
   
    

Add internet permission to the Manifest file


    
    

    
        
            
                

                
            
        
    


Click here download the Android project.

Monday, July 9, 2012

Android php web service client

In this post I'm going to show you how we can access a very simple php web service from an Android application.
You can host your web service on wamp server installed in your machine or you can simply use a cloud server like 000webhost.

1. To keep things simple I'm going to use a dummy php code as follows
    <?php
        echo "Hello world!!!!"
  ?>
Create this php file and copy it in to www directory of wamp server or upload it in to a cloud server.

2. Here is the code for Android activity
import android.app.Activity;
import android.os.Bundle;
import java.io.IOException;
import android.widget.TextView;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class AndroidWebActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://www.codeincloud.tk/First.php");
        try {
           HttpResponse response = httpclient.execute(httppost);
           final String str =  EntityUtils.toString(response.getEntity());
           TextView tv = (TextView) findViewById(R.id.textView1);
           tv.setText(str);
        } 
       catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
        }
    }
}

Note : If you are using wamp server don't use local host for the url in line 18, use 10.0.2.2.
           Eg: http://10.0.2.2/android_connect/first.php
Don't forget to add internet permission.
Output of the program :