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) Show
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: -Average temperature: -Monthly Sale Report: -Trigonometric functions: -Scatter Chart: – Monthly Sale Report (conts): -Project Work Status: -Sale Growth:-budget: – 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 StudioNgà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):
Giao diện chính vô cùng đơn gian như sau: 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… Sau khi đăng ký thành công, bạn sẽ nhân được 1 email tương tự như sau: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. 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ả: – 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: – 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; /
– 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(); } }); } /
– 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: – Sau đó nhấn nút Upload để đưa lên Server:–> 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: – 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ếtTui 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: – 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: 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: 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): – 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: –> 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: – Tui chụp màn hình sử dụng phần mềm dự báo thời tiết như sau:
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: 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; /
Lớp Coord: package com.tranduythanh.model; /
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: Chi tiết từng lớp như sau: Enum TypePrediction: -Ở 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: nộ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ỳ: 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 ).– 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): – 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: – 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): Ở 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: 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ì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: 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): – 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é: – 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: 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: – Bạn tạo một Project tên là “GoogleSearchTool“, có cấu trúc như sau:– 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:
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.
0
-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 : 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ụ: Ở 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): –> 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: 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ả: 8 – Ta có thể xem mô hình mối quan hệ giữa 2 lớp này như sau: – Tiếp theo hiệu chỉnh Layout của ứng dụng để hiển thị thêm thông tin likes và cover.Ở 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: – Ở màn hình mới này ta đặt tên XemHinhActivity: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: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).:–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; /
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: 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; /
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; /
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; /
3 – Bây giờ tiến hành thực thi ứng dụng ta được kết quả như sau: -Ở 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: 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; /
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ì? Ở 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é. 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: 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: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:Ở 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: – 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: – Bây giờ ta bấm chuột phải vào model/ chọn New / Java Class:Màn hình new class hiển thị ra: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: 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; /
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…: Ở 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:Ở 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; /
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. 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: – Bạn tìm tới thư mục libs rồi copy thư viện đó vào đây như sau:– 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 +Cách 3: Vào Menu File/ chọn Project Structer… \==> Cả 3 cách trên ta đều có Màn hình Cấu hình Project như sau:– 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: 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):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: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: – 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: -Tui chụp cấu trúc layout của giao diện trên như sau: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; /
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; /
8 – Sau cùng ta cấp quyền sử dụng Internet: 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:– 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: 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:– Để 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: 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 Bạn tải nó về và chạy lên:Bước 2) Cài đặt Hardware Accelerated ExecutionBạ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): Bạn tiến hành cài đặt intelhaxm-android.exeSau khi cài đặt xong bạn vào Control panel để kiểm tra: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: Màn hình commandline ở chế độ Administrator sẽ hiển thị ra như dưới đây:Tại dấu nhắc lệnh bạn gõ lệnh bcdeditTa được kết quả hiện thị ra như sau: Hoặc:Hoặc: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: ————————————————————————-ở 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: 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: 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 2Trong 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: —————————————————————————-
—————————————————————————-
– Khởi động Android Studio/ chọn Start a new Android Studio project như hình dưới đây: – Màn hình Create New Project sẽ hiển thị ra, nhập đúng thông tin rồi bấm Next: -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): 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): – 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:Ta chon Blank Activity rồi bấm Next:– Màn hình hiệu chỉnh Activity xuất hiện: 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ị: – Khi build xong mặc định ta có màn hình dưới đây:Ở 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
–> 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: – Ở 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) 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:Giờ quay trở lại chế độ Android: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ế. Ở 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: 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. 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). 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. 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.
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: – Quản lý máy ảo (AVD Manager)– Quản lý Android SDK Manager (thường dùng để cập nhật)– Quản lý Android Device ManagerCách sử dụng đã trình bày ở Eclipse và giống nhau, Tui không nói lại.
Để 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: Ta chọn thiết bị thật rồi nhấn nút OK, Ta xem kết quả: – 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):– Ở 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: 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ị: – 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: 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: Để cấu hình nâng cao chon Show Advanced Settings:Bấm Finish:Bạn bấm Start và chờ cho Emulator kích hoạt như hình: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: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: 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.
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 1Như 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:
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: 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:
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” Màn hình Welcome to Setup Android Studio sẽ xuất hiện: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 Ở 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ở. 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. 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 Ở 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 đặtBước 6: Chờ hệ thống cài đặt phần mềm Android Studio 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:Bấm Next để qua màn hình tiếp theo (màn hình xác nhận kết thúc):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:Ở 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: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….… 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 đủchờ nó tải xong (hơi lâu đó nha):Khi xong thì bạn nhấn nút Finish:Ở 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. |