Kết nối android với mysql (Phần 3)

Bài viết kết nối android với mysql sẽ hướng dẫn các bạn sử dụng REST API trong Android sử dụng PHP, Slim và MySQL. Các thao tác thêm và truy vấn dữ liệu MySQL từ ứng dụng Android cũng sẽ được trình bày trong bài viết này.

Chương trình được xây dựng trong bài viết này gồm 3 màn hình. Màn hình thứ nhất gồm 2 nút cho phép người dùng lựa chọn chức năng thêm mới tài khoản hoặc chức năng đăng nhập vào hệ thống.

Màn hình chính

kết nối android với mysql

Màn hình thêm mới tài khoản

kết nối android với mysql

Màn hình đăng nhập vào hệ thống

kết nối android với mysql

Kết nối android với mysql – Chuẩn bị

1. REST API

2. Cơ sở dữ liệu

3. Icon

Kết nối android với mysql – Các bước thực hiện

Bước 1: Cài đặt webserver XAMPP. Trường hợp đã cài đặt webserver thì bỏ qua bước này

Bước 2: Tạo thư mục rest trong thư mục htdocs của XAMPP -> sau đó giải nén tập tin rest.rar vào thư mục rest (chi tiết vui lòng xem hình bên dưới)

kết nối android với mysql

Bước 3: Truy cập http://localhost:port/phpmyadmin và tạo cơ sở dữ liệu

Chọn Import -> chọn Choose File, chọn tập tin rest.sql -> chọn Go

kết nối android với mysql

Bước 4: Thiết kế giao diện và viết xử lý

Tạo lớp MyService

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.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 java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

/**
* Created by GiaSuTinHoc.vn on 28/12/2015.
*/
public class MyService {
  static InputStream is = null;
  static String response = null;
  public final static int GET = 1;
  public final static int POST = 2;

  public String makeService(String url, int method) {
   return this.makeService(url, method, null);
  }
  public String makeService(String url, int method, List<NameValuePair> params) {
   try {
    // http client
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpEntity httpEntity = null;
    HttpResponse httpResponse = null;
    
    // Checking http request method type
    if (method == POST) {
      HttpPost httpPost = new HttpPost(url);

     // adding post params
     if (params != null) {
       httpPost.setEntity(new UrlEncodedFormEntity(params));
     }
     httpResponse = httpClient.execute(httpPost);
   } else if (method == GET) {
     // appending params to url
     if (params != null) {
       String paramString = URLEncodedUtils.format(params, "utf-8");
       url += "?" + paramString;
     }
     HttpGet httpGet = new HttpGet(url);
     httpResponse = httpClient.execute(httpGet);
   }
   httpEntity = httpResponse.getEntity();
   is = httpEntity.getContent();
  } catch (Exception ex) {
     Log.e("Buffer Error", "Error: " + e.toString());
  } 
  try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8);
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
       sb.append(line + "\n");
    }
   is.close();
   response = sb.toString();
  } catch (Exception e) {
     Log.e("Buffer Error", "Error: " + e.toString());
  }
  return response;
}
}

Tạo activity tên RestRegisterActivity

kết nối android với mysql

Viết xử lý

import android.androidpractice.mysql.MyService;	 	 
import android.app.NotificationManager;	 	 
import android.app.ProgressDialog;	 	 
import android.content.Context;	 	 
import android.os.AsyncTask;	 	 
import android.support.v7.app.AppCompatActivity;	 	 
import android.support.v4.app.NotificationCompat;	 	 
import android.support.v4.app.NotificationCompat.Builder;	 	 
import android.os.Bundle;	 	 
import android.util.Log;	 	 
import android.view.View;	 	 
import android.widget.EditText;	 	 
import org.apache.http.NameValuePair;	 	 
import org.apache.http.message.BasicNameValuePair;	 	 
import org.json.JSONException;	 	 
import org.json.JSONObject;	 	 
import java.util.ArrayList;	 	 
import java.util.List;	 	
 
public class RestRegisterActivity extends AppCompatActivity {	 	 
  ProgressDialog pd;	 	 
  MyService sh;	 
	 
  final String URL_REGISTER = "http://10.0.2.2:port/rest/register";	 	 

  EditText etName, etEmail, etPassword;	 	 
  private NotificationManager nm;	 	 
  private Builder b;	 	 
  int id = 1;	 	 
 
  @Override	 	 
  protected void onCreate(Bundle savedInstanceState) {	 	 
   super.onCreate(savedInstanceState);	 	 
   setContentView(R.layout.activity_rest_register);	 	 
 
   etName = (EditText)findViewById(R.id.etName);	 	 
   etEmail = (EditText)findViewById(R.id.etEmail);	 	 
   etPassword = (EditText)findViewById(R.id.etPassword);	 	 
   sh = new MyService();	 	 
   nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);	 	 
   b = new NotificationCompat.Builder(RestRegisterActivity.this);	 	 
 }
	 	 
 public void registerAction(View view){	 	 
   String name, email, password;	 	 
   name = etName.getText().toString();	 	 
   email = etEmail.getText().toString();	 	 
   password = etPassword.getText().toString();	 	 
   new RegisterWS(name,email, password).execute();	 	 
 }
	 	 
 private void createNotification(String contentTitle, String contentText, String error) {	 	 
   b.setContentTitle(contentTitle)
   b.setContentText(contentText);	 	 
   if("false".equals(error))	 	 
     b.setSmallIcon(R.drawable.icon_success);	 	 
   else	 	 
     b.setSmallIcon(R.drawable.ic_error);	 	 

   nm.notify(id, b.build());     	 	 
 }

 //inner class	 	 
 class RegisterWS extends AsyncTask {	 	 
   String name;	 	 
   String email;	 	 
   String password;	 	 
   public RegisterWS(String name, String email, String password) {	 	 
    this.name = name;	 	 
    this.email = email;	 	 
    this.password = password;	 	 
   }
	 	 
   @Override	 	 
   protected void onPreExecute() {	 	 
     super.onPreExecute();	 	 
     pd = new ProgressDialog(RestRegisterActivity.this);	 	 
     pd.setMessage("Creating...");	 	 
     pd.setIndeterminate(false);	 	 
     pd.setCancelable(true);	 	 
     pd.show();	 	 
   }
	 	 
   @Override	 	 
   protected Object doInBackground(Object[] params) {	 	 
    // Building Parameters	 	 
    List<NameValuePair> args = new ArrayList<NameValuePair>();	 	 
    args.add(new BasicNameValuePair("name", name));	 	 
    args.add(new BasicNameValuePair("email", email));	 	 
    args.add(new BasicNameValuePair("password", password));
	 	 
   // getting JSON Object	 	    
   String json = sh.makeService(URL_REGISTER, MyService.POST, args);
	 	 
   if (json != null) {	 	 
    try {	 	 
     JSONObject jsonObject = new JSONObject(json);	 	 
     String error = jsonObject.getString("error");	 	 
     if(!error.isEmpty()){	 	 
       createNotification("Notification", jsonObject.getString("message"), error);	 	 
     }	 	 
    } catch (JSONException e) {	 	 
        Log.d("Error...", e.toString());	 	 
    }	 	 
   }	 	 
   return null;	 	 
 }
	 	 
 @Override	 	 
 protected void onPostExecute(Object o) {	 	 
   super.onPostExecute(o);	 	 
   pd.dismiss();	 	 
 }	 	 
 }	 	 
}

Tạo activity tên RestLoginActivity

kết nối android với mysql

Viết xử lý

import android.androidpractice.mysql.MyService;	 	 
import android.app.NotificationManager;	 	 
import android.app.ProgressDialog;	 	 
import android.content.Context;	 	 
import android.os.AsyncTask;	 	 
import android.support.v4.app.NotificationCompat;	 	 
import android.support.v7.app.AppCompatActivity;	 	 
import android.os.Bundle;	 	 
import android.util.Log;	 	 
import android.view.View;	 	 
import android.widget.EditText;	 	 
import org.apache.http.NameValuePair;	 	 
import org.apache.http.message.BasicNameValuePair;	 	 
import org.json.JSONException;	 	 
import org.json.JSONObject;	 	 
import java.util.ArrayList;	 	 
import java.util.List;	 	 
public class RestLoginActivity extends AppCompatActivity {	 	 
  ProgressDialog pd;	 	 
  MyService sh;	 	 
  final String URL_LOGIN = "http://10.0.2.2:port/rest/login";	 	 
  EditText etEmail, etPassword;	 
	 
  private NotificationManager nm;	 	 
  private NotificationCompat.Builder b;	 	 
  int id = 1;	 	 

  @Override	 	 
  protected void onCreate(Bundle savedInstanceState) {	 	 
    super.onCreate(savedInstanceState);	 	 
    setContentView(R.layout.activity_rest_login);	 	 
 
    etEmail = (EditText)findViewById(R.id.etEmail_Login);	 	 
    etPassword = (EditText)findViewById(R.id.etPassword_Login);	 	 
    
    sh = new MyService();	 	 
    nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);	 	 
    b = new NotificationCompat.Builder(RestLoginActivity.this);	 	 
  }
	 	 
  public void loginAction(View view){	 	 
    String email, password;	 	 
    email = etEmail.getText().toString();	 	 
    password = etPassword.getText().toString();	 	 
    new WS(email, password).execute();	 	 
  }
	 	 
  private void createNotification(String contentTitle, String contentText, String error) {	 	 
    b.setContentTitle(contentTitle);	 	 
    b.setContentText(contentText);	 
	 
    if("false".equals(error)) {	 	 
      b.setSmallIcon(R.drawable.icon_success);	 	 
    } else {	 	 
      b.setSmallIcon(R.drawable.ic_error);	 	 
    }	 	
 
    nm.notify(id, b.build());	 	 
 }

 //inner class	 	 
 class WS extends AsyncTask {	 	 
   String email;	 	 
   String password;	 	 
 
   public WS(String email, String password) {	 	 
     this.email = email;	 	 
     this.password = password;	 	 
   }
	 	 
   @Override	 	 
   protected void onPreExecute() {	 	 
     super.onPreExecute();	 	 
     pd = new ProgressDialog(RestLoginActivity.this);	 	 
     pd.setMessage("Handling...");	 	 
     pd.setIndeterminate(false);	 	 
     pd.setCancelable(true);	 	 
     pd.show();	 	 
   }
	 	 
    @Override	 	 
    protected Object doInBackground(Object[] params) {	 	 
     // Building Parameters	 	 
     List<NameValuePair> args = new ArrayList<NameValuePair>();	 	 
     args.add(new BasicNameValuePair("email", email));	 	 
     args.add(new BasicNameValuePair("password", password));	 	 
 
     // getting JSON Object	 	  
     String json = sh.makeServiceCall(URL_LOGIN, MyService.POST, args);	 	 
     if (json != null) {	 	 
      try {	 	 
         JSONObject jsonObject = new JSONObject(json);	 	 
         String error = jsonObject.getString("error");	 	 
         if("true".equals(error)){	 	 
           createNotification("Notification", jsonObject.getString("message"), error);	 	 
         } else {	 	 
           createNotification("Notification", "Login successful", error);	 	 
         }	 	 
      } catch (JSONException e) {	 	 
        Log.d("Error...", e.toString());	 	 
      }	 	 
     }	 	 
    return null;	 	 
   }	 	 
 
   @Override	 	 
   protected void onPostExecute(Object o) {	 	 
     super.onPostExecute(o);	 	 
     pd.dismiss();	 	 
   }	 	 
 }	 	 
}

Tạo activity tên MainRestActivity

kết nối android với mysql

Viết xử lý

import android.content.Intent;	 	 
import android.support.v7.app.AppCompatActivity;	 	 
import android.os.Bundle;	 	 
import android.view.View;	 	 

public class MainRestActivity extends AppCompatActivity {	 	 
 Intent intent;	 	 
 @Override	 	 
 protected void onCreate(Bundle savedInstanceState) {	 	 
   super.onCreate(savedInstanceState);	 	 
   setContentView(R.layout.activity_main_rest);	 	 
 }
	 	 
 public void registerActivity(View view){	 	 
   intent = new Intent(this, RestRegisterActivity.class);	 	 
   startActivity(intent);	 	 
 }
	 	 
 public void loginActivity(View view){	 	 
   intent = new Intent(this, RestLoginActivity.class);	 	 
   startActivity(intent);	 	 
 }	 	 
}

Kết nối android với mysql – Build và run

Màn hình đăng ký

Trường hợp không nhập thông tin và chạm nút REGISTER

Ket noi android voi mysql 66

Chạm, giữ và di chuyển về phía bên dưới để xem thông báo

Ket noi android voi mysql 67

Trường hợp nhập đầy đủ thông tin và chạm vào nút REGISTER

Ket noi android voi mysql 68

Chạm, giữ và di chuyển về phía bên dưới để xem thông báoKet noi android voi mysql 69

Màn hình đăng nhập

Trường hợp không nhập thông tin và chạm vào nút LOGIN

Ket noi android voi mysql 610

Thông báo lỗi

Ket noi android voi mysql 611

Trường hợp nhập đầy đủ thông tin và hợp lệ

Ket noi android voi mysql 612

Xem thông báo

Ket noi android voi mysql 613

Chúc các bạn thành công!
BQT – http://giasutinhoc.vn