Hướng dẫn add texdrawble vào thư viện android chi tiết

Tải các thư viện tại đây: http://www.achartengine.org/content/download.html (https://code.google.com/p/achartengine/downloads/list)

Tui sẽ đan xen cách vẽ biểu đồ từ dữ liệu Sqlite, excel, webservice thay vì hardcode giống như bản demo.

Bạn xem qua một số ứng dụng cụ thể về các loại biểu đồ và Framework AchartEngine cung cấp như sau:

-Line chart:

Hướng dẫn add texdrawble vào thư viện android chi tiết

-Average temperature:

Hướng dẫn add texdrawble vào thư viện android chi tiết

Hướng dẫn add texdrawble vào thư viện android chi tiết

-Monthly Sale Report:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Hướng dẫn add texdrawble vào thư viện android chi tiết

-Trigonometric functions:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Hướng dẫn add texdrawble vào thư viện android chi tiết

-Scatter Chart:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Hướng dẫn add texdrawble vào thư viện android chi tiết

– Monthly Sale Report (conts):

Hướng dẫn add texdrawble vào thư viện android chi tiết
Hướng dẫn add texdrawble vào thư viện android chi tiết

-Project Work Status:

Hướng dẫn add texdrawble vào thư viện android chi tiết

Hướng dẫn add texdrawble vào thư viện android chi tiết
-Sale Growth:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Hướng dẫn add texdrawble vào thư viện android chi tiết

-budget:

Hướng dẫn add texdrawble vào thư viện android chi tiết

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Các bạn hãy thử làm quen với cách sử dụng thư viện AchartEngine với dữ liệu hardcode trước, Tui sẽ tranh thủ bổ sung cách hiển thị Chart từ Sqlite, Excel và Webservice.

– (còn nữa…)

Bài 65: Xây dựng phần mềm Camera Uploader trong Android Studio

Ngày nay với sự ra đời của nhiều mạng xã hội (Facebook, Google +, Linkedin, Twitter…) nơi mà mỗi con người chúng ta có thể dễ dàng chém gió xả stress cũng như bắt người khác ăn stress. Tui nghĩ rằng mạng xã hội đã và đang đi sâu vào quần chúng, đi sâu vào mọi ngõ ngách hẻm hóc trong mỗi người sử dụng công nghệ. Ngoài chém thuần túy thông qua những trận phun châu nhả ngọc chúng ta còn có thể chém gió thông qua những tấm hình… để giải stress hoặc ăn thêm stress.

Việc chia sẻ hình ảnh trên Facebook giúp mọi người sử dụng trong mạng có kết nối có thể nhận được sự chia sẻ và hưởng thụ cảm giác hạnh phúc từ những tấm hình không hề vô tri vô giác. Tuy nhiên không phải tấm hình nào chúng ta cũng có thể chia sẻ lên mạng xã hội để tránh gây phiền toái cũng như bảo mật thông tin. Hiện nay các dòng máy Sờ Mác Phôn của Hồ Cẩm Đào ngày càng thịnh hành với giá rẻ đến ngạc nhiên nên hầu như ai cũng có thể sở hữu nó, và đặc biệt đi đến đâu cũng có WIFI miễn phí, quán nước mía 5k/1 ly cũng có WIFI miễn phí và kể cả quán cơm chay cũng có WIFI miễn phí (rất may WIFI chưa được đưa vào là món ăn mặn). Việc sở hữu 1 chiếc điện thoại hoành tráng cùng với internet miễn phí nên chúng ta có thể tự sướng và chỉ cần 1 cú nhấn “tách” là hình này có thể lên “Phây” ngay và “nuôn”. Nhưng có những công ty họ cần viết các phần mềm trên Smartphone để nhận hình ảnh từ nhân viên gửi về máy chủ, họ không muốn chia sẻ những hình ảnh bí mật này, họ muốn xây dựng một server riêng mỗi lần nhân viên chụp hình thì có thể tự động gửi hình này lên Server để tiến hành phân tích. Ví dụ như Tui có một người bạn làm trong ngành định giá bất động sản, phải đến tận nơi khảo sát chụp ảnh mọi vùng liên quan để có chứng cứ định giá chính xác hơn, nhân viên khi đi khảo sát ở xa chỉ cần chụp hình và thông qua 3G sẽ gửi những hình ảnh trực tiếp này lên server và ở công ty nhóm phân tích sẽ dựa vào những hình ảnh này để hỗ trợ đắc lực cho việc ra quyết định định giá.

-Vì vậy Trong bài tập này Tui muốn hướng dẫn các bạn xây dựng phần mềm Camera Uploader, hi vọng nếu như một ngày nào đó có bạn sinh viên nào cần phải viết phần mềm tương tự có thể đáp ứng được.

– Phần mềm này gồm các chức năng sau (ở đây Tui không làm giao diện đẹp, Tui xử lý coding):

  1. Xây dựng Server riêng để lưu trữ hình ảnh gửi về từ client
  1. “Thiết kế” một website PHP hiển thị hình ảnh để demo (cho có cảm giác)
  1. Xây dựng chức năng Cho phép sử dụng Camera để chụp ảnh
  1. Đưa ảnh mới chụp lên Server riêng của công ty
  1. Cho phép lấy những hình ảnh khác được chụp trước đó trong điện thoại lên Server riêng.

Giao diện chính vô cùng đơn gian như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Chương trình chỉ có 3 control chính: ImageView để hiển thị hình ảnh chụp được hoặc hình ảnh có sẵn, ImageButton chụp ảnh, ImageButton upload lên Server, ngoài ra có Menu để cho phép lấy hình ảnh có sẵn trong điện thoại lên giao diện.

1)- Trước tiên ta cần xây dựng server riêng, ở đây Tui hướng dẫn các bạn sử dụng một server khác miễn phí tương tự như somee.com để các bạn có thêm trải nghiệm.

Các bạn vào trang http://freevnn.com/ đăng ký gói free hosting.

Sau khi đăng ký thành công hệ thống sẽ gửi email cho bạn thông tin chi tiết về đăng nhập Cpanel, FTP, phpAdmin…

Hướng dẫn add texdrawble vào thư viện android chi tiết
Sau khi đăng ký thành công, bạn sẽ nhân được 1 email tương tự như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn cần nghiên cứu CPANEL của hosting này vì Tui thấy nó rất hữu ích cho các bạn.

– Ta tiến hành viết 2 trang php để làm service tải hình từ client lên server riêng và dùng để trình diễn những hình ảnh đã tải lên server riêng. Nếu bạn nào chưa biết php cũng không sao (cứ coi như mình đã biết để đỡ tủi thân, sau đó tự học sau cho nó bằng bạn bằng bè).

– Bạn dùng Notepad ++ để tạo Trang index2.php cho lẹ, trang nay Tui dùng để nhận hình ảnh từ Client gửi về.

Coding ở trên mỗi lần lấy được bất cứ hình nào gửi về từ client thì nó sẽ lưu vào thư mục images trên server. Bạn để ý 2 từ khóa “ImageName” và “base64” nó được gửi về từ client là tên hình và binary hình định dạng chuỗi.

– Tiếp theo bạn “thiết kế” một trang index.php để trình diễn mọi hình ảnh gửi về từ client.

Hướng dẫn add texdrawble vào thư viện android chi tiết

Vào menu Net/ chọn FTP connect…

Hướng dẫn add texdrawble vào thư viện android chi tiết
Chọn New Connection :

Hướng dẫn add texdrawble vào thư viện android chi tiết
Nhập Hostname, user name, password… rồi nhấn nút OK. Sau đó ra màn hình nhấn nút Connect.

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn vào bên trong thư mục htdocs. Tạo 1 thư mục images, và chép 2 file index.php và index2.php vào htdocs như hình Tui chụp ở trên.

index2.php sẽ được gọi trong android client, còn index.php sẽ được truy suất trực tiếp trên website. Ví dụ khi bạn chụp và gửi 1 hình lên Server riêng thì bạn chỉ cần gọi tên miền đã đăng ký là chương trình sẽ tự động hiển thị toàn bộ hình lên website (không cần gõ index.php vì nó ngầm mặc định là trang chủ), ví dụ tui vào http://duythanhcse.freevnn.com/ sẽ có kết quả:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Như vậy là bạn đã cấu hình xong Server, bây giờ tiến hành coding cho Client.

– Ta xem cấu trúc của Project Android:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Tiến hành thiết kế giao diện cho activity_main.xml như sau:

-Nhớ bổ sung thêm 1 menu đọc hình ảnh từ điện thoại:

-Tiến hành viết UploadToServerTask là lớp đa tiến trình để tải hình từ client lên Server.

package com.tranduythanh.camerauploader; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.util.Log; 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 org.apache.http.util.EntityUtils; import java.util.ArrayList; /

  • Created by drthanh on 14/05/2015. */ public class UploadToServerTask extends AsyncTask { //URL để tải hình lên server private String URL = "http://duythanhcse.freevnn.com/index2.php"; private Activity context=null; private ProgressDialog progressDialog=null; private String ba1; public UploadToServerTask(Activity context, String ba1) { this.context=context; this.ba1=ba1; this.progressDialog=new ProgressDialog(this.context); } protected void onPreExecute() { super.onPreExecute(); this.progressDialog.setMessage("Vui lòng chờ hệ thống đang upload hình!"); this.progressDialog.show(); } @Override protected String doInBackground(Void... params) { //Coding gửi hình lên Server ArrayList nameValuePairs = new ArrayList(); nameValuePairs.add(new BasicNameValuePair("base64", ba1)); nameValuePairs.add(new BasicNameValuePair("ImageName", System.currentTimeMillis() + ".jpg")); try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(URL); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); String st = EntityUtils.toString(response.getEntity()); Log.v("log_tag", "In the try Loop" + st); } catch (Exception e) { Log.v("log_tag", "Lỗi kết nối : " + e.toString()); } return "Thành công"; } protected void onPostExecute(String result) { super.onPostExecute(result); this.progressDialog.hide(); this.progressDialog.dismiss(); } }

– Cuối cùng tiến hành coding cho MainActivity:

+ Trong lớp này cho phép chụp hình và chỉ lấy thumbnail để tối ưu bộ nhớ

+ Tương tự cho việc lấy hình ảnh có sẵn cũng lấy thumbnail

+ Đặc biệt tự động quay lại hình (rotate) nếu như hình bị quay không đúng hướng layout của phần mềm.

package com.tranduythanh.camerauploader; import android.graphics.Matrix; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import java.io.ByteArrayOutputStream; import android.content.Intent; import android.content.pm.PackageManager; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.provider.MediaStore; import android.util.Base64; import android.util.Log; import android.view.View; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends ActionBarActivity { ImageButton btnCapture, btnUpload; ImageView imageView; private Uri fileUri; String picturePath; Uri selectedUriImage; Bitmap selectedBitmap; String ba1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addControls(); addEvents(); } public void addControls() { btnCapture = (ImageButton) findViewById(R.id.btnCapture); btnUpload = (ImageButton) findViewById(R.id.btnUpload); imageView = (ImageView) findViewById(R.id.Imageprev); btnUpload.setEnabled(false); } public void addEvents() { btnCapture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { capturePicture(); } }); btnUpload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { uploadPictureToServer(); } }); } /

  • hàm xử lý lấy thumbnail để tối ưu bộ nhớ
  • @param pathHinh
  • @return / public Bitmap getThumbnail(String pathHinh) { BitmapFactory.Options bounds = new BitmapFactory.Options(); bounds.inJustDecodeBounds = true; BitmapFactory.decodeFile(pathHinh, bounds); if ((bounds.outWidth == -1) || (bounds.outHeight == -1)) return null; int originalSize = (bounds.outHeight > bounds.outWidth) ? bounds.outHeight : bounds.outWidth; BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inSampleSize = originalSize / 500; return BitmapFactory.decodeFile(pathHinh, opts); } /*
  • Hàm xử lys lấy encode hình để gửi lên Server / private void uploadPictureToServer() { Log.e("path", "----" + picturePath); ByteArrayOutputStream bao = new ByteArrayOutputStream(); selectedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bao); byte[] ba = bao.toByteArray(); ba1 =Base64.encodeToString(ba,Base64.DEFAULT); Log.e("base64", "-" + ba1); // Upload hình  lên server UploadToServerTask uploadToServer=new UploadToServerTask(MainActivity.this,ba1); uploadToServer.execute(); } private void capturePicture() { // Kiểm tra Camera trong thiết bị if (getApplicationContext().getPackageManager().hasSystemFeature( PackageManager.FEATURE_CAMERA)) { // Mở camera mặc định Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // Tiến hành gọi Capture Image intent startActivityForResult(intent, 100); } else { Toast.makeText(getApplication(), "Camera không được hỗ trợ", Toast.LENGTH_LONG).show(); } } /*
  • Lấy đường dẫn file hình theo uri hình
  • @param uriImage
  • @return / public String getPicturePath(Uri uriImage) { String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(uriImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String path = cursor.getString(columnIndex); cursor.close(); return path; } protected void onActivityResult(int requestCode, int resultCode, Intent data) { if ((requestCode == 100||requestCode==200) && resultCode == RESULT_OK) { //Lấy URI hình kết quả trả về selectedUriImage = data.getData(); //lấy đường dẫn hình picturePath=getPicturePath(selectedUriImage); //lấy thumbnail để tối ưu bộ nhớ selectedBitmap=getThumbnail(picturePath); selectedBitmap=rotateImageIfRequired(selectedBitmap,selectedUriImage); imageView.setImageBitmap(selectedBitmap); btnUpload.setEnabled(true); } } /*
  • Hàm hiển thị Camera folder và cho phép hiển thị hình người sử dụng chọn
  • lên giao diện, hình này sẽ được gửi lên Server nếu muốn / public void processChonHinh() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/"); startActivityForResult(intent, 200); } /
  • Quay lại hình nếu chưa đúng
  • @param img
  • @param selectedImage
  • @return / private  Bitmap rotateImageIfRequired(Bitmap img, Uri selectedImage) { // Detect rotation int rotation=getRotation(); if(rotation!=0){ Matrix matrix = new Matrix(); matrix.postRotate(rotation); Bitmap rotatedImg = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true); img.recycle(); return rotatedImg; }else{ return img; } } /*
  • Lấy Rotation của hình
  • @return */ private int getRotation() { String[] filePathColumn = {MediaStore.Images.Media.ORIENTATION}; Cursor cursor = getContentResolver().query(selectedUriImage, filePathColumn, null, null, null); cursor.moveToFirst(); int rotation =0; rotation = cursor.getInt(0); cursor.close(); return rotation; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } if(id==R.id.mnuImageList) { processChonHinh(); } return super.onOptionsItemSelected(item); } }

– Nhớ cấu hình AndroidManifest:

– Thực thi phần mềm, tiến hành chụp rồi gửi lên Server

– Hoặc vào menu lấy hình có sẵn trong máy gửi lên server:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Sau đó nhấn nút Upload để đưa lên Server:

Hướng dẫn add texdrawble vào thư viện android chi tiết
–> Chương trình sử dụng kỹ thuật đa tiến trình để tải hình lên server.

Ta có thể kiểm tra lại kết quả các hình chụp và hình lấy sẵn được truyền lên server:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Như vậy bạn đã hoàn thành xong phần mềm và có thể test chạy trực tiếp trên server riêng Tôi tạo, nhưng các bạn nhớ tự tạo riêng để test để học hỏi được nhiều hơn.

– và nhớ bổ sung thêm hàm kiểm tra xem điện thoại có đang kết nối internet hay không nhé, nếu chưa có internet thì phải tắt nút Upload hình đi, đoạn code kiểm tra internet có hay không đã được đề cập đến trong bài 64 dự báo thời tiết.

– Bạn có thể tải source code đầy đủ ở đây: http://www.mediafire.com/download/ts6agjkv3z30z8a/CameraUploader.rar

-Chúc các bạn thành công.

Bài 64: Xây dựng phần mềm dự báo thời tiết

Tui muốn tổng hợp các bài tập về Google Map, về Đa tiến trình, về JSon, Webservice…. để xây dựng phần mềm dự báo thời tiết đơn giản như hình dưới đây:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Phần mềm sẽ có 4 chức năng như mô tả ở trên, để làm được bài này thì các bạn cần phải có các kiến thức sau:

+ Kiến thức về lập trình đa tiến trình:

Bài tập 33: Sử dụng ContentProvider trong Android

Bài tập 34: đa tiến trình trong Android (Multi-Threading)

Bài 35 : Vẽ Button lúc Runtime, dùng Using Message của Handler class

Bài 36: Update ListView At runtime by Handler class using post

Bài 37: Xử lý đa tiến trình bằng AsyncTask

Bài 38: Lấy kết quả trả về sau khi thực hiện đa tiến trình bằng AsyncTask

Bài 39: Kết hợp AsyncTask và Handler class

+ Kiến thức về lập trình Google Map:

Bài 53: Google Maps Android API – phần 1

Bài 54: Google Maps Android API – phần 2

Bài 55: Google Maps Android API – phần 3

Bài 56: Google Maps Android API – phần 4

+Kiến thức về Webservice với định dạng JSON hoặc SOAP (XML):

Bài 43: Android vs .net Web Services

Bài 44: Cách tạo Webservice

Bài 45: Sử dụng .Net Webservice trong C#

Bài 46: Sử dụng .Net Webservice trong Android

Bài 51: Xử lý JSON trong Android

Bài 52: Tạo định dạng JSON trong C# asp.net service vs Android

+Kiến thức về chuyển đổi JSON qua Java class:

Bài 61: Cách đưa định dạng JSon về Java class bằng GSon

Bài 62: Cách đưa định dạng JSon về Java class bằng GSon (tiếp 1)

Bài 63: Cách đưa định dạng JSon về Java class bằng GSon (tiếp 2)

Đồng thời nghiên cứu thêm API Open Weather Map(Hỗ trợ xem thời tiết hầu hết mọi nơi trên thế giới, được đánh giá là một trong những API cũng cấp webservice về dự báo thời tiết tốt nhất hiện nay)

Cập nhật ngày 13/12/2015

Để sử dụng được API này bạn cần đăng nhập để lấy appid, chi tiết đọc tại : http://openweathermap.org/appid

Khi đăng ký và đăng nhập thành công, bạn sẽ có API key bên dưới:

Hướng dẫn add texdrawble vào thư viện android chi tiết

http://api.openweathermap.org/data/2.5/forecast/daily?lat=10.778182&lon=106.665504&cnt=1&appid=be8d3e323de722ff78208a7dbb2dcd6f

Ví dụ 0: Xem thời tiết ở Thành Phố Hồ Chí Minh:

http://api.openweathermap.org/data/2.5/weather?q=hồ chí minh&appid=be8d3e323de722ff78208a7dbb2dcd6f

Ví dụ 1: Xem thời tiết ở Đà Lạt

http://api.openweathermap.org/data/2.5/forecast/daily?q=đà lạt&appid=be8d3e323de722ff78208a7dbb2dcd6f

Ví dụ 2: Xem thời tiết ở Đà Lạt sau 15 ngày nữa thì như thế nào:

http://api.openweathermap.org/data/2.5/forecast/daily?q=đà lạt&cnt=15&appid=be8d3e323de722ff78208a7dbb2dcd6f

Ví dụ 3: Xem thời tiết ở 1 Kinh độ và Vĩ độ bất kỳ (ứng dụng hiển thị trên Google Map)

http://api.openweathermap.org/data/2.5/forecast/daily?lat=35&lon=139&cnt=10&mode=json&appid=be8d3e323de722ff78208a7dbb2dcd6f

Chi tiết hướng dẫn sử dụng: http://openweathermap.org/api

Các bạn tranh thủ ôn lại các bài trên sau đó Tui sẽ trình bày chi tiết từng bước cách thực hiện dự án này.

Trước khi bắt tay vào lập trình bài này thì ta xem sơ qua cấu trúc JSON khi kiểm tra thời tiết của một địa điểm nào đó, ví dụ ở Thành Phố Hồ Chí Minh:

http://api.openweathermap.org/data/2.5/weather?q=hồ chí minh&appid=be8d3e323de722ff78208a7dbb2dcd6f

hay dùng kinh độ vĩ độ (để áp dụng cho chức năng đầu tiên là xem thời tiết tại địa điểm hiện tại, theo địa chỉ bất kỳ, hay xem trên Google Map):

http://api.openweathermap.org/data/2.5/weather?lat=10.778182&lon=106.665504&appid=be8d3e323de722ff78208a7dbb2dcd6f

Ta được kết quả tương tự như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết

Các source code bạn tự nối đuôi appid mà Tui đã chỉ ở trên là có thể chạy tốt.

End update 13/12/2015

—————————————–

Việc phân tích cấu trúc JSON để viết Java class các bạn đã được học kỹ ở các bài trước rồi, nên bài này Tui không nói nữa mà Tui chỉ show Mô hình Java class đã viết ra như sau (Bạn tự viết):

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Ta sẽ dùng GSon để chuyển JSON qua Java class, từ đó dễ dàng cho việc sử dụng lấy thông tin dự báo thời tiết.

– Còn dưới đây là cấu trúc JSON cho trường hợp dự báo các ngày khác (Daily):

Ví dụ:

http://api.openweathermap.org/data/2.5/forecast/daily?lat=10.778182&lon=106.665504&cnt=10

Hay:

http://api.openweathermap.org/data/2.5/forecast/daily?q=hồ chí minh&cnt=10

Thì ta có kết quả với cấu trúc JSON khá khác cho với trường hợp trên như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
–> Bạn tự phân tích cấu trúc ở trên để viết Java Class cho trường hợp Daily (chức năng số 3).

Trong Project này Tui sẽ thực hiện 3 chức năng (thời tiết địa điểm hiện tại của thiết bị, xem thời tiết theo địa điểm nhập bất kỳ và xem thời tiết trên Google Map), còn chức năng dự báo ngày kế tiếp các bạn tiếp tục thực hiện.

Tui có cấu trúc tập tin, class của dự án như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Tui chụp màn hình sử dụng phần mềm dự báo thời tiết như sau:

  1. Từ màn hình chính, nếu bấm vào “Thời tiết địa điểm hiện tại của thiết bị”:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Chương trình sẽ hiển thị thông báo chi tiết dự báo thời tiết như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ta thấy chi tiết của địa điểm hiện tại của thiết bị (vị trị hiện tại tương đối trong phạm vi thiết bị), ở trên ta thấy nhiệt độ, bầu trời bằng hình có nắng, có mây, có mưa…, tốc độ gió, áp suất…

  1. Từ màn hình chính, nếu bấm vào “Xem thời tiết theo địa điểm nhập bất kỳ”:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Chương trình sẽ hiển thị màn hình cho phép nhập địa chỉ bất kỳ, hoặc chọn các tỉnh thành có sẵn của Việt Nam (muốn bất kỳ địa điểm nào khác ở Việt Nam hay trên thế giới thì tự gõ địa chỉ vào), màn hình chọn địa điểm:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Nếu ta chọn hoặc nhập địa điểm bất kỳ, ví dụ như Hồ Chí Minh, ta có kết quả sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở hình trên ta thấy đấy, Hồ Chí Minh tuy có mưa nhưng nhiệt độ vẫn nóng là 34.2 độ C. Đúng là tại thời điểm Tui post hình này lên là Sài gòn đang mưa và vẫn nóng le lưỡi.

  1. Tại màn hình chính, chọn “Xem thời tiết trên Google Map”, chương trình sẽ tự động hiển thị thời tiết tại vị trí hiện tại trên bản đồ, và cho phép bạn nhấn chọn bất kỳ địa điểm nào đó trên bản đồ để xem thời tiết. Đây là chức năng rất thú vị và coding hơi phức tạp.

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ta có kết quả:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Nhớ là bạn có thể nhấn chọn vị trí khác để xem thời tiết, ví dụ Tui chọn Nguyễn văn Trỗi:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Nếu làm tốt bài này bạn có thể áp dụng một cách uyển chuyển vào các dự án liên quan tới Du lịch, xem thời tiết….

Sau đây là Coding chi tiết cho từng phần, tui sẽ giải thích những đặc tính mới trong Android Studio, còn những cái này tương tự như Eclipse thì thôi (Tui chỉ trỏ link tới rồi các bạn đọc lại).

Ta cần xây dựng mô hình class cho Weather theo tọa độ và địa chỉ của kết quả Json 2 loại dưới đây:

http://api.openweathermap.org/data/2.5/weather?lat=10.778182&lon=106.665504

http://api.openweathermap.org/data/2.5/weather?q=Đà lạt

Như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Tui sẽ không phân tích hay giải thích tại sao phải viết các lớp như trên nữa, vì Tui đã hướng dẫn chi tiết ở các bài 61, bài 62, bài 63 các bạn bắt buộc phải đọc lại.

Soure code từng lớp như sau:

Lớp Clouds:

package com.tranduythanh.model; /

  • Created by drthanh on 04/04/2015. */ public class Clouds { private int all; public int getAll() { return all; } public void setAll(int all) { this.all = all; } }

Lớp Coord:

package com.tranduythanh.model; /

  • Created by drthanh on 04/04/2015. */ public class Coord { private  double lon; private double lat; public double getLon() { return lon; } public void setLon(double lon) { this.lon = lon; } public double getLat() { return lat; } public void setLat(double lat) { this.lat = lat; } }

Lớp Main:

package com.tranduythanh.model; public class Main { private double temp; private double temp_min; private double temp_max; private double pressure; private double sea_level; private double grnd_level; private double humidity; public double getTemp() { return temp; } public void setTemp(double temp) { this.temp = temp; } public double getTemp_min() { return temp_min; } public void setTemp_min(double temp_min) { this.temp_min = temp_min; } public double getTemp_max() { return temp_max; } public void setTemp_max(double temp_max) { this.temp_max = temp_max; } public double getPressure() { return pressure; } public void setPressure(double pressure) { this.pressure = pressure; } public double getHumidity() { return humidity; } public void setHumidity(double humidity) { this.humidity = humidity; } public double getSea_level() { return sea_level; } public void setSea_level(double sea_level) { this.sea_level = sea_level; } public double getGrnd_level() { return grnd_level; } public void setGrnd_level(double grnd_level) { this.grnd_level = grnd_level; } }

Lớp Sys:

Hướng dẫn add texdrawble vào thư viện android chi tiếtChi tiết từng lớp như sau:

Enum TypePrediction:

Hướng dẫn add texdrawble vào thư viện android chi tiết-Ở trên 3 Activity đều sử dụng 1 màn hình (vì cho dù tìm theo kiểu nào đi nữa thì thông tin thời tiết cũng đầy đủ thông số giống nhau).

– Ta đi vào từng màn hình, trước tiên là màn hình MainActivity:

Activity_main.xml:

Hướng dẫn add texdrawble vào thư viện android chi tiết

Hướng dẫn add texdrawble vào thư viện android chi tiếtnội dung XML của màn hình hiển thị chi tiết :

0

-Ta qua màn hình xem thời tiết tại một địa chỉ bất kỳ:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Như vậy chức năng này cũng sử dụng chung màn hình hiển thị chi tiết thời tiết, và ta cần cung cấp màn hình chọn tỉnh thành Việt Nam có sẵn hoặc trong ô nhập địa chỉ cho phép người sử dụng nhập bất kỳ địa điểm nào đó trên thế giới. Bấm nút Xem thời tiết hệ thống sẽ xuất hiện kết quả như hình số 3 ở trên (bạn thấy đó ở sài gòn bây giờ là 27.9 độ C quá là mát mẻ… vì Tui chụp hình này lúc 10h đêm, chứng tỏ phần mềm này nó thông minh, nó biết ban đêm thường là mát hơn ban ngày
Hướng dẫn add texdrawble vào thư viện android chi tiết
).

– Ta xem layout của màn hình chọn địa chỉ (activity_choose_address.xml):

1

Source xử lý cho màn hình này như sau (ChooseAddressActivity):

2

– sau khi bấm vào nút xem thời tiết, hệ thống sẽ mở màn hình (WeatherByAddressActivity), chú ý màn hình này như đã nói ở trên là sử dụng chung layout với chức năng xem thời tiết tại vị trí hiện tại của máy.

source code của lớp WeatherByAddressActivity như sau:

3

-Chức năng cuối cùng Tui muốn hướng dẫn là xem thời tiết tại vị trí bất kỳ trên bản đồ (lần đầu tiên mở lên thì hệ thống sẽ hiển thị thời tiết tại vị trí hiện tại của thiết bị lên bản đồ, sau đó người sử dụng muốn xem nơi khác thì chỉ cần nhấn vào vị trí trên bản đồ, chức năng này rất tiện lợi):

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Chức năng này ta cần xử lý coding hơi phức tạp chút xíu, cần phải xử lý custom InfoWindowAdapter cho việc hiển thị giao diện khác nên bản đồ cũng như xác định vị trí mà người sử dụng chọn bất kỳ trên bản đồ rồi di chuyển và hiển thị chi tiết thời tiết tại địa chỉ mới này.

– Bạn chú ý để hiển thị Map trong Android Studio thì nó đơn giản hơn rất nhiều so với Eclipse vì Android Studio đã hỗ trợ rất tốt chức năng này.

– Ta cần tạo Google Map Activity tên là WeatherMapsActivity như sau:

– Bấm chuột phải vào Package/ chọn New/ chọn Google/ chọn Google Maps Activity:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Sau đó màn hình tạo activity hiển thị lên, bạn đặt tên là WeatherMapsActivity hệ thống sẽ tạo ra layout tương thích để hiển thị Map (activity_weather_maps.xml):

4

Và lớp WeatherMapsActivity kế thừa từ FragmentActivity.

Đồng thời nó sẽ phát sinh ra thêm 1 file google_maps_api.xml để lưu trữ KEY sử dụng Map như đã hướng dẫn ở các bài trước (bạn cần tự tạo để lấy KEY dán vào đây):

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở trên bạn cần làm theo bước: Copy toàn bộ dữ liệu trong dòng mà tui đánh dấu là số 1, đưa nó vào link trong vùng Tui đánh dấu là số 2 (cách tạo key trong này đã hướng dẫn từ các bài trước về Map, bạn tự coi lại), sau khi nó tạo ra Key truy suất MAP, bạn dán Key đó vào vùng số 3. Ở vùng Số hệ thông có tự đặt tên là google_maps_key.

– Sau đó bạn mở AndroidManifest lên để quát sát nó có cái gì ở đây:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn thấy đấy, nó đơn giản hơn rất là nhiều, nó tự làm giùm cho chúng ta.

– Tiếp theo ta tiến hành coding để xử lý cho cho thời tiết trên map:

– Tạo lớp MyInfoWindowAdapter (sử dụng chung Layout xem thời tiết như đã đề cập ở trên) để hiển thị lên Map:

5

– Cuối cùng ta xử lý coding cho phép hiển thị thời tiết bất kỳ trên Bản đồ (WeatherMapsActivity):

6

– Sau cùng ta cần cấu hình AndroidManifest đầy đủ như sau:

7

– Như vậy Tui đã trình bày gần hoàn chỉnh phần mềm xem dự báo thời tiết (còn chức năng dự báo ngày kế tiếp bạn tự làm).

– Bạn cần đọc kỹ lại các bài về Map trước đó nếu như chưa rành, cố gắng đọc hiểu và làm lại bài này nhều lần.

– Các bạn có thể tải source code đầy đủ ở đây (nhớ phải đổi lại KEY mới hoạt động phần Map): http://www.mediafire.com/download/3fwxcr8ziudjt47/WeatherPrediction.rar

– Chúc các bạn thành công.

Bài 63: Cách đưa định dạng JSon về Java class bằng GSon (tiếp 2)

Ở bài 61 và bài 62 các bạn đã biết cách chuyển định dạng JSon qua Java class, trong bài này Tui sẽ hướng dẫn các bạn cách chuyển đổi phức tạp nhất và cũng là cuối cùng.

Tui sẽ viết phần mềm truy tìm thông tin trên Internet thông qua Google Search API (kết quả trả về của API này là một định dạng JSon phức tạp: Đối tượng chứa đối tượng, đối tượng chứa tập các đối tượng). Sau đó các bạn dựa vào project này để tiếp tục phát triển nó lên để sử dụng trong thực tế luôn.

Tui Demo giao diện sử dụng như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Hình bên trái dùng để hiển thị kết quả của Google Search API gửi về (gửi về thông qua JSON)

– Hình bên phải là lúc người sử dụng chọn bất kỳ kết quả nào thì nó mở website đó lên để đọc thông tin chi tiết.

Trước tiên bạn cần hiểu cách sử dụng công cụ Google Search API (Được xử lý bằng Ajax và trả về JSON):

————————————————————————-

Cú pháp:

http://ajax.googleapis.com/ajax/services/search/web?v=1.0 &q\={thông tin cần tìm}&start\={vị trí bắt đầu lọc}&rsz\={block lọc}

————————————————————————-

q: là thông tin bạn cần tìm kiếm trên mạng

start: là vị trí bắt đầu lọc

rsz: là block lọc (bạn chỉ chọn 2 loại block là 4 hoặc 8; tức là mỗi lần lấy về 4 hoặc 8 kết quả),

Như vậy nếu bạn muốn truy vấn thật nhiều thông tin thì bạn nên chọn Bội số của rsz rồi cho vòng lặp chạy theo bước start=start+rsz

Bạn thử đưa ra công thức vòng lặp với yêu cầu của Tui: Hãy trả về 24 dòng kết quả tìm kiếm thông tin “Hang Sơn Đoòng“? Vậy bạn phải viết vòng lặp như thế nào?

Sau đây ta xem ví dụ thứ 1:

http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=hang sơn đoòng:

Nếu chỉ có q bên trên thì kết quả mặc định là block 4 như kết quả dưới đây:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Sau đây ta xem ví dụ thứ 2:

http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=hang sơn đoòng&start=0&rsz=8

Nếu đủ 3 thông số q,start,rsz bên trên thì kết quả mặc định là rsz như kết quả dưới đây (tức là 8 dòng):

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Bạn thấy đấy, đây là một kết quả JSON khá phức tạp, nếu không nói là nhìn thấy bỏ của chạy lấy người luôn.

– Bây giờ Ta tiến hành phân tích một số thông tin quan trong trong cấu trúc JSON này nhé:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Bạn thấy Tui tô đen dữ liệu có nằm trong ngoặc vuông [], định dạng nằm trong [] chính là mảng hay danh sách.

– Tiếp theo Tui chọn 1 đối tượng (tức là được nằm trong cặp ngoặc nhọn thuộc [] này:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Tương tự như vậy bạn có thể quan sát các thông số khác để biết đâu là đối tượng, đâu là danh sách đối tượng.

– TUY NHIÊN trong bài này tui chỉ lấy 2 thông số chính từ kết quả trả về đó là titleNoFormatting và url.

Tới đây thì bạn phải biết cách tạo danh sách các class như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Bạn tạo một Project tên là “GoogleSearchTool“, có cấu trúc như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Giải thích sơ sơ:

+ Các lớp nằm trong model là lớp định dạng lấy thông tin từ JSon: GoogleData,ResponseData,Result

+ Lớp GoogleSearchAPI dùng để tải thông tin từ Google Search API

+ Lớp MyArrayAdapter để hiển thị custom control trên ListView.

+ MainActivity là Activity dùng cho người sử dụng tương tác phần mềm, ở trong này có một class GoogleSearchThread để tiến hành dùng kỹ thuật đa tiến trình để gọi GoogleSearchAPI thực thi.

+ Layout: Có custom_row_layout để hiển thị custom cho từng dòng trong ListView.

– Chú ý vì có kết nối internet nên bạn phải cấp quyền sử dụng trong AndroidManifest nhé.

– Ta bắt đầu tiến hành Coding như sau:

  1. thiết kế giao diện cho ứng dụng:
    Hướng dẫn add texdrawble vào thư viện android chi tiết
    – Bạn có thể nhìn vào Component Tree để thiết kế giao diện cho ứng dụng, tuy nhiên có thể copy XML Layout sau:

activity_main.xml:

8

– Tiếp theo thiết kê giao diện cho Custom row:

custom_row_layout.xml:

9

– Custom row đơn giản chi có 2 control, dòng 1 là tiêu đề kết quả, dòng 2 là link xem chi tiết.

  1. Cấu hình cấp quyền Internet cho ứng dụng trong AndroidManifest.xml:

0

  1. Tiến hành coding cho các lớp :

-GoogleSearchAPI:

1

Lớp Result:

2

Lớp ResponseData:

3

Trong lớp ResponseData nó sẽ có một danh sách các Result giống như trong định dạng JSon.

Lớp GoogleData:

4

– Như vậy ta đã đáp ứng được mô hình Java class để lấy thông tin từ định dạng JSOn.

– Coding lớp MyArrayAdapter:

Lớp này dùng để chỉnh sửa cách hiển thị dữ liệu lên ListView theo như mô tả ở trên,

Nếu bạn chưa hiểu về customlayout thì bắt buộc phải đọc các bài này trước:

https://duythanhcse.wordpress.com/2013/04/08/bai-tap-14-thuc-hanh-ve-custom-layout-cho-listview-trong-android/

https://duythanhcse.wordpress.com/2013/04/20/bai-tap-25-tiep-tuc-cung-co-kien-thuc-intent-vi-du-tong-hop-quan-ly-nhan-vien/

5

– Cuối cùng là lớp MainActivity:

6

– Như vậy bạn đã làm xong trường hợp định dạng JSon phức tạp, từ đây về sau có những dự án liên quan tới JSON thì bạn có thể làm theo cách này, chỉ cần đọc phân tích đúng thông tin trong JSON để từ đó tạo class Java phù hợp là OK.

-Chú ý là phải tham chiếu tới thư viện gson-2.2.4.jar nhé.

– Bài tập kế tiếp Tui sẽ viết một phần mềm dựa trên JSON để Dự Báo Thời Tiết (thời tiết thực tế ở một địa điểm bất kỳ nào đó trên thế giới).

-Bạn có thể coding của bài này ở đây: http://www.mediafire.com/download/bew37pegs3n0z85/GoogleSearchTool.rar

– Chúc các bạn thành công!

Bài 62: Cách đưa định dạng JSon về Java class bằng GSon (tiếp 1)

Ở bài tập 61 các bạn đã được học qua cách đưa định dạng JSon cơ bản qua Java class, trong bài này Tui sẽ hướng dẫn các bạn cách đưa 1 định dạng JSon phức tạp qua Java class, chẳng hạn như cấu trúc sau http://graph.facebook.com/taylorSwift :

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn quan sát ở trên thì tổng cộng có 3 cặp ngoặc nhọn.

Ngoặc nhọn ngoài cùng chính là lớp FaceBook mà ta đã tạo, 2 cặp nhọn bên trong là 2 thuộc tính có kiểu đối tượng của lớp FaceBook. Như vậy ta phải tạo thêm 2 class bên trong, thông thường ta sẽ tạo lớp với quy tắc là giống tên thuộc tính có kiểu đối tượng nhưng các Ký Tự đầu của mỗi từ viết Hoa. Ví dụ:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở trên là ta tạo 1 class tên Cover, nhớ là C viết hoa. Còn thuộc tính cover thì nằm trong class FaceBook có kiểu Cover.

Phân tích cấu trúc JSon của Taylor Swift, giả sử trong lớp FaceBook Tui chỉ quan tâm các thuộc tính sau:

– id (có kiểu chuỗi)

–username (có kiểu chuỗi)

–name (có kiểu chuỗi)

–gender(không có trong JSon của Taylor Swift)

–likes (có kiểu số)

–cover (có kiểu Cover)

+ Phân tích Cover giả sử Tui Tui chỉ quan tâm tới cover_id, source (là hình ảnh đại diện):

–cover_id

–source

ví dụ bạn copy toàn bộ giá trị của source sẽ có hình sau(ta sẽ coding để hiển thị lên Client android):

Hướng dẫn add texdrawble vào thư viện android chi tiết
–> Tương tự như vậy bạn có thể suy luận nếu như có sự chồng lắp (lồng ghép) các cặp ngoặc nhọn để biết cách tạo class.

*Bây giờ bạn mở Project của bài 61 lên rồi chỉnh sửa coding:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn tiến hành dùng công cụ để tạo get/set giống như đã hướng dẫn ở bài trước, ta được kết quả như sau:

7

– Kế đến chỉnh sửa class FaceBook giống như mô tả:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở trên Tui bổ sung thêm 2 thuộc tính là likes và cover (chú ý là phải copy thuộc tính từ Json nhé). Tiến hành tạo get/set:

8

– Ta có thể xem mô hình mối quan hệ giữa 2 lớp này như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Tiếp theo hiệu chỉnh Layout của ứng dụng để hiển thị thêm thông tin likes và cover.

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở trên Tui bổ sung thêm Số lượng like vào giao diện + ScrollView trong trường hợp màn hình nhỏ thì nó có thể trượt xuống để xem hết thông tin.

XML layout của màn hình được sửa lại như sau:

9

-Như vậy trong MainActivity ta sẽ bổ sung thêm đối tượng EditText like để hiển thị số lượng like:

EditText txtLike;

public void addControls() { //… txtLike= (EditText) findViewById(R.id.txtLike); }

protected void onProgressUpdate(FaceBook… values) { super.onProgressUpdate(values); //……. txtLike.setText(fb.getLikes()+””); }

-Đồng thời bổ sung thêm biến lưu trữ source để xem hình ảnh:

String source=””;

protected void onProgressUpdate(FaceBook… values) { super.onProgressUpdate(values); //……………….. txtLike.setText(fb.getLikes()+””); if(fb.getCover()!=null) source=fb.getCover().getSource(); }

– Để hiển thị hình ảnh ta cần có 1 Activity mới (dùng đa tiến trình để hiển thị hình ảnh), ta cần viết sự kiện cho nút Xem hình ảnh trong MainActivity (dùng Intent để truyền source qua màn hình xem hình ảnh).

Các bước làm như sau:

– Bước 1: Bấm chuột phải vào Package/ chọn New/ chọn Activity/ chọn Blank Activity:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Ở màn hình mới này ta đặt tên XemHinhActivity:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bấm Finish để xác nhận tạo Activity mới, ta sẽ thấy nó xuất hiện như dưới đây:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Kế đến ta vào AndroidManifest để coi thử activity XemHinhActivity có được tự động đưa vào đây hay chưa (nếu chưa đưa vào thì chạy lên sẽ báo lỗi, vì android yêu cầu bất kỳ Activity nào muốn thực thi thì phải được khai báo trong Manifest).:

Hướng dẫn add texdrawble vào thư viện android chi tiết
–Bước 2: Tiếp theo ta hiệu chỉnh Layout XemHinhActivity để hiển thị hình ảnh, XML layout đơn giản như sau:

package com.tranduythanh.camerauploader; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.util.Log; 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 org.apache.http.util.EntityUtils; import java.util.ArrayList; /

  • Created by drthanh on 14/05/2015. */ public class UploadToServerTask extends AsyncTask { //URL để tải hình lên server private String URL = "http://duythanhcse.freevnn.com/index2.php"; private Activity context=null; private ProgressDialog progressDialog=null; private String ba1; public UploadToServerTask(Activity context, String ba1) { this.context=context; this.ba1=ba1; this.progressDialog=new ProgressDialog(this.context); } protected void onPreExecute() { super.onPreExecute(); this.progressDialog.setMessage("Vui lòng chờ hệ thống đang upload hình!"); this.progressDialog.show(); } @Override protected String doInBackground(Void... params) { //Coding gửi hình lên Server ArrayList nameValuePairs = new ArrayList(); nameValuePairs.add(new BasicNameValuePair("base64", ba1)); nameValuePairs.add(new BasicNameValuePair("ImageName", System.currentTimeMillis() + ".jpg")); try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(URL); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); String st = EntityUtils.toString(response.getEntity()); Log.v("log_tag", "In the try Loop" + st); } catch (Exception e) { Log.v("log_tag", "Lỗi kết nối : " + e.toString()); } return "Thành công"; } protected void onPostExecute(String result) { super.onPostExecute(result); this.progressDialog.hide(); this.progressDialog.dismiss(); } }

0

-Bước 3: Tiến hành tạo một ImageLoadTask kế thừa từ AsyncTask để hiển thị hình ảnh lên giao diện bằng đa tiến trình:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Source code ImageLoadTask:

package com.tranduythanh.camerauploader; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.util.Log; 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 org.apache.http.util.EntityUtils; import java.util.ArrayList; /

  • Created by drthanh on 14/05/2015. */ public class UploadToServerTask extends AsyncTask { //URL để tải hình lên server private String URL = "http://duythanhcse.freevnn.com/index2.php"; private Activity context=null; private ProgressDialog progressDialog=null; private String ba1; public UploadToServerTask(Activity context, String ba1) { this.context=context; this.ba1=ba1; this.progressDialog=new ProgressDialog(this.context); } protected void onPreExecute() { super.onPreExecute(); this.progressDialog.setMessage("Vui lòng chờ hệ thống đang upload hình!"); this.progressDialog.show(); } @Override protected String doInBackground(Void... params) { //Coding gửi hình lên Server ArrayList nameValuePairs = new ArrayList(); nameValuePairs.add(new BasicNameValuePair("base64", ba1)); nameValuePairs.add(new BasicNameValuePair("ImageName", System.currentTimeMillis() + ".jpg")); try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(URL); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); String st = EntityUtils.toString(response.getEntity()); Log.v("log_tag", "In the try Loop" + st); } catch (Exception e) { Log.v("log_tag", "Lỗi kết nối : " + e.toString()); } return "Thành công"; } protected void onPostExecute(String result) { super.onPostExecute(result); this.progressDialog.hide(); this.progressDialog.dismiss(); } }

1

-Bước 4: Tiến hành coding cho XemHinhActivity:

package com.tranduythanh.camerauploader; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.util.Log; 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 org.apache.http.util.EntityUtils; import java.util.ArrayList; /

  • Created by drthanh on 14/05/2015. */ public class UploadToServerTask extends AsyncTask { //URL để tải hình lên server private String URL = "http://duythanhcse.freevnn.com/index2.php"; private Activity context=null; private ProgressDialog progressDialog=null; private String ba1; public UploadToServerTask(Activity context, String ba1) { this.context=context; this.ba1=ba1; this.progressDialog=new ProgressDialog(this.context); } protected void onPreExecute() { super.onPreExecute(); this.progressDialog.setMessage("Vui lòng chờ hệ thống đang upload hình!"); this.progressDialog.show(); } @Override protected String doInBackground(Void... params) { //Coding gửi hình lên Server ArrayList nameValuePairs = new ArrayList(); nameValuePairs.add(new BasicNameValuePair("base64", ba1)); nameValuePairs.add(new BasicNameValuePair("ImageName", System.currentTimeMillis() + ".jpg")); try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(URL); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); String st = EntityUtils.toString(response.getEntity()); Log.v("log_tag", "In the try Loop" + st); } catch (Exception e) { Log.v("log_tag", "Lỗi kết nối : " + e.toString()); } return "Thành công"; } protected void onPostExecute(String result) { super.onPostExecute(result); this.progressDialog.hide(); this.progressDialog.dismiss(); } }

2

– Bước 5: Hiệu chỉnh MainActivity để truyền source qua XemHinhActivity để hiển thị lên giao diện:

public void addEvents() { btnShowImage.setOnClickListener(new View.OnClickListener() {

@Override public void onClick(View v) { Intent in=new Intent (MainActivity.this, XemHinhActivity.class); in.putExtra(“URL_IMG”, source); startActivity(in); } }); }

Cuối cùng ta có coding của MainActivity như sau:

package com.tranduythanh.camerauploader; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.util.Log; 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 org.apache.http.util.EntityUtils; import java.util.ArrayList; /

  • Created by drthanh on 14/05/2015. */ public class UploadToServerTask extends AsyncTask { //URL để tải hình lên server private String URL = "http://duythanhcse.freevnn.com/index2.php"; private Activity context=null; private ProgressDialog progressDialog=null; private String ba1; public UploadToServerTask(Activity context, String ba1) { this.context=context; this.ba1=ba1; this.progressDialog=new ProgressDialog(this.context); } protected void onPreExecute() { super.onPreExecute(); this.progressDialog.setMessage("Vui lòng chờ hệ thống đang upload hình!"); this.progressDialog.show(); } @Override protected String doInBackground(Void... params) { //Coding gửi hình lên Server ArrayList nameValuePairs = new ArrayList(); nameValuePairs.add(new BasicNameValuePair("base64", ba1)); nameValuePairs.add(new BasicNameValuePair("ImageName", System.currentTimeMillis() + ".jpg")); try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(URL); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); String st = EntityUtils.toString(response.getEntity()); Log.v("log_tag", "In the try Loop" + st); } catch (Exception e) { Log.v("log_tag", "Lỗi kết nối : " + e.toString()); } return "Thành công"; } protected void onPostExecute(String result) { super.onPostExecute(result); this.progressDialog.hide(); this.progressDialog.dismiss(); } }

3

– Bây giờ tiến hành thực thi ứng dụng ta được kết quả như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
-Ở hình trên ta thấy khi bấm vào nút Xem Hình ta sẽ có kết quả là hình Taylor Swift được hiển thị lên ở màn hình mới.

– Nếu bạn muốn hình ảnh nằm trên màn hình Nằm ngang:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Thì tiến hành hiệu chỉnh trong AndroidManifest:

package com.tranduythanh.camerauploader; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.util.Log; 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 org.apache.http.util.EntityUtils; import java.util.ArrayList; /

  • Created by drthanh on 14/05/2015. */ public class UploadToServerTask extends AsyncTask { //URL để tải hình lên server private String URL = "http://duythanhcse.freevnn.com/index2.php"; private Activity context=null; private ProgressDialog progressDialog=null; private String ba1; public UploadToServerTask(Activity context, String ba1) { this.context=context; this.ba1=ba1; this.progressDialog=new ProgressDialog(this.context); } protected void onPreExecute() { super.onPreExecute(); this.progressDialog.setMessage("Vui lòng chờ hệ thống đang upload hình!"); this.progressDialog.show(); } @Override protected String doInBackground(Void... params) { //Coding gửi hình lên Server ArrayList nameValuePairs = new ArrayList(); nameValuePairs.add(new BasicNameValuePair("base64", ba1)); nameValuePairs.add(new BasicNameValuePair("ImageName", System.currentTimeMillis() + ".jpg")); try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(URL); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); String st = EntityUtils.toString(response.getEntity()); Log.v("log_tag", "In the try Loop" + st); } catch (Exception e) { Log.v("log_tag", "Lỗi kết nối : " + e.toString()); } return "Thành công"; } protected void onPostExecute(String result) { super.onPostExecute(result); this.progressDialog.hide(); this.progressDialog.dismiss(); } }

4

-Chú ý là trong Android Studio nếu bạn lỡ tay đặt sai tên Class mà bạn muốn đặt lại thì chọn File đó rồi nhấn Shift+F6 để hiệu chỉnh nhé(trong eclipse cũ là F2).

– Như vậy bạn đã biết cách chuyển định dạng JSon phức tạp (đối tượng chứa đối tượng) thành Java class, đồng thời ôn lại được đa tiến trình cũng như Intent.

-Chú ý là phải tham chiếu tới thư viện gson-2.2.4.jar nhé.

– Bài kế tiếp Tui sẽ hướng dẫn các bạn cách chuyển JSon phức tạp hơn qua Java class (Đối tượng chứa đối tượng và danh sách đối tượng khác- mảng)

-Bạn có thể tải coding đầy đủ của bài này ở đây: http://www.mediafire.com/download/sijdct656vavk8u/FaceBookTool_version2.rar

– Chúc các bạn thành công!

Bài 61: Cách đưa định dạng JSon về Java class bằng GSon

Ở bài 51 Tui đã trình bày cách xử lý JSon trong Android, nhưng nó là cách tiếp cận cũ và cũng được viết bằng Eclipse cũ. Trong bài này Tui muốn trình bày cho các bạn một cách tiếp cận mới đó là đưa định dạng JSon về Java class để dễ xử lý cũng như tăng tốc quá trình truy suất và sửa lỗi. Các bài mới Tui sẽ lồng ghép từng bước cách xử dụng luôn công cụ Android Studio để các bạn tiện thể sử dụng (nói theo ngôn ngữ của bác Hoàng Phi Hồng là Nhất tiễn hạ song điêu).

Tui sẽ dùng Facebook Graph của anh Nguyễn Hoàng Phong (http://graph.facebook.com/nguyen.hoangphong.50) để phân tích cấu trúc của JSon, sau đó ta sẽ viết class để chuyển đổi.

Bài này Tui sẽ đưa ra một vài ví dụ từ dễ lên khó đủ để bao quát hết cách xử lý các trường hợp trong định dạng JSon qua Java class. Trước tiên ta phân tích http://graph.facebook.com/nguyen.hoangphong.50 xem bên trong nó có cái gì?

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở trên ta thấy dữ liệu được để trong cặp ngoặc nhọn {}, Bên trong nó có 8 dòng ngăn cách bởi dấu phẩy, và mỗi dòng lại được ngăn cách bởi dấu hai chấm :

Đó chính là định dạng JSon được đề cập trong bài 51 (Nhớ đọc lại lý thuyết về JSon trong bài 51 này).

Ta để ý rằng tại mỗi dòng thì vế trái của dấu 2 chấm chính là thuộc tính của đối tượng, vế phải chính là giá trị của thuộc tính, giá trị vế phải nó quyết định tới kiểu dữ liệu của thuộc tính. Ví dụ:

“id“:”100003307875109” thì:

id là thuộc tính và 100003307875109 là giá trị có kiểu chuỗi của thuộc tính id vì 100003307875109 nằm trong nháy đôi–> suy ra thuộc tính id sẽ khai báo kiểu String. Tương tự cho các thuộc tính khác, giờ Tui sẽ làm ví dụ để biến định dạng JSon này thành Java class để dễ tương tác, sau đó sẽ có những bài phức tạp hơn có sự lồng ghép lung tung trong JSon gốc (Ta sẽ đi từ từ, không cần nóng vội).

– Tạo một Project tên là FaceBookTool (các bước tạo project đã được trình bày ở bài trước, nếu bạn nào chưa biết thì xem lại bài 59). Chú ý là package trong ví dụ này bạn đặt tùy ý nhé, đặt sao mang tính gợi nhớ và có ý nghĩa. Bạn sử dụng package nào thì các hướng dẫn ở dưới bạn sẽ theo package bạn đã đặt tên chứ không phải giống như Tui đặt bên dưới nhé.

Hướng dẫn add texdrawble vào thư viện android chi tiết
Tiếp theo ta tạo một package tên là “com.tranduythanh.model” để lưu trữ class Java dành cho JSon.

Để cho lẹ thì ta bấm chuột phải vào java/chọn new/chọn Package như hình dưới đây:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Màn hình yêu cầu chọn nơi lưu trữ hiện thị xuất hiện, ta nhấn nút OK:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Sau khi bấm OK, màn hình yêu cầu nhập tên Package xuất hiện, ta nhập tên package rồi nhấn nút OK:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở trên Tui đặt com.tranduythanh.model với mục đích tạo ra sub model để lưu trữ Class dành cho định dạng JSon.

Sau khi bấm OK, ta quan sát cấu trúc hiển thị package bị thay đổi như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Bây giờ ta tiến hành tạo 1 class tên là FaceBook nằm bên trong model(bạn đặt tên gì cũng được, miễn sao nó đại diện đủ ý nghĩa cho cấu trúc JSon, trong trường hợp này là http://graph.facebook.com/nguyen.hoangphong.50).

Tất cả dữ liệu trong định dạng JSon mà nằm trong cặp ngoặc nhọn thì đó chính là 1 Đối tượng (Object)–> cần có 1 class cho nó, các thuộc tính bên trong JSon–> thuộc tính trong class Java:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Bây giờ ta bấm chuột phải vào model/ chọn New / Java Class:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Màn hình new class hiển thị ra:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Trong mục Name, Ta đặt tên class là FaceBook rồi nhấn nút OK.

Mặc định ta có kết quả như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bây giờ ta tiến hành khai báo các thuộc tính trong định dạng JSon cho Java class này, có 2 chú ý bạn cần rõ là:

-Bạn chú ý là không nhất thiết phải lấy hết các thuộc tính trong JSon để khai báo trong này mà những thuộc tính nào bạn cần truy suất thì mới khai báo mà thôi.

-Trong JSon thuộc tính tên nó như thế nào thì bạn phải copy paste y xì như vậy vào Java class.

Tức là ta có như sau:

package com.tranduythanh.camerauploader; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.util.Log; 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 org.apache.http.util.EntityUtils; import java.util.ArrayList; /

  • Created by drthanh on 14/05/2015. */ public class UploadToServerTask extends AsyncTask { //URL để tải hình lên server private String URL = "http://duythanhcse.freevnn.com/index2.php"; private Activity context=null; private ProgressDialog progressDialog=null; private String ba1; public UploadToServerTask(Activity context, String ba1) { this.context=context; this.ba1=ba1; this.progressDialog=new ProgressDialog(this.context); } protected void onPreExecute() { super.onPreExecute(); this.progressDialog.setMessage("Vui lòng chờ hệ thống đang upload hình!"); this.progressDialog.show(); } @Override protected String doInBackground(Void... params) { //Coding gửi hình lên Server ArrayList nameValuePairs = new ArrayList(); nameValuePairs.add(new BasicNameValuePair("base64", ba1)); nameValuePairs.add(new BasicNameValuePair("ImageName", System.currentTimeMillis() + ".jpg")); try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(URL); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); String st = EntityUtils.toString(response.getEntity()); Log.v("log_tag", "In the try Loop" + st); } catch (Exception e) { Log.v("log_tag", "Lỗi kết nối : " + e.toString()); } return "Thành công"; } protected void onPostExecute(String result) { super.onPostExecute(result); this.progressDialog.hide(); this.progressDialog.dismiss(); } }

5

Bạn thấy đấy ở trên Tui chỉ muốn truy suất id, name, gender và username. Còn các thuộc tính first_name, last_name, link, locale Tui không muốn truy suất thì Tui không phải báo ở đây.

Tiếp theo ta tạo các phương thức get,set cho class Facebook. Dùng tool mà Android Studio hỗ trợ cho lẹ.

Trong class FaceBook, ta nhấn tổ hợp phím Alt + Insert hoặc vào menu code/ chọn Generate…:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở trên Tui tạo Getter và Setter nên Tui chọn Getter and Setter, nếu muốn chọn constructor thì bạn chọn Constructor… Khi bạn click chuột hoặc enter vào chức năng nào thì nó tạo cho bạn. Ví dụ Tui chọn Getter and Setter thì màn hình chọn thuộc tính để tạo Getter và Setter như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở màn hình trên nếu bạn muốn tạo đồng loạt cho tất cả thuộc tính thì nhấn tổ hợp phím Ctrl +A cho lẹ, còn muốn chọn rời rạc thì đề Ctrl rồi nhấn chuột từng thuộc tính —> sau đó nhấn OK để tạo, bạn sẽ thấy kết quả:

package com.tranduythanh.camerauploader; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.util.Log; 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 org.apache.http.util.EntityUtils; import java.util.ArrayList; /

  • Created by drthanh on 14/05/2015. */ public class UploadToServerTask extends AsyncTask { //URL để tải hình lên server private String URL = "http://duythanhcse.freevnn.com/index2.php"; private Activity context=null; private ProgressDialog progressDialog=null; private String ba1; public UploadToServerTask(Activity context, String ba1) { this.context=context; this.ba1=ba1; this.progressDialog=new ProgressDialog(this.context); } protected void onPreExecute() { super.onPreExecute(); this.progressDialog.setMessage("Vui lòng chờ hệ thống đang upload hình!"); this.progressDialog.show(); } @Override protected String doInBackground(Void... params) { //Coding gửi hình lên Server ArrayList nameValuePairs = new ArrayList(); nameValuePairs.add(new BasicNameValuePair("base64", ba1)); nameValuePairs.add(new BasicNameValuePair("ImageName", System.currentTimeMillis() + ".jpg")); try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(URL); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); String st = EntityUtils.toString(response.getEntity()); Log.v("log_tag", "In the try Loop" + st); } catch (Exception e) { Log.v("log_tag", "Lỗi kết nối : " + e.toString()); } return "Thành công"; } protected void onPostExecute(String result) { super.onPostExecute(result); this.progressDialog.hide(); this.progressDialog.dismiss(); } }

6

– Như vậy ta đã tạo xong Java class để lưu trữ thông tin chuyển đổi từ định dạng JSon của Facebook.

– Tiếp theo bạn tải thư viện Gson ở đây : https://google-gson.googlecode.com/files/google-gson-2.2.4-release.zip

Giải nén ra trong đó có 3 tập tin thì bạn chọn 1 tập tin là gson-2.2.4.jar.

Hướng dẫn add texdrawble vào thư viện android chi tiết
Project Android Studio của mình sẽ tham chiếu tới thư viện này. Cách tham chiếu như sau:

– Trước tiên chuyển qua chế độ xem Project:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Bạn tìm tới thư mục libs rồi copy thư viện đó vào đây như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Sau khi copy xong ta phải tham chiếu tới nó mới được, tham chiếu bằng mở màn hình Project Structer lên (có nhiều cách mở và đặc biệt là mở ở chế độ view nào cũng được: Android, Project.. đều được):

+ Cách 1: Nếu đang chọn tên Project thì nhấn phím F4 ngay và luôn

+ Cách 2: Bấm chuột phải vào vị trí bất kỳ trong Project/ chọn Open Module Settings

Hướng dẫn add texdrawble vào thư viện android chi tiết

+Cách 3: Vào Menu File/ chọn Project Structer…

Hướng dẫn add texdrawble vào thư viện android chi tiết
\==> Cả 3 cách trên ta đều có Màn hình Cấu hình Project như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Bạn bấm vào mục số 1 trước

– Sau đó ở mục số 2 chọn Dependencies

– Tiếp theo nhấn vào hình dấu + ở mục số 3:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ta sẽ chọn File dependency (nó bắt di chuyển phím mũi tên lên xuống để chọn, muốn xác nhận thì phải nhấn phím Enter không dùng chuột):

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ta tìm tới đúng nơi lưu trữ thư viện rồi bấm ok. ta được kết quả như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Tiếp tục bấm OK 1 lần nữa nha, nếu bấm cancel thì làm lại từ đầu.

Sau đó nếu như Android studio chưa phải ở chế độ Android thì nhớ chuyển về Android để lập trình cho dễ (vì bước mở Cấu trình Project ở trên có thể mở ở bất kỳ chế độ xem nào nên khi lập trình phải chuyển qua Android).

Ta có thể xem nơi khai báo lưu trữ để biên dịch thư viện trên nằm ở đâu:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Bây giờ các bạn tiến hành thiết kế giao diện để lấy thông tin từ 1 facebook bất kỳ về android client như sau:
Hướng dẫn add texdrawble vào thư viện android chi tiết
-Tui chụp cấu trúc layout của giao diện trên như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn có thể nhìn vào nhóm Component Tree để kéo thả các control cho phù hợp. Cách thiết kế cũng tương tự như trong Eclipse cũ nên Tui không giải thích kỹ chỗ này. Tuy nhiên lần đầu tạo layout thì nó mặc định là ReletavieLayout, bạn nhớ vào tab Text trong mục Control (palette) để tự sửa lại thành LinearLayout vertical để kéo thả các control tiếp theo được dễ dàng hơn.

Nhớ đặt tên id cho các control như trong mục Component Tree.

Bạn có thể sao chép XML cho layout trên ở đây:

package com.tranduythanh.camerauploader; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.util.Log; 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 org.apache.http.util.EntityUtils; import java.util.ArrayList; /

  • Created by drthanh on 14/05/2015. */ public class UploadToServerTask extends AsyncTask { //URL để tải hình lên server private String URL = "http://duythanhcse.freevnn.com/index2.php"; private Activity context=null; private ProgressDialog progressDialog=null; private String ba1; public UploadToServerTask(Activity context, String ba1) { this.context=context; this.ba1=ba1; this.progressDialog=new ProgressDialog(this.context); } protected void onPreExecute() { super.onPreExecute(); this.progressDialog.setMessage("Vui lòng chờ hệ thống đang upload hình!"); this.progressDialog.show(); } @Override protected String doInBackground(Void... params) { //Coding gửi hình lên Server ArrayList nameValuePairs = new ArrayList(); nameValuePairs.add(new BasicNameValuePair("base64", ba1)); nameValuePairs.add(new BasicNameValuePair("ImageName", System.currentTimeMillis() + ".jpg")); try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(URL); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); String st = EntityUtils.toString(response.getEntity()); Log.v("log_tag", "In the try Loop" + st); } catch (Exception e) { Log.v("log_tag", "Lỗi kết nối : " + e.toString()); } return "Thành công"; } protected void onPostExecute(String result) { super.onPostExecute(result); this.progressDialog.hide(); this.progressDialog.dismiss(); } }

7

– Sau đó ta vào MainActivity để tiến hành coding. Chú ý là khi có tương tác Internet thì bắt buộc ta phải dùng kỹ thuật Đa Tiến trình để viết và phải cấp quyền sử dụng internet trong Manifest, Nếu bạn nào chưa am hiểu kỹ thuật đa tiến trình trong Android thì học tại đây:

https://duythanhcse.wordpress.com/2013/06/14/bai-tap-34-da-tien-trinh-trong-android-multi-threading/

https://duythanhcse.wordpress.com/2013/10/25/bai-35-ve-button-luc-runtime-dung-using-message-cua-handler-class/

https://duythanhcse.wordpress.com/2013/10/25/bai-36-update-listview-at-runtime-by-handler-class-using-post/

https://duythanhcse.wordpress.com/2013/10/25/bai-37-xu-ly-da-tien-trinh-bang-asynctask/

Quay lại coding trong MainActivity của ứng dụng:

package com.tranduythanh.camerauploader; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.util.Log; 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 org.apache.http.util.EntityUtils; import java.util.ArrayList; /

  • Created by drthanh on 14/05/2015. */ public class UploadToServerTask extends AsyncTask { //URL để tải hình lên server private String URL = "http://duythanhcse.freevnn.com/index2.php"; private Activity context=null; private ProgressDialog progressDialog=null; private String ba1; public UploadToServerTask(Activity context, String ba1) { this.context=context; this.ba1=ba1; this.progressDialog=new ProgressDialog(this.context); } protected void onPreExecute() { super.onPreExecute(); this.progressDialog.setMessage("Vui lòng chờ hệ thống đang upload hình!"); this.progressDialog.show(); } @Override protected String doInBackground(Void... params) { //Coding gửi hình lên Server ArrayList nameValuePairs = new ArrayList(); nameValuePairs.add(new BasicNameValuePair("base64", ba1)); nameValuePairs.add(new BasicNameValuePair("ImageName", System.currentTimeMillis() + ".jpg")); try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(URL); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); String st = EntityUtils.toString(response.getEntity()); Log.v("log_tag", "In the try Loop" + st); } catch (Exception e) { Log.v("log_tag", "Lỗi kết nối : " + e.toString()); } return "Thành công"; } protected void onPostExecute(String result) { super.onPostExecute(result); this.progressDialog.hide(); this.progressDialog.dismiss(); } }

8

– Sau cùng ta cấp quyền sử dụng Internet:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn chú ý là version Android Studio hiện tại chưa cung cấp giao diện để cấp quyền, mà bạn phải gõ bằng lệnh trong AndroidManifest, tuy nhiên android Studio hỗ trợ chức năng gợi nhớ giúp ta dễ dàng chọn lựa:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Cũng tương tự như việc gợi ý sửa lỗi trong Android Studio chính là gõ tổ hợp phím Alt+Enter (bên Eclipse cũ là Ctrl+1). Vậy bạn chú ý là muốn xem gợi ý sửa lỗi nhanh thì nên gõ Alt+Enter (ta thường dùng nhiều nhất trong trường hợp Tự động Ép Kiểu , Tự động Import thư viện và tự động implement các Abstract method).

– Tới đây là bạn đã thực hiện được việc đọc JSon từ internet và đưa nó về Java class phục vụ cho các mục đích khác.

– Bài tiếp theo Tui sẽ hướng dẫn các bạn cách chuyển JSon có định dạng phức tạp (đối tượng chứa đối tượng, đối tượng chứa danh sách đối tượng…) về Java class

– Các bạn có thể tải source code mẫu của bài này ở đây: http://www.mediafire.com/download/t4kp87nh57y8nnx/FaceBookTool.rar

– Chúc các bạn thành công!

Bài 60: Cấu hình Hardware Accelerated Execution để chạy máy ảo Android 5.0

Ở bài tập 59 các bạn đã biết cách tạo cũng như sử dụng được Android Studio Project và cách tạo Android Virtual Device, tuy nhiên chạy với API<21. Đối với Android 5.0 sử dụng API 21 trở lên nó yêu cầu PC phải hỗ trợ ảo hóa và có cài đặt Hardware Accelerated.

– Nếu như Mainboard PC của bạn không hỗ trợ Ảo Hóa hoặc nếu có hỗ trợ mà chưa có Hardware Accelerated thì khi chạy Máy Ảo Android với bản API 21 trở lên bạn sẽ gặp lỗi sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Từ màn hình Android Virtual Device Manager, chọn Máy Ảo API 21 như hình trên, bấm nút Start, bạn sẽ gặp lỗi như hình dưới đây:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Để sửa được lỗi trên ta làm theo các bước sau:

Bước 1) Kiểm tra xem Main Board của bạn có hỗ trợ Công Nghệ Ảo Hóa hay không?

– Tùy thuộc vào từng dòng máy tính của bạn mà cách kiểm tra trong Bios có Công Nghệ Ảo Hóa hay không, nếu có hỗ trợ bạn cần enable nó lên. Tui đưa một số hình ảnh dưới đây, tùy vào máy tính của bạn mà màn hình Main Board sẽ khác nhau, bạn tự mò tới Ảo Hóa và bận lên:

Hướng dẫn add texdrawble vào thư viện android chi tiết

Hướng dẫn add texdrawble vào thư viện android chi tiết

Hướng dẫn add texdrawble vào thư viện android chi tiết

Hoặc bạn dùng công cụ có giao diện của Intel để xác định nó đã được enable hay chưa:

– Bạn vào link sau: http://www.intel.com/p/en_US/support/highlights/processors/toolspiu

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn tải nó về và chạy lên:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bước 2) Cài đặt Hardware Accelerated Execution

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn mở Android SDK Manager lên/ tìm tới Extras ở dưới cùng, tiến hành tải”Intel x86 Emulator Accelerator (HAXM installer)“.

Sau khi tải xong bạn vào thư mục SDK đã cài đặt Android Studio (do bạn cài đặt):

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn tiến hành cài đặt intelhaxm-android.exe

Hướng dẫn add texdrawble vào thư viện android chi tiết
Sau khi cài đặt xong bạn vào Control panel để kiểm tra:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Nếu có như trên là đã cài đặt thành công.

Bước 3) Sử dụng công cụ bcdedit để thiết lập thông số cho nx và hypervisorlaunchtype

– Mở command line với chế độ Administrator:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Màn hình commandline ở chế độ Administrator sẽ hiển thị ra như dưới đây:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Tại dấu nhắc lệnh bạn gõ lệnh bcdedit

Ta được kết quả hiện thị ra như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Hoặc:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Hoặc:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Trong 3 kết quả của bcdedit liệt kê thì chỉ có trường hợp cuối cùng là có thể chạy được Android Emulator 5.0

———————————————–

Tức là chế độ:

nx AlwaysOn

hypervisorlaunchtype Off

———————————————–

Nếu bạn không nhận được kết quả như trường hợp cuối cùng thì không thể chạy được, vậy làm sao để thiết lập?

Và bạn chú ý rằng nếu bạn muốn lập trình đồng thời Android 5.0 với Windows Phone hay cài đặt VMWare lại không được, nó không cho sống chung, lý do là mỗi một nền tảng chạy lên nó sẽ chiếm hết tài nguyên không cho nền tảng khác chạy.

Do đó nếu như bạn đã chuyên qua:

nx AlwaysOn

hypervisorlaunchtype Off

Thì chỉ có thể lập trình Android chứ không lập trình Windows Phone được.

Do đó muốn lập trình Windows Phone bạn phải thiết lập lại thông số:

———————————————–

nx AlwaysOn

hypervisorlaunchtype Auto

———————————————–

Mỗi lần chuyển giá trị đều phải khởi động lại máy nhé.

Ví dụ Ta muốn cấu hình cho phép lập trình Windows Phone thì dùng lệnh sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
————————————————————————-

ở trên Tui bật nx lên alwayson.

bcdedit /set nx alwayson

và bật hypervisorlaunchtype auto

bcdedit /set hypervisorlaunchtype auto

————————————————————————-

-Ví dụ Ta muốn cấu hình cho phép lập trình Android thì dùng lệnh sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Vậy chú ý nếu muốn lập trình Android phải theo lệnh sau:

————————————————————————-

ở trên Tui bật nx lên alwayson.

bcdedit /set nx alwayson

và bật hypervisorlaunchtype off

bcdedit /set hypervisorlaunchtype Off

————————————————————————-

Nhắc lại là mỗi lần thay đổi giá trị trong bcdedit đều phải khởi động lại máy.

Vậy tới đây là bạn có thể lập trình được với Android 5.0 (API 21 trở lên) rồi nhé.

Ta thử lại bước chạy Máy ảo sẽ có kết quả như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
RAM của bạn cần phải lớn, thường 8GB trở lên mới có thể tải nổi. Còn yếu thì nên sử dụng API 19 và độ phân giải thấp là được rồi, vì hiện nay chưa quá 1% thiết bị sử dụng API 21, mà có tới hơn 90% thiết bị sử dụng API 19.

Vậy là các bạn đã biết cấu hình để chạy Android Emulator 5.0 (API 21)

Chúc các bạn thành công!

Bài 59: Làm quen với môi trường lập trình Android Studio – Phần 2

Trong bài 58 Tui đã hướng dẫn các bạn cách cài đặt Android Studio chính thống giáo của hãng Google, trong bài này Tui sẽ trình bày các nội dung sau:

—————————————————————————-

  1. Cách tạo một Project trong Android Studio.
  1. Cấu trúc một Project trong Android Studio
  1. Các chức năng quan trọng thường dùng trong Android Studio
  1. Cách tạo và sử dụng Android Emulator trong Android Studio
  1. Quy trình thực thi một phần mềm lên thiết bị (thật, emulator) trong Android Studio.

—————————————————————————-

  1. Cách tạo một Project trong Android Studio.

– Khởi động Android Studio/ chọn Start a new Android Studio project như hình dưới đây:

Hướng dẫn add texdrawble vào thư viện android chi tiết

– Màn hình Create New Project sẽ hiển thị ra, nhập đúng thông tin rồi bấm Next:

Hướng dẫn add texdrawble vào thư viện android chi tiết

-Application Name: Tên Ứng dụng muốn đặt

-Company Domain: Tên domain công ty, thường được dùng để kết hợp với tên Application để tạo thành Package (chú ý viết thường hết và có ít nhất 1 dấu chấm).

-Package name: Nó sẽ tự động nối ngược Company Domain với Application name.

-Project location: Là nơi lưu trữ ứng dụng.

Sau khi nhập thông tin chính xác, ta nhấn nút Next thì xuất hiện màn hình cấu hình Target Android Devices như dưới đây (Bạn hiểu nôm na là cấu hình thiết bị mục tiêu mà ứng dụng Support tốt nhất):

Hướng dẫn add texdrawble vào thư viện android chi tiết
Hiện nay bản API14 Android 4.0 (IceCreamSandwich) vẫn đứng đầu về số lượng thiết bị sử dụng chiếm tới hơn 90%) nên ta thường hỗ trợ tối đa (để bán được nhiều sản phẩm).

Ta có thể xổ danh sách ra để xem các API hỗ trợ (dĩ nhiên ta phải chọn API phù hợp nhất):

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Sau khi bấm Next, màn hình tiếp theo hiển thị cho phép chọn loại Activity mặc định:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ta chon Blank Activity rồi bấm Next:

– Màn hình hiệu chỉnh Activity xuất hiện:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Thường nếu bắt đầu new project, ta để mặc định không chỉnh sửa activity_main như trên rồi bấm finish.

Activity Name: Tên class Activity (java) để ta viết mã lệnh

Layout Name: Tên file XML làm giao diện cho Activity Name.

Title: Tiêu đề hiển thị khi kích hoạt Activity trên thiết bị.

Menu Resource Name: Tên file xml để tạo menu cho phần mềm.

Sau khi cấu hình xong, ta bấm Finish, Màn hình Build Gradle project hiển thị:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Khi build xong mặc định ta có màn hình dưới đây:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở màn hình trên ta sẽ được Android Studio hướng dẫn:

– Tìm kiếm: Nhấn 2 lần phím Shift liên tục

– Để xem project: Nhấn tổ hợp phím tắt ALT+1

-Để mở 1 file : Nhấn tổ hợp phím tắt Ctrl+ shift+N

-Để mở các file trước đó: Nhấn tổ hợp phím Ctrl+E

  1. Cấu trúc một Project trong Android Studio

–> Ta tiến hành mở Project mặc, định activity_main.xml sẽ được chọn ta có màn hình như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Ở trên tạm thời Tui chia làm 6 vùng làm việc mà lập trình viên chúng ta thường tương tác. Tui sẽ giải thích kỹ từng vùng để các bạn nắm rõ.

Vùng 1:

Là nơi cấu trúc hệ thống thông tin của Ứng dụng, Ta có thể thay đổi cấu trúc hiển thị (thường để mặc định là Android)

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ta quan sát khi chọn vào nhóm góc trái trên cùng của vùng số 1, có nhiều lựa chọn hiển thị, giả sử bây giờ Tui chuyển từ Android qua Packages:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Giờ quay trở lại chế độ Android:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn có thể thấy AndroidManifest.xml nằm ở đây. File này vô cùng quan trọng trong việc cấu hình ứng dụng.

Các thư mục Resource (res): drawable, layout, menu… đã được giải thích kỹ và nó giống y xì bên Eclipse nên Tui không nói lại.

Vùng 2:

Là vùng khá quan trọng cho những bạn mới bắt đầu lập trình, nó là nơi hiển thị các Control mà Android hỗ trợ, cho phép bạn kéo thả trực tiếp vào vùng 3 (Giao Diện Thiết Bị) để thiết kế.

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở vùng số 2 này nó có 2 tab: Design và Text ở góc trái dưới cùng.

Tab Design là tab mà bạn đang nhìn và thao tác với nó (cho phép thiết kế giao diện bằng cách kéo thả.

Tab Text là tab cho phép ta thiết kế giao diện bằng viết Tag XML:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Vùng 3:

Là vùng giao diện thiết bị, cho phép các Control kéo thả vào đây và đồng thời cho chúng ta hiểu chính control.

Hướng dẫn add texdrawble vào thư viện android chi tiết
Vùng 3 ta có thể chọn cách hiển thị theo nằm ngang nằm đứng, phóng to thu nhỏ, căn chỉ control, lựa chọn loại thiết bị hiển thị….

Vùng 4:

Khi màn hình của bạn có nhiều control thì vùng 4 này trở lên hữu ích, nó cho phép hiển thị giao diện theo dạng cấu trúc Cây, nên bạn dễ dàng quan sát và lựa chọn control khi chúng bị chồng lập trên giao diện (vùng 3).

Hướng dẫn add texdrawble vào thư viện android chi tiết
Vùng 5:

Vùng này rất quan trọng, đây là vùng cho phép thiết lập trạng thái hay thuộc tính cho các Control trên giao diện.

Hướng dẫn add texdrawble vào thư viện android chi tiết
Cách thiết lập các giá trị cho các thuộc tính đã được nói ở eclipse và cũng dễ sử dụng nên Tui không nói lại.

  1. Các chức năng quan trọng thường dùng trong Android Studio

Vùng 6:

Là vùng rất tiện lợi giúp ta thao tác nhanh chóng:

– Chạy ứng dụng và Debug ứng dụng:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Quản lý máy ảo (AVD Manager)

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Quản lý Android SDK Manager (thường dùng để cập nhật)

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Quản lý Android Device Manager

Hướng dẫn add texdrawble vào thư viện android chi tiết
Cách sử dụng đã trình bày ở Eclipse và giống nhau, Tui không nói lại.

  1. Cách tạo và sử dụng Android Emulator trong Android Studio

Để chạy phần mềm Android Studio ta có nhiều cách:

– Nhấn biểu tượng Run trên thanh Toolbar

– Vào menu Run/Run ‘App’ (nhấn Shift + F10)

– Vào menu Run/Run (nhấn Alt + Shift + F10)

– Bây giờ ta thực thi HelloWorldAndroidStudio:

– Trong trường hợp có kết nối tới thiết bị thật, Android Studio sẽ hiển thị ngay thiết bị thật cho ta lựa chọn:

Hướng dẫn add texdrawble vào thư viện android chi tiết

Ta chọn thiết bị thật rồi nhấn nút OK, Ta xem kết quả:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Nếu chưa kết nối tới thiết bị thật (không có máy thật), và cũng chưa có kích hoạt máy ảo thì ta phải tạo máy ảo, lúc chạy lên hệ thống bắt ta làm điều này (nếu nó chưa nhận dạng được thiết bị nào):

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Ở màn hình trên ta chọn Launch Emulator:

+ Ở mục 1 cho phép ta xem danh sách Emulator đã được tạo trước (nếu có)

+ Ở mục 2 nếu ta không muốn chọn Emulator trước đó mà muốn tạo mới thì bấm vào … cấu hình xong nhấn OK, màn hình Android Virtual Device Manager sẽ xuất hiện:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ta bấm vào Start để kích hoạt máy ảo, nếu không muốn thì bấm vào create Virtual Device để tạo máy ảo mới. Bạn chú ý là nếu máy bạn không hỗ trợ ảo hóa thì tốt nhất sử dụng API 19 trở xuống, còn nếu cố gắng chọn 21 chắc chắn nó không cho chạy (phải biết cách cấu hình, Tui sẽ hướng dẫn ở bài sau).

– Nếu bấm vào Create Virtual Device:

Màn hình Select Hardware sẽ hiển thị:

Hướng dẫn add texdrawble vào thư viện android chi tiết
– Nên chọn độ phân giải nhỏ để không tốn bộ nhớ nhiều (mục 1)

– Sau đó nhấn Next ở mục 2. Tiến hành chọn System Image:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn cần chọn API để tạo máy ảo, nếu tải thì rất mất thời gian, Tui đưa ra 1 “Mẹo” giúp các bạn không phải tải về nếu như trước đó đa đang sử dụng bên Eclipse cũ: Đó là chép thư mục “android-19” hay bất kỳ gói API nào có trong 2 thư mục của Eclipse thường đó là thư mục platforms và system-images vào SDK của Android Studio mà bạn đã cài đặt.

Tiếp theo bấm Next:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Để cấu hình nâng cao chon Show Advanced Settings:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bấm Finish:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn bấm Start và chờ cho Emulator kích hoạt như hình:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Sau đó quay trở lại màn hình chọn máy ảo thì ta mới thấy nó hiển thị ở đây:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ta thấy Máy ảo hiển thị ra như trên, tiến hành chọn rồi nhấn nút OK.

Ta được kết quả như sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Như vậy tới đây bạn đã chạy được Ứng dụng trên cả máy thật và máy ảo.

  1. Quy trình thực thi một phần mềm lên thiết bị (thật, emulator) trong Android Studio.

Quy trình để chạy được 1 ứng dụng như trên là gì?

Bước 1: Biên dịch và đóng gói ứng dụng thành file APK.

Bước 2: Hệ thống tiến hành tìm Thiết bị (thật, ảo)

Bước 3: Nếu tìm được thiết bị, tiến hành tải APK ở bước 1 vào Remote Path /data/local/tmp/com.tranduythanh.helloandroidstudio

Bước 4: Tiến hành cài đặt ứng dụng vào thiết bị nếu bước 3 tải thành công, hệ thống dùng lệnh sau để cài đặt:

DEVICE SHELL COMMAND: pm install -r “/data/local/tmp/com.tranduythanh.helloandroidstudio” pkg: /data/local/tmp/com.tranduythanh.helloandroidstudio

Bước 5: Nếu cài đặt thành công tiến hành kích hoạt Ứng dụng để chạy

Tìm trong AndroidManifest, Activity nào được thiết lập ACTION MAIN sẽ được thực hiện.

Hệ thống dùng lệnh:

DEVICE SHELL COMMAND: am start -n “com.tranduythanh.helloandroidstudio/com.tranduythanh.helloandroidstudio.MainActivity” -a android.intent.action.MAIN -c android.intent.category.LAUNCHER

Khi khởi động thành công sẽ có thông báo:

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.tranduythanh.helloandroidstudio/.MainActivity }

——————————————————————–

– Vậy bạn đã biết tạo 1 Project, hiểu được cấu trúc thành phần của Android, biết cách sử dụng Máy Ảo và các chức năng quan trọng thường dùng, cuối cùng là quy trình để kích hoạt 1 ứng dụng Android lên thiết bị sảy ra như thế nào.

– Trong bài tiếp theo Tui sẽ hướng dẫn các bạn cách xử lý cho phép chạy ứng dụng với API 21 trở lên (có sử dụng chức năng ảo hóa Nếu Main PC của bạn có support, còn MAIN không support thì không thể dùng). Vì nó bị xung đột với HyPer-V khi bạn lập trình Windows Phone, hay sử dụng VMWare, Virtualbox….

– Chúc bạn thành công.

Bài 58: Làm quen với môi trường lập trình Android Studio – Phần 1

Như chúng ta đã biết hiện nay hãng Google đã release bản Android Studio thay thế cho bản Eclipse cũ, khi ta vào link http://developer.android.com/sdk/index.html để tải thì không còn thấy xuất hiện bản cũ nữa mà được thay thế bởi Android Studio.

Như vậy ông lớn Google đã nối gót ông lớn Microsoft để tự tạo ra bộ công cụ lập trình chuẩn riêng. Với Android Studio thì giao diện và đặc biệt là sự biến mất WorkSpace có đôi chút gây khó khăn cho lập trình viên khi mới bắt đầu chuyển qua công cụ này, cũng rất may là Google hỗ trợ tính năng Import Project từ Eclipse cũ qua được Android Studio và logic lập trình cũng tương tự, không khác nhau mấy.

Khi bạn tải Android Studio về thì nó sẽ bao gồm các thành phần sau:

  • Android Studio IDE
  • Android SDK tools
  • Android 5.0 (Lollipop) Platform
  • Android 5.0 emulator system image with Google APIs

Với bản Emulator cho Android 5.0 thì máy tính của lập trình viên phải hỗ trợ tính năng Ảo Hóa và phải cài đặt thêm Hardware Accelerated Execution Manager. Và dĩ nhiên nếu như bạn vừa đồng thời lập trình Windows Phone 8, 8.1 thì có thể sảy ra rắc rối khi bạn kích hoạt Hyper-V (Bạn phải biết cách sử dụng lệnh để chuyển đổi qua lại khi bạn thay đổi lập trình Android qua Windows phone và ngược lại, dĩ nhiên phải khởi động lại máy, Tui sẽ hướng dẫn cách gõ lệnh thực hiện đều trên ở bài tiếp theo).

Khi bạn vào http://developer.android.com/sdk/index.html, bạn chọn “Download Android Studio for Windows” như hình dưới đây:

Hướng dẫn add texdrawble vào thư viện android chi tiết

Bạn copy link chuyển qua IDM để tải cho lẹ (chú ý nên tải trực tiếp từ trang web nếu có version mới) :

https://dl.google.com/dl/android/studio/install/2.0.0.20/android-studio-bundle-143.2739321-windows.exe

– Một số yêu cầu cấu hình lưu ý trước khi cài đặt:

  • Microsoft® Windows® 8/7/Vista/2003 (32 or 64-bit)
  • Tối thiểu 2 GB RAM hoặc 4 GB RAM, Tui nghĩ càng nhiều càng tốt. 4GB RAM thì cũng có thể gây cho ta một giấc ngủ dài khi ngồi Debug
  • 400 MB hard disk space + ít nhất 1 G cho Android SDK, emulator system images và caches
  • Độ phân giải tối thiếu 1280 x 800
  • Java Development Kit (JDK) 7 trở lên (giờ có bản 8 rồi nên bạn sử dụng luôn – Tui đang sài)
  • Lựa chọn thêm cho accelerated emulator: Intel® processor with support for Intel® VT-x, Intel® EM64T (Intel® 64), and Execute Disable (XD) Bit functionality

Trong phần này Tui sẽ hướng dẫn các bạn cách thức cài đặt Android Studio (dĩ nhiên bạn phải cài trước JDK):

Bước 1:

Sau khi tải về máy thành công, bạn double click vào tập tin “android-studio-bundle-135.1641136.exe”

Hướng dẫn add texdrawble vào thư viện android chi tiết
Màn hình Welcome to Setup Android Studio sẽ xuất hiện:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ta bấm Next để qua bước 2.

Bước 2:

Màn hình chọn các thành phần cài đặt

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở bước này ta thấy rằng Android Studio yêu cầu tối thiểu gần 4GB để lưu trữ, ta chọn cấu hình như trên rồi bấm Next để qua bước 3.

Bước 3:

Bước đọc xác nhận bản quyền và một số ràng buộc liên quan tới mã nguồn mở.

Hướng dẫn add texdrawble vào thư viện android chi tiết
Nếu bạn rảnh thì có thể kéo xuống để đọc cho hết các mô tả sau đó nhấn nút “I Agree” để qua bước 4.

Bước 4:

Cấu hình chọn lựa nơi cài đặt Android Studio.

Hướng dẫn add texdrawble vào thư viện android chi tiết
Tui nghĩ rằng ở bước này bạn nên để mặc định không tỏ vẻ nguy hiểm chọn lung tung kẻo sai cấu hình, nhấn Next để qua bước 5.

Bước 5:

Bước chọn Start Menu folder

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở bước này bạn cũng để mặc định, đừng thay đổi gì cả rồi nhấn nút Install để tiến hành cài đặt

Bước 6:

Chờ hệ thống cài đặt phần mềm Android Studio

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bạn phải ngồi canh xem nó có báo thiếu thốn hay lỗi gì không, đợi cho tới khi nó báo complete như màn hình dưới đây:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Bấm Next để qua màn hình tiếp theo (màn hình xác nhận kết thúc):

Hướng dẫn add texdrawble vào thư viện android chi tiết
Nếu bạn checked “Start Android Studio” rồi bấm Finish thì hệ thống sẽ khởi động luôn phần mềm Android Studio cho bạn:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở màn hình trên lần đầu tiên bạn sẽ chờ hơi lâu một chút, trong quá trình khởi động nó sẽ ra màn hình sau:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Nó hiển thị màn hình trên có thể do trước khi hãng Google Release bản này Tui có lập trình thử với bản Beta, bạn chọn cấu hình phù hợp rồi nhấn nút OK, hệ thống tiếp tục chạy….

Hướng dẫn add texdrawble vào thư viện android chi tiết
… bạn chờ cho hệ thống chạy hoàn tất, thường nếu lần đầu bạn sử dụng thì nó sẽ bắt tải tùm lum thứ cho đủ

Hướng dẫn add texdrawble vào thư viện android chi tiết
chờ nó tải xong (hơi lâu đó nha):

Hướng dẫn add texdrawble vào thư viện android chi tiết
Khi xong thì bạn nhấn nút Finish:

Hướng dẫn add texdrawble vào thư viện android chi tiết
Ở trên là màn hình bắt đầu lựa chọn tạo Project, mở project, Import project hay các cấu hình khác….

Bạn tới được màn hình này coi như bạn đã hoàn tất phần 1 – Cài đặt Android Studio.

Các lần sau bạn khởi động sẽ rất nhanh, Android Studio sẽ tự động mở ra màn hình cuối cùng này.

Bạn chú ý kiểm tra cấu hình máy và tiến hành cài đặt Android Studio để chuẩn bị cho những bài hướng dẫn kế tiếp về Android sẽ sử dụng bản Release mới này.