[JSP]-Bài tập jsp+el


Trong bài này chúng ta sủ dụng static function để giao tiếp với database, EL để kiểm tra điều kiện thực hiện và jsp expression để tạo session.

  • Tạo các hàm
  • đăng ký với webserver
  • sử dụng trên trang jsp

TAO CáC HàM


package codes;

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

/**
 *
 * @author TEACHER
 */
public class Employee {

    static public int addNew(String firstName, String lastName) {
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
             Connection conn = DriverManager.getConnection(""
                     + "jdbc:sqlserver://172.16.160.54\\sql2008;"
                    + "databasename=northwind;", "sa", "sa");

            PreparedStatement comm = conn.prepareCall(""
                    + "Insert Into Employees(FirstName, LastName) "
                    + "Values(?,?)");

            comm.setString(1, firstName);
            comm.setString(2, lastName);

            return comm.executeUpdate();
        } catch (Exception ex) {
            return 0;
        }
    }
    
    static public String list() {
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            Connection conn = DriverManager.getConnection(""
                    + "jdbc:sqlserver://172.16.160.54\\sql2008;"
                    + "databasename=northwind;", "sa", "sa");

            PreparedStatement comm = conn.prepareCall(""
                    + "Select EmployeeID [Code], FirstName , LastName "
                    + "From Employees order by EmployeeID desc");

            ResultSet rs = comm.executeQuery();
            
            String str ="";
            
            while(rs.next())
            {
                str += "<br />Code: "+ rs.getString("Code") + " FullName: " + 
                    rs.getString("LastName") + " " + rs.getString("FirstName");
            }
            
            return str;
            
        } catch (Exception ex) {
            return "";
        }
    }
}

đăNG Ký

<function>
       <name>addNew</name>
       <function-class>codes.Employee</function-class>
       <function-signature>
           int addNew(java.lang.String, java.lang.String)
       </function-signature>
   </function>
   
    <function>
       <name>list</name>
       <function-class>codes.Employee</function-class>
       <function-signature>
           java.lang.String list()
       </function-signature>
   </function>

Gọi: Trang login.jsp

<%-- 
    Document   : login
    Created on : Aug 13, 2015, 7:47:26 AM
    Author     : TEACHER
--%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Login</h1>
        <c:if test="${!empty param.btnLogin}">
            <c:if test="${param.txtU == 'admin' && param.txtP == 'admin'}">
                <!--Create session-->
                <% session.setAttribute("login", "admin");%>
                <!--Check return required login page-->
                <c:if test="${! empty param.returnUrl}">
                    <!--replace current content by required login page-->
                    <jsp:forward page="${param.returnUrl}"/>
                </c:if>
                <!--replace current content by home page-->
                <jsp:forward page="home.jsp"/>
            </c:if>
        </c:if>

        <form method="POST">
            UserName<br/>
            <input type="text" name="txtU" value="" /><br/>
            Password<br/>
            <input type="password" name="txtP" value="" /><br/>
            <input type="submit" value="Login" name="btnLogin" />            
        </form>
    </body>
</html>

Trang index.jsp

<%-- 
    Document   : index
    Created on : Aug 13, 2015, 7:38:02 AM
    Author     : TEACHER
--%>

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<%@taglib prefix="my" uri="/WEB-INF/tlds/myLib" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <!--check login session-->
        <c:if test="${empty sessionScope.login}">
            <!--display login page -->
            <!-- add returnUrl param to login page -->
            <!--login.jsp?returnUrl=index.jsp-->
            <jsp:forward page="login.jsp">               
                <jsp:param name="returnUrl" value="index.jsp"/>
            </jsp:forward>
        </c:if>    

        <c:if test="${!empty param.btnAdd}">
            <!--display emp list if add ok-->
            <c:if test="${my:addNew(param.txtFirstName, param.txtLastName) == 1}">
                ${my:list()}
            </c:if>       
        </c:if>

        <h1>Add new record</h1>
        <form method="POST">
            FirstName<br/>
            <input type="text" name="txtFirstName" value="${param.txtFirstName}" /><br/>
            Lastname<br/>
            <input type="text" name="txtLastName" value="${param.txtLastName}" /><br/>
            <input type="submit" value="Add new" name="btnAdd" />            
        </form>
    </body>
</html>

Tham khảo các video ==>> https://www.youtube.com/playlist?list=PLXImJ6jTTEi4T-f1GiKY4NwTW3We6IYbY

Advertisements

Android – List and kill background process


Android OS is a multitasking operating, there are a lot of running background process, these process make your device will be slower. Android SDK provides set of API allow developer can list all background process and kill (stop) them.
In this post, we will discussing about how listing and kill background process in Android device.

List all android background processes
List all android background processes

We need two permission are KILL_BACKGROUND_PROCESSES and to GET_TASKS.
Declare two permission as

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

Declare 2 variable

List<ActivityManager.RunningAppProcessInfo> processes;
ActivityManager amg;

Register service with Android get all running processes

// using Activity service to list all process
amg = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
// list all running process
processes = amg.getRunningAppProcesses();

Create MyAdapter class extend BaseAdapter class to populate process’s information on ListView as

public class MyAdapter extends BaseAdapter {

    List<ActivityManager.RunningAppProcessInfo> processes;
    Context context;

    public MyAdapter(List<ActivityManager.RunningAppProcessInfo> processes, Context context) {
        this.context = context;
        this.processes = processes;
    }

    @Override
    public int getCount() {
        return processes.size();
    }

    @Override
    public Object getItem(int position) {
        return processes.get(position);
    }

    @Override
    public long getItemId(int position) {
        return processes.get(position).pid;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        Process pro;

        if(convertView == null)
        {
            convertView = new TextView(context);
            pro = new Process();
            pro.name = (TextView)convertView;

            convertView.setTag(pro);
        }else
        {
            pro = (Process)convertView.getTag();
        }

        pro.name.setText(processes.get(position).processName);

        return convertView;
    }

    class Process
    {
        public TextView name;
    }
}

Display list of process on listview, display name only (just demo).

adp = new MyAdapter(processes, MainActivity.this);
lst.setAdapter(adp);

When user longclick on process name, this process will be kill

lst.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        if (load == 1) {
            for (ActivityManager.RunningAppProcessInfo info : processes) {
                if (info.processName.equalsIgnoreCase(
                        ((ActivityManager.RunningAppProcessInfo)parent.getItemAtPosition(position)).processName)) {
                    // kill selected process
                    android.os.Process.killProcess(info.pid);
                    android.os.Process.sendSignal(info.pid, android.os.Process.SIGNAL_KILL);
                    amg.killBackgroundProcesses(info.processName);
                }
            }
            load = 0;
            // refresh list of process
            skill_Load_Process();
        }
        return true;
    }
});

You only kill user process, with system process you need a rooted device.

Ok, download sourcecode Here

Mã hóa dữ liệu khi lưu trữ trong ứng dụng Java + SQL Server


Thông thường dữ liệu các nhân của người dùng khi lưu trữ vào csdl chúng ta nên che đi những dữ liệu nhạy cảm, trong ví dụ sau đây chúng ta cùng làm một demo nhỏ để che đi dữ liệu email và ngày sinh của người dùng (chỉ có ứng dụng của chúng ta mới giải mã được)

Tạo bảng để lưu được thông tin sau:
Order.    Name        Type
1.    Username    Text
2.    Password    Text
3.    Fullname    Text
4.    Address     Text
5.    Email       Text
6.    Birthdate   Date

Yêu cầu

Thiết kế form thêm thông tin người dùng vào bảng trên với các yêu cầu sau:
    1.    Mã hóa Password bằng giải thuật MD5
    2.    Mã hóa email và birthdate bằng giải thật mã hóa 02 chiều

Thiết kế form hiển thị ds người dùng thể hiện các cột: Username, Fullname và Address
Thiết kế form tìm người dùng dựa vào Username, kết quả hiển thị chi tiết người dùng gồm thông tin
       Username
    •    Fullname
    •    Address
    •    Email và Birthdate đã được giải mã

Giao diên thêm và tìm thông tin

image Dữ liệu đã mã hóa

image Dữ liệu được giải mã (nhấn nút find)

image

Bước 1: Tạo CSDL tên data và bảng nguoidung

1 SET ANSI_NULLS ON 2 GO 3 4 SET QUOTED_IDENTIFIER ON 5 GO 6 7 SET ANSI_PADDING ON 8 GO 9 10 CREATE TABLE [dbo].[users]( 11 [username] [varchar](50) NULL, 12 [password] [varchar](100) NULL, 13 [fullname] [varchar](100) NULL, 14 [address] [varchar](250) NULL, 15 [email] [varbinary](max) NULL, 16 [birthdate] [varbinary](max) NULL 17 ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 18 19 GO 20 21 SET ANSI_PADDING OFF 22 GO

Bước 2: Tạo cập khóa cho ứng dụng và lưu trữ lại để sử dụng (file)

1 class KeyGen { 2 public static void main(String[] args) { 3 try { 4 if (!new File("src/lib/pri.key").exists()) { 5 KeyPairGenerator key = KeyPairGenerator.getInstance("RSA"); 6 key.initialize(512); 7 KeyPair keys = key.genKeyPair(); 8 // Tạo cặp khóa 9 PrivateKey privateKey = keys.getPrivate(); 10 PublicKey publicKey = keys.getPublic(); 11 // Lưu thông tin khóa để tái sử dụng, khóa công khai để giải mã 12 X509EncodedKeySpec x509EncodedKeySpec = 13 new X509EncodedKeySpec(publicKey.getEncoded()); 14 FileOutputStream fos = new FileOutputStream("src/lib/pub.key"); 15 fos.write(x509EncodedKeySpec.getEncoded()); 16 fos.close(); 17 // khóa mật để mã hóa 18 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = 19 new PKCS8EncodedKeySpec(privateKey.getEncoded()); 20 fos = new FileOutputStream("src/lib/pri.key"); 21 fos.write(pkcs8EncodedKeySpec.getEncoded()); 22 fos.close(); 23 } else { 24 System.out.println("Khoa da co"); 25 } 26 } catch (IOException ex) { 27 Logger.getLogger(KeyGen.class.getName()).log(Level.SEVERE, null, ex); 28 } catch (NoSuchAlgorithmException ex) { 29 Logger.getLogger(KeyGen.class.getName()).log(Level.SEVERE, null, ex); 30 } 31 } 32 }

Tới đây chúng ta đã có được cặp khóa để có thể mã hóa và giải mã những dữ liệu cần thiết.

Bước 3: Xây dựng lớp Encode để phục hồi khóa từ tập tin và tạo phương thức mã hóa, giải mã.

1 public class Encode { 2 private PrivateKey priKey; 3 private PublicKey pubKey; 4 public Encode() { 5 getKeys(); 6 } 7 private void getKeys() { 8 try { 9 File pubKeyFile = new File("src/lib/pub.key"); 10 File privKeyFile = new File("src/lib/pri.key");; 11 // đọc dữ liệu từ file và khởi tọa lại khóa công khai 12 DataInputStream dis = new DataInputStream(new FileInputStream(pubKeyFile)); 13 byte[] pubKeyBytes = new byte[(int) pubKeyFile.length()]; 14 dis.readFully(pubKeyBytes); 15 dis.close(); 16 17 // đọc dữ liệu từ file và khởi tọa lại khóa mật 18 dis = new DataInputStream(new FileInputStream(privKeyFile)); 19 byte[] privKeyBytes = new byte[(int) privKeyFile.length()]; 20 dis.read(privKeyBytes); 21 dis.close(); 22 // 23 KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 24 // Tạo khóa công khai 25 X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(pubKeyBytes); 26 pubKey = (RSAPublicKey) keyFactory.generatePublic(pubSpec); 27 // tạo khóa mật 28 PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(privKeyBytes); 29 priKey = (RSAPrivateKey) keyFactory.generatePrivate(privSpec); 30 } catch (Exception ex) { 31 System.out.println("ERR: " + ex.toString()); 32 } 33 } 34 // hàm mã hóa 35 public byte[] TwowayEncrypt(byte[] data) { 36 try { 37 Cipher c = Cipher.getInstance("RSA"); 38 c.init(Cipher.ENCRYPT_MODE, priKey); 39 byte[] rs = c.doFinal(data); 40 return rs; 41 } catch (Exception ex) { 42 System.out.println("Err: " + ex.toString()); 43 } 44 return null; 45 } 46 // hàm giải mã 47 public byte[] TwowayDecrypt(byte[] data) { 48 try { 49 Cipher c = Cipher.getInstance("RSA"); 50 c.init(Cipher.DECRYPT_MODE, pubKey); 51 byte[] rs = c.doFinal(data); 52 return rs; 53 } catch (Exception ex) { 54 System.out.println("Err: " + ex.toString()); 55 } 56 return null; 57 } 58 // dùng cho mã hóa mật khẩu 59 public byte[] OnewayEncrypt(byte[] data){ 60 try { 61 MessageDigest dig = MessageDigest.getInstance("MD5"); 62 return dig.digest(data); 63 } catch (Exception ex) { 64 System.out.println("ERR: "+ ex.toString()); 65 } 66 return null; 67 } 68 }

Bước 4: Tích hợp lên giao diện

Xử lý sự kiện Click nút Add new

1 private void btnAddActionPerformed(java.awt.event.ActionEvent evt) { 2 try { 3 Connection conn = DriverManager.getConnection("jdbc:sqlserver://ntdan;databasename=data;", "sa", "sa"); 4 PreparedStatement comm = conn.prepareStatement("Insert into users values(?,?,?,?,?,?)"); 5 comm.setString(1, txtUser.getText()); 6 7 byte[] ba1 = Charset.forName("UTF-8").encode(CharBuffer.wrap(txtPass.getPassword())).array(); 8 9 comm.setString(2, new String(encode.OnewayEncrypt(ba1), "UTF-8")); 10 comm.setString(3, txtFull.getText()); 11 comm.setString(4, txtAdd.getText()); 12 13 comm.setBytes(5,encode.TwowayEncrypt(txtEmail.getText().getBytes("UTF-8"))); 14 comm.setBytes(6, encode.TwowayEncrypt(txtBirth.getText().getBytes("UTF-8"))); 15 16 comm.executeUpdate(); 17 } catch (Exception ex) { 18 System.out.println("ERR: " + ex.toString()); 19 } 20 }

Xử lý sự kiện Click nút Find

1 private void btnFindActionPerformed(java.awt.event.ActionEvent evt) { 2 try { 3 Connection conn = DriverManager.getConnection("jdbc:sqlserver://ntdan;databasename=data;", "sa", "sa"); 4 PreparedStatement comm = conn.prepareStatement("Select * from Users where username=?"); 5 comm.setString(1, txtUser.getText()); 6 ResultSet rs = comm.executeQuery(); 7 String found=""; 8 if(rs.next()) 9 { 10 found = "User: "; 11 found += rs.getString(1); 12 found += "\nFullname: "+rs.getString(3); 13 found += "\nAddress: "+rs.getString(4); 14 found += "\nEmail: "+ new String(encode.TwowayDecrypt(rs.getBytes(5)),"UTF-8"); 15 found += "\nBirthDate: "+ new String(encode.TwowayDecrypt(rs.getBytes(6)),"UTF-8"); 16 } 17 18 JOptionPane.showMessageDialog(this, found); 19 } catch (Exception ex) { 20 System.out.println("Err: "+ ex.toString()); 21 } 22 }

OK, như vậy là cơ bản chúng ta đã một phần nào đó che đi dữ liệu email và ngày sinh khi lưu vào SQL Server.

 

Đây là một ví dụ nhỏ hi vọng sẽ giúp chúng ta có cái nhìn rất cơ bản về việc bảo vệ dữ liệu riêng tư cho ứng dụng.

Sử dụng thư viện PhpMailer để gởi thư


 

Sử dụng thư việc PhpMailer để gởi thư. Chúng ta sử dụng tài khoản gmail để gởi thư.

Thư viện phpmailer download từ website sourceforge.net

1 $mail = new PHPMailer(true); 2 $mail->IsSMTP(); 3 try { 4 $mail->CharSet = "UTF-8"; 5 $mail->Host = "salomon.com"; 6 $mail->SMTPDebug = 1; 7 $mail->SMTPAuth = true; 8 $mail->SMTPSecure = "ssl"; 9 $mail->Host = "smtp.gmail.com"; 10 $mail->Port = 587; 11 $mail->Username = "ngotuongdan04"; 12 $mail->Password = "ngotuongdan"; 13 $mail->AddReplyTo('ntdan@ctu.edu.vn', 'Web master'); 14 $mail->AddAddress($email, "Web master"); 15 $mail->SetFrom('ntdan@ctu.edu.vn', 'Web master'); 16 $mail->AddReplyTo('ntdan@ctu.edu.vn', 'Web master'); 17 $mail->Subject = 'M?t kh?u m?i'; 18 $mail->AltBody = 'S? d?ng tr?nh duy?t tương ?ng!'; 19 $mail->Body = $newpass; 20 $mail->Send(); 21 } catch (phpmailerException $e) { 22 echo $e->errorMessage(); 23 } catch (Exception $e) { 24 echo $e->getMessage(); 25 } 26

Lưu ý thay thế tài khoản và mật khẩu mail của bạn

PHP to JSON – Chuyển dữ liệu sang JSON trong PHP


JSON đang dần thay thế XML trong việc làm định dữ liệu trung gian giữa các hệ thống khác nhau. Đối với PHP phiên bản lớn hơn 5.4.0 cũng đã hỗ trợ thư viện chuyển đối sang JSON và ngược lại.

JsonSerializable::jsonSerialize là thư việc chuyển từ PHP sang JSON với sự hỗ trợ của hàm json_encode

Ví dụ với dữ liệu chuỗi đơn giản

1 <?php 2 // tạo lớp chuyển đối 3 class StringValue implements JsonSerializable { 4 public function __construct($string) { 5 $this->string = (string) $string; 6 } 7 8 public function jsonSerialize() { 9 return $this->string; 10 } 11 } 12 // in ra với client có thể lấy dữ liệu này về 13 echo json_encode(new StringValue('Hello!'), JSON_PRETTY_PRINT); 14 ?>

Ví dụ với số nguyên

1 <?php 2 class IntegerValue implements JsonSerializable { 3 public function __construct($number) { 4 $this->number = (integer) $number; 5 } 6 public function jsonSerialize() { 7 return $this->number; 8 } 9 } 10 echo json_encode(new IntegerValue(1), JSON_PRETTY_PRINT); 11 ?>

Kết quả

1

Với định dạng mảng

1 <?php 2 class ArrayValue implements JsonSerializable { 3 public function __construct(array $array) { 4 $this->array = $array; 5 } 6 7 public function jsonSerialize() { 8 return $this->array; 9 } 10 } 11 $array = [1, 2, 3]; 12 echo json_encode(new ArrayValue($array), JSON_PRETTY_PRINT); 13 ?>

Kết quả

1 [ 2 1, 3 2, 4 3 5 ]

Tương tự như vậy cho mảng chuỗi

1 <?php 2 class ArrayValue implements JsonSerializable { 3 public function __construct(array $array) { 4 $this->array = $array; 5 } 6 7 public function jsonSerialize() { 8 return $this->array; 9 } 10 } 11 12 $array = ['foo' => 'bar', 'quux' => 'baz']; 13 echo json_encode(new ArrayValue($array), JSON_PRETTY_PRINT); 14 ?>

Và kết quả chúng ta có là

1 { 2 "foo": "bar", 3 "quux": "baz" 4 }

Ví dụ chúng ta lấy dữ liệu từ MySQL và chuyển sang JSON

http://www.w3resource.com/JSON/JSON-example.php

Ví dụ chúng ta có bảng

sanpham(id,ten,gia)

id ten gia
1 Nokia 525 3000000
2 Apple Macbook Pro 20000000
1 $sql="select * from sanpham"; 2 $result=mysql_query($sql); 3 $json=array(); 4 while($row=mysql_fetch_array($result)) 5 { 6 $sanpham=array(); 7 $sanpham["id"]=$row["id"]; 8 $sanpham["ten"]=$row["ten"]; 9 $sanpham["gia"]=$row["gia"]; 10 11 array_push($json["sanpham"],$sanpham); 12 } 13 echo json_encode($json);

Và kết quả là

1 "sanpham": 2 [ 3 { 4 "id":"1", 5 "ten":"Nokia 525", 6 "gia":"3000000", 7 }, 8 { 9 "id":"2", 10 "ten":"Apple Macbook Pro", 11 "gia":"20000000" 12 } 13 ]

Cũng hay đó chứ !

Kết hợp với bài này sẽ giúp xử lý JSON trên Android nhẹ nhàng hơn

Kiểm tra trạng thái mạng Android (network state checking)


Trong lập trình giao tiếp mạng trên Android thì việc kiểm tra sự sẵn sàng của khả năng kết nối mạng (Wifi, 3g), GPS là cần thiết.

Screenshot_2014-05-12-10-31-47 Screenshot_2014-05-12-10-31-56 Screenshot_2014-05-12-10-32-05 Screenshot_2014-05-12-10-32-12

Việc kiểm tra này cũng rất nhẹ nhàng bởi Android cung cấp cho chúng ta nhiều thư viện để kiểm tra các loại kết nối và cấu hình kết nối.

Tuy nhiên, ứng dụng cần phải có quyền kiểm tra trạng thái kết nối và sử dụng kết nối.

1 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 2 <uses-permission android:name="android.permission.INTERNET" /> 3 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Đối tượng ConnectivityManager và NetworkInfo là đối tượng chính giúp chúng ta kiểm tra trạng thái mạng

1 ConnectivityManager conManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); 2 NetworkInfo _wifi = conManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 3 NetworkInfo _3g = conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

Sau đó chúng ta có thể gọi hộp thoại bật wifi hay 3g để mở mạng nếu chưa có

1 if(!_wifi.isAvailable()&&!_3g.isAvailable()) 2 { 3 showNetworkSettingsAlert(); 4 }

Nội dung hàm hiển thị hộp thoại như sau

1 public void showNetworkSettingsAlert() { 2 AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); 3 alertDialog.setTitle("C?u hình m?ng"); 4 alertDialog.setMessage("Chua b?t k?t n?i m?ng.\nDi chuy?n d?n giao di?n c?u hình?"); 5 alertDialog.setPositiveButton("C?u hình", 6 new DialogInterface.OnClickListener() { 7 public void onClick(DialogInterface dialog, int which) { 8 Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); 9 MainActivity.this.startActivity(intent); 10 } 11 }); 12 alertDialog.setNegativeButton("B? qua", 13 new DialogInterface.OnClickListener() { 14 public void onClick(DialogInterface dialog, int which) { 15 dialog.cancel(); 16 } 17 }); 18 alertDialog.show(); 19 }

Thử xem sao nhe ! good luck

Giả lập Android với Genymotion


Trong quá trình phát triển ứng ụng trên Android chúng ta thương sử dụng máoy ảo (giả lập) hệ điều hành Android để kiểm thử ứng dụng hay có thể chạy trên máy thật.

Tuy nhiên đối với bộ giả lập tích hợp trong ADT hay ADT plugin trên eclipse rất nặng nề và chậm chạm còn đối với thiết bị thật thì rất khó đế có thể có nhiều thiết bị để test với các kích thước khác nhau của màn hình.

Genymotion là một giải pháp tốt: nhanh và nhẹ giúp việc phát triển và kiểm thử ứng dụng trở nên nhẹ nhành hơn.

Tổng quan genymotion (Video)

  1. Đăng ký/ đăng nhập vào genymotion
  2. Download file cài đặt cho window 64 bits (with VirtualBox) v2.2.0
  3. Cài đặt (VirtualBox và genymotion)
  4. Tạo máy ảo Android

image Nhấn Add để tạo (cần đăng nhập tài khoản tạo ở bước 1)

image Chọn phiên bản phù hợp và nhấn Next

image

Đặt tên và nhấn Next

 image

Đợi download xong sex thấy máy ở trong danh sách như hình 1. Khởi động máy ảo bằng cách chọn 1 máy ảo rồi nhấn Play

image Đợi một tí máy ảo sẽ khởi động xong (nhanh hơn máy ảo tích hợp trong ATD nhiều)

imageVà đây là kết quả. Tuy nhiên, để có được google play services thì cần phải làm một số bước nữa

  1. Download thư viện
  2. Kéo thả file download vào máy ảo ( cứ nhấn OK cho đến khi xong)

image 

image

 image Reboot lại máy ảo để cập nhật.

Đăng nhập với tài khoản google và test các dịch vụ của goole trên máy ảo genymotion

image Nhấn Yes nếu đã có tài khoản, không thì đăng ký nhé

image Nhấn OK và nhấn chấp nhận các điều khoản cho đến khi hoàn thành

imageGiờ thì đã thấy Play Store rồi đó :).

image  Và đây là cài đặt từ play store

imageChạy YouTube trên máy ảo genymotion.

Tới đây thì các bạn có thể tự tạo các máy ảo với các phiên bản Android khác nhau để kiểm thử ứng dụng của mình.

 

GOOD LUCK.