Lập trình mạng trên android

Tài liệu Lập trình mạng trên android: TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN KHOA CÔNG NGHỆ THÔNG TIN *** HỌC PHẦN: CHUYÊN ĐỀ 3 LẬP TRÌNH MẠNG TRÊN ANDROID HỆ: ĐẠI HỌC (tài liệu lưu hành nội bộ) Hưng Yên – Tháng 1 năm 2017 Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 1 MỤC LỤC Bài 1 Tổng quan về module .................................................................................................. 1 1.1. Tổng quan về module ................................................................................................... 1 1.2. Một số thư viện thường dùng trong android .................................................................. 1 1.2. Tiến trình và luồng ....................................................................................................... 3 1.2.1 Tiến trình ................................................................................................................ 3 1.2.2. Luồng ............

pdf190 trang | Chia sẻ: putihuynh11 | Lượt xem: 526 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Lập trình mạng trên android, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN KHOA CÔNG NGHỆ THÔNG TIN *** HỌC PHẦN: CHUYÊN ĐỀ 3 LẬP TRÌNH MẠNG TRÊN ANDROID HỆ: ĐẠI HỌC (tài liệu lưu hành nội bộ) Hưng Yên – Tháng 1 năm 2017 Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 1 MỤC LỤC Bài 1 Tổng quan về module .................................................................................................. 1 1.1. Tổng quan về module ................................................................................................... 1 1.2. Một số thư viện thường dùng trong android .................................................................. 1 1.2. Tiến trình và luồng ....................................................................................................... 3 1.2.1 Tiến trình ................................................................................................................ 3 1.2.2. Luồng .................................................................................................................... 3 1.2.3. Lớp Hander ........................................................................................................... 3 1.2.4. Giới thiệu đa luồng ................................................................................................ 6 1.3. AsyncTask ................................................................................................................... 7 1.3.1. Tổng quan về lớp AsyncTask ................................................................................. 7 1.3.2. Mô tả lớp AsyncTask ............................................................................................. 7 1.3.3. Ứng dụng tải ảnh từ internet .................................................................................. 9 1.3.4. Ứng dụng ProgressBar với AsyncTask ................................................................. 11 Bài 2 Tin nhắn ...................................................................................................................... 14 2.1. SmsManager .............................................................................................................. 14 2.1.1. Giới thiệu SmsManager ....................................................................................... 14 2.1.2. Để thực hiện xây dựng ứng dụng với SmsManager qua các bước sau: .................. 14 2.2. Telephony .................................................................................................................. 17 2.2.1. Giới thiệu Telephony Manager ............................................................................ 17 2.2.2. Thao tác với Telephony Manager ......................................................................... 17 2.3. Intent ......................................................................................................................... 19 2.3.1. Định nghĩa ........................................................................................................... 19 2.3.2. Phương thức và mô tả Intent ................................................................................ 19 2.3.3. Thao tác với intent ............................................................................................... 20 2.4. BroadcastReceiver ..................................................................................................... 20 2.4.1. Giới thiệu về Broadcast Receiver ......................................................................... 20 2.4.2. Ứng dụng thông báo thay đổi trạng thái wifi ........................................................ 21 2.4.3. Ví dụ ứng dụng BroadCast tự định nghĩa ............................................................. 22 Bài 3 Thư điện tử ................................................................................................................. 25 3.1. Gửi email ................................................................................................................... 25 3.1.1. Intent Object – Những hỗ trợ để sử dụng tính năng Email .................................... 25 3.1.2. Intent ứng dụng trong gửi email ........................................................................... 26 3.2. Gmail API .................................................................................................................. 26 3.3. Một số chức năng của email ....................................................................................... 27 3.3.1. Xem email ........................................................................................................... 27 3.3.2 Tạo thư nháp ......................................................................................................... 28 3.3.3 Cập nhật thư rác .................................................................................................... 30 3.3.4 Gửi thư rác ........................................................................................................... 30 Bài 4 Ứng dụng tin nhắn và ứng dụng thư điện tử ................................................................. 31 4.1. Tổng hợp kiến thức liên quan ..................................................................................... 31 4.2. Ứng dụng tin nhắn SMS ............................................................................................. 31 4.3. Ứng dụng thư điện tử ................................................................................................. 40 Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 2 Bài 5 Một số dịch vụ trên google .......................................................................................... 43 5.1. Giới thiệu Google service .......................................................................................... 43 5.2. Google Map Service .................................................................................................. 43 5.2.1. Một số ứng dụng của Google Map API ................................................................ 45 5.2.2 Yêu cầu để hiển thị bản đồ sử dụng google map ................................................... 45 5.3. Mapview .................................................................................................................... 48 5.3.1. Giới thiệu Mapview ............................................................................................. 48 5.3.2. Sử dụng Mapview cơ bản .................................................................................... 48 5.3.3. Xây dựng ứng dụng hiển thị vị trí của 1 địa điểm trên bản đồ .............................. 48 5.4. Location Base Service ............................................................................................... 55 5.4.1 The Location Object ............................................................................................. 56 5.4.2. LocationManager ................................................................................................ 57 5.4.3. Ứng dụng vị trí .................................................................................................... 58 Bài 6 Ứng dụng Location Base service ................................................................................. 63 6.1. Tìm tọa độ của 1 địa điểm .......................................................................................... 63 6.1.1. Tìm tọa độ của 1 địa điểm với google map .......................................................... 63 6.1.2. Tìm tọa độ của 1 địa điểm với Google Earth ........................................................ 63 6.2. Các phương thức của lớp Map ................................................................................... 65 6.3. Ứng dụng tìm đường đi giữa 2 vị trí dung Google Map Direction API ....................... 67 Bài 7 Kết nối với tài nguyên Internet .................................................................................... 68 7.1. Giới thiệu WebView .................................................................................................. 68 7.1.1. Giới thiệu WebView ............................................................................................ 68 7.1.2. Thao tác với WebView qua các bước sau: ........................................................... 68 7.1.3. Ví dụ ................................................................................................................... 68 7.2. Giới thiệu ConnectionReceiver và NetworkInfo ......................................................... 70 7.2.1. Lớp ConnectivityManager ................................................................................... 70 7.2.2 Lớp NetworkInfo.................................................................................................. 71 7.3. Quản lý mạng và kết nối mạng ................................................................................... 71 7.3.1. Kiểm tra trạng thái kết nối mạng.......................................................................... 71 7.3.2. Ứng dụng cảnh báo khi trạng thái kết nối mạng thay đổi với BroadcashReceiver . 74 Bài 8 Sử dụng nguồn dữ liệu từ internet ............................................................................... 76 8.1. Định vị tài nguyên ..................................................................................................... 76 8.1.1. Liên kết ............................................................................................................... 76 8.1.2. Định nghĩa URL .................................................................................................. 76 8.1.3. Cấu trúc của URL ................................................................................................ 76 8.2. HTML và RSS ........................................................................................................... 77 8.2.1. Định nghĩa HTML ............................................................................................... 77 8.2.2. Cấu trúc cây HTML cơ bản ................................................................................. 77 8.2.3. HTML và CSS .................................................................................................... 78 8.2.4. Một số thể hay dùng trong HTML ....................................................................... 79 8.2.5. RSS ..................................................................................................................... 79 8.2.6. Đặc tả RSS .......................................................................................................... 80 8.2.7. Một số phần tử của RSS ...................................................................................... 81 8.3. Một số lớp liên quan tới ............................................................................................. 81 8.3.1. Giới thiệu lớp URL ............................................................................................. 81 Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 3 8.3.2. Giới thiệu lớp URLConnection ............................................................................ 82 8.3.3. Giới thiệu lớp HttpURLConnection ..................................................................... 83 8.4. Lấy dữ liệu đơn giản từ URL trên internet .................................................................. 84 8.4.1. Load dữ liệu văn bản từ internet về điện thoại ...................................................... 84 8.4.2. Load ảnh từ internet ............................................................................................. 86 8.4.3. Load nhạc từ internet ........................................................................................... 89 Bài 9 Ứng dụng duyệt web Webmini và đọc tin tức .............................................................. 89 9.1. Tổng hợp kiên thức liên quan ..................................................................................... 89 9.2. Ứng dụng duyệt web Webmini ................................................................................... 89 9.3. Ứng dụng đọc báo ...................................................................................................... 94 Bài 10 Một số khái niệm cơ bản về dịch vụ mạng ................................................................. 95 10.1. Một số khái niệm cơ bản .......................................................................................... 95 10.1.1. Mô hình OSI ...................................................................................................... 95 10.1.2. Giao thức ........................................................................................................... 96 10.1.3. Địa chỉ IP........................................................................................................... 97 10.1.4. Cổng (Port) ........................................................................................................ 98 10.1.5. Mô hình hướng kết nối TCP/IP .......................................................................... 98 10.1.6. So sánh sự khác nhau giữa TCP và UDP .......................................................... 100 10.1.6. Mô hình OSI và TCP/IP ................................................................................... 101 10.2. Giới thiệu WebService ........................................................................................... 101 10.2.1. Giới thiệu WebService ..................................................................................... 101 10.2.2. Định nghĩa WebService ................................................................................... 101 10.2.3. Đặc điểm của Web service ............................................................................... 102 10.2.4. Ưu và nhược điểm ........................................................................................... 102 10.3. Kiến trúc của Web service ...................................................................................... 103 10.3.1. Kiến trúc của Web service ............................................................................... 103 10.3.2.Thành phần cơ bản của Web service ................................................................. 104 10.4. Xây dựng và triển khai dịch vụ mạng cho ứng dụng di động................................... 105 10.4.1. Giới thiệu......................................................................................................... 105 10.4.2. Các bước chính trong triển khai dịch vụ mạng cho ứng dụng di động ............... 106 10.4.3. Giao tiếp client và server ................................................................................. 106 10.5. Một số công nghệ lập trình mạng ........................................................................... 106 10.5.1. Công nghệ Web Service ................................................................................... 107 Bài 11 Định dạng dữ liệu XML .......................................................................................... 110 11.1. Tổng quan về XML ................................................................................................ 110 11.1.1. Giới thiệu XML ............................................................................................... 110 11.1.2. XML và HTML ............................................................................................... 110 11.1.3. XML đã làm cải thiện dịch vụ Web .................................................................. 111 11.2. Đặc tả cấu trúc và nội dung tài liệu XML ............................................................... 112 11.2.1. Các quy tắc văn bản XML ............................................................................... 112 11.2.2. Cú pháp của XML ........................................................................................... 114 11.2.3. Đặc tả tài liệu XML ......................................................................................... 116 11.2.4. Ví dụ đặc tả tệp XML ...................................................................................... 117 11.2.5. Tài liệu XML hợp lệ ........................................................................................ 118 11.2.6 Tạo tài liệu XML hợp lệ ................................................................................... 120 Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 4 11.3. Phân tích dữ liệu XML ........................................................................................... 121 13.3.1. Phân tích XML bằng kỹ thuật DOM ................................................................ 122 13.3.2. Phân tích XML bằng kỹ thuật SAX ................................................................. 123 13.3.3. Kỹ thuật DOM và kỹ thuật SAX ...................................................................... 124 11.4. Tạo một tài liệu XML trên android ......................................................................... 124 Bài 12 Định dạng dữ liệu JSON ......................................................................................... 129 12.1. Giới thiệu JSON .................................................................................................... 129 12.1.1. Giới thiệu về JSON ......................................................................................... 129 12.1.2. Định nghĩa JSON ............................................................................................ 129 12.1.3. Ưu điểm của Json ............................................................................................ 129 12.2. Cấu trúc tệp JSON ................................................................................................. 129 12.2.1. Cấu trúc tệp JSON ........................................................................................... 129 12.2.2. Ví dụ mô tả JSON ........................................................................................... 131 12.3. Thao tác với tệp định dạng JSON ........................................................................... 132 12.3.1. Tổng quan về thao tác với tệp JSON ................................................................ 132 12.3.2. Các bước thực hiện thao tác với URL định dạng JSON .................................... 132 12.3.3. Đọc databse dạng jSON ................................................................................... 133 12.4. JSON và XML ....................................................................................................... 134 Bài 13 Dịch vụ Web với WebService ................................................................................. 136 13.1. Cấu hình IIS và SQL .............................................................................................. 136 13.1.1. Cài đặt IIS ....................................................................................................... 136 13.1.2. Cấu hình SQL .................................................................................................. 137 13.2. Khởi tạo WebService ............................................................................................. 138 13.2.1. Các bước xây dựng WebService ...................................................................... 138 13.2.2. Xây dựng WebService hỗ trợ các phép tính cộng ............................................. 139 Bài 14 Lập trình dịch vụ mạng Xây dựng ứng dụng di động ............................................... 142 14.1. Tổng hợp một số kiến thức liên quan ..................................................................... 142 14.1.1. Sử dụng AsyncTask ......................................................................................... 142 14.1.2. Thư viện KSOAP 2 ......................................................................................... 142 14.1.3. Thư viện Retrofit ............................................................................................. 142 14.2. Ứng dụng WebService ........................................................................................... 142 Bài 15 Dịch vụ Web với WebAPI ...................................................................................... 152 15.1 Tổng quan về Web API ........................................................................................... 152 15.1.1. Giới thiệu API ................................................................................................. 152 15.1.2 Giới thiệu Web API .......................................................................................... 152 15.1.3. Đặc điểm Web API (.NET 4.0 trở lên) ............................................................. 153 15.1.4. Công cụ phát triển Web API ............................................................................ 153 15.2. Khởi tạo và cấu hình Web API ............................................................................... 154 15.2.1 Tạo ứng dụng Web API bằng Visual Studio ..................................................... 154 15.2.2 Tạo ứng dụng Web API đầu tiên ....................................................................... 156 Bài 16 Ứng dụng Dịch vụ Web theo công nghệ WebAPI ................................................... 160 16.1. Tổng hợp một số khái niệm lien quan với WebAPI ................................................ 160 16.1.1. Tạo Web API: ................................................................................................. 160 16.1.2. TẠO WEB API BẰNG NODEJS, CSDL MONGODB(NoSQL) ..................... 160 16.2. Ứng dụng quản lý account với Web API ................................................................ 161 Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 5 16.3. Xây dựng app android đọc account từ Web API ..................................................... 166 Bài 17 Giới thiệu về bảo mật trên mobile ............................................................................ 171 17.1.Giới thiệu ................................................................................................................ 171 17.2. Các mức bảo vệ trên mạng ..................................................................................... 171 17.2.1. Bảo vệ Quyền truy nhập ................................................................................... 171 17.2.2. Đăng ký tên /mật khẩu. .................................................................................... 171 17.2.3. Mã hoá dữ liệu ................................................................................................. 172 17.2.4. Bảo vệ vật lý .................................................................................................... 172 17.2.5. Tường lửa ........................................................................................................ 172 17.2.6. Quản trị mạng .................................................................................................. 172 17.2.7. An toàn thông tin bằng mật mã ........................................................................ 173 17.3. Một số phương pháp bảo mật ứng dụng Android .................................................... 173 17.3.1. Lưu trữ nội bộ .................................................................................................. 174 17.3.2. Mã hóa dữ liệu trên bộ nhớ ngoài ..................................................................... 174 17.3.3. Sử dụng Intents cho IPC .................................................................................. 174 17.3.4. Sử dụng HTTPS............................................................................................... 175 17.3.5. Sử dụng GCM thay cho SMS ........................................................................... 176 17.3.6. Tránh Yêu cầu dữ liệu cá nhân ......................................................................... 176 17.3.7. Xác nhận User Input ........................................................................................ 176 17.3.8. Sử dụng ProGuard Trước khi Publishing .......................................................... 177 17.4. Tạo chữ ký kỹ thuật số trong ứng dụng Android ..................................................... 177 17.4.1 Giới thiệu ......................................................................................................... 177 17.4.2. Tạo chữ ký kỹ thuật số trong ứng dụng Android .............................................. 178 Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 2 DACH MỤC TỪ VIẾT TẮT STT Từ viết tắt Cụm từ đầy đủ 1 API Application Programming Interface 2 CSS Cascading Style Sheets 3 DB DataBase 4 GCM Google Cloud Messaging 5 GPS Global Positioning Service 6 GUI Graphical User Interface 7 HTML Hyper Text Markup Language 8 HTTP Hyper Text Transfer Protocol 9 HTTPS Secure Hyper Text Transfer Protocol 10 IP Internet Protocol 11 JDBC Java Database Connectivity 12 JSON JavaScript Object Notation 13 LINQ Language Integrated Query 14 REST Representational State Transfer 15 RESTFul Representational State Transfer 16 RPC Remote Procedure Calls 17 RSS Really Simple Syndication 18 SOAP Simple Object Access Protocol 19 SQL Structured Query Language 20 SSL Secure Sockets Layer 21 TCP Transmission Control Protocol 22 TCP/IP Transmission Control Protocol/Internet Protocol 23 URI Uniform Resource Identifier 24 URL Uniform Resource Locator 25 WCF Windows Communication Foundation 26 WSDL Web Service Description Language 27 XML Extensible Markup Language Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 3 DANH MỤC HÌNH VẼ, BẢNG Hình 1. Hình ảnh mô phòng MultiThreading. ........................................................................ 7 Hình 2. Lớp kế thừa từ lớp AsyncTask .................................................................................. 8 Hình 3. Mô hình làm việc AsyncTask ................................................................................... 8 Hình 4. Thứ tự thực hiện các phương thức của lớp AsyncTask .............................................. 9 Hình 5. Kết quả ứng dụng ProgressBar ............................................................................... 13 Hình 6. Hoạt động Broadcast Receiver................................................................................ 21 Hình 7. Các kiểu giao diện hiển thị bản đồ mà Google Maps cung cấp ................................ 44 Hình 8. API key và google service ...................................................................................... 45 Bảng 1. Bảng một số phương thức hay sử dụng lớp Location .......................................... 56 Bảng 2. Các tham số của phương thức locationManager.requestLocationUpdates ............ 57 Hình 9. Lấy tọa độ của 1 địa điểm với google map .............................................................. 63 Hình 10. Lấy tọa độ của 1 địa điểm với google Earth ........................................................ 64 Bảng 3. Các phương thức của lớp Map ............................................................................ 65 Bảng 4. Các thuộc tính của lớp Map ................................................................................ 66 Bảng 5. Sự kiện của Map ................................................................................................. 66 Bảng 6. Các điều khiển của Map ...................................................................................... 66 Hình 11. Cấu trúc trang web theo định dạng HTML .......................................................... 78 Hình 12. Cấu trúc trang web theo định dạng HTML5 ........................................................ 78 Bảng 7. Bảng các phương thức khởi tạo của lớp URL ...................................................... 81 Bảng 8. Bảng một số phương thức trong lớp URL ........................................................... 82 Bảng 9. Bảng mô tả các chức năng trong mô hình OSI..................................................... 96 Hình 13. Phương thức hoạt động của bộ giao thức TCP/IP ................................................ 99 Hình 14. Mô hình OSI và cụm giao thức TCP/IP ............................................................. 101 Hình 15. Kiến trúc của Web service ................................................................................ 103 Hình 16. Mô hình giao tiếp client và server ..................................................................... 106 Hình 17. Kiến trúc WCF ................................................................................................. 107 Hình 18. Kiến trúc WebAPI ............................................................................................ 109 Hình 19. Phân tích cú pháp của XML .............................................................................. 114 Hình 20. Phân tích XML bằng kỹ thuật DOM ................................................................. 122 Hình 21. Cấu trúc tệp JSON ............................................................................................ 131 Hình 22. Cài đặt IIS ........................................................................................................ 137 Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 1 Bài 1 Tổng quan về module 1.1. Tổng quan về module Module này giới thiệu cho người học về dịch vụ mạng và các đối tượng thư viện hỗ trợ việc lập trình dịch vụ mạng trên android. Dịch vụ và dịch vụ mạng được giới thiệu trong module gồm: Các dịch vụ trên điện thoại, dịch vụ của google, dịch vụ trên web. Một số vấn đề liên quan được giới thiệu như: khái niệm webservice, cụm giao thức mạng, các loại dữ liệu XML, JSON lưu trữ dữ liệu trên internet. 1.2. Một số thư viện thường dùng trong android 1. Gson Gson là thư viện Android dùng để tạo ra Json từ Java Object hoặc gắn giá trị cho Java Object từ Json. Thư viện này thường được sử dụng khi tương tác với APIs. Chúng ta thường sử dụng Json bởi vì nó nhẹ và đơn giản hơn so với XML. 2. Retrofit Trên trang chủ của Retrofit có câu: “Retrofit turns your REST API into a Java interface” nói lên đầy đủ chức năng của nó. Đây là một giải pháp tuyệt vời để tổ chức các lời gọi API trong một dự án. Các lời gọi request được thêm đơn giản và tiện dụng. Ta sử dụng Callback để lấy kết quả các request gửi lên. Sử dụng thư viện Retrofit Trang chủ: Retrofit là một Rest Client (Tìm hiểu thêm về chuẩn RESTFul dưới link tham khảo) cho Android và Java và được tạo ra bởi Square. Họ làm cho việc nhận và tải lên JSON (hoặc dữ liệu khác) một cách khá dễ dàng tới một WebService dựa trên mô hình REST. Để làm việc với Retrofit cần triển khai cơ bản 3 lớp: – Model class to map JSON Data – Interfaces để định nghĩa các API cho Webservice – Retrofit.Builder Lớp để định nghĩa URL Endpoint cho các hoạt động liên quan tới Http 3. EvenBus EvenBus là thư viện làm đơn giản giao tiếp giữa các phần trong ứng dụng của bạn. Ví dụ, để gửi dữ liệu từ Activity tới Service đang chạy, hoặc gửi dữ liệu giữa các Fragment. 4. ActiveAndroid ActiveAndroid là một ORM dành cho Android. Nó là một trừu tượng của SQLite cho phép bạn giao tiếp với database trong một device khi không phải viết câu lệnh SQL. 5. Universal Image Loader UIL là thư viện cung cấp asynchronous, caching hình ảnh 6. KSOAP KSOAP2 là một thư viện nhẹ để sử dụng trong các thiết bị bị ràng buộc. Nó không phải là một thư viện bao gồm tất cả thư viện do-it-all. Tuy nhiên nó có nghĩa là để tương tác với hầu hết các động cơ SOAP phổ biến. SOAP đưa ra một số chi phí đáng kể cho các dịch vụ web có thể là vấn đề đối với các thiết bị di động. Nếu bạn có toàn quyền kiểm soát máy khách và máy chủ, kiến trúc dựa trên REST / JSON đơn giản có thể đầy đủ hơn. KSOAP2 được tạo thành từ một trình phân tích cú pháp XML, một bộ phân tách de / và một lớp vận chuyển. Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 2 7. Piccaso Khi tải hình ảnh từ web, thì bạn nên sử dụng Picasso vì nó đơn giản và dễ dàng và tôi thực sự như thế nào API được viết. Các bước bạn cần thực hiện để tải xuống hình ảnh chỉ với các API Android chuẩn: – Nhận URL Hình ảnh – Tạo AsyncTask để tải hình ảnh – Thực thi AsyncTask – Lưu trữ kết quả trong Bitmap – Đặt bitmap làm nguồn – Hình ảnh Cache cho tương lai 8.Dagger Dagger được biết đến và sử dụng là một thư viện dependency injection trong Android. Nó là một dependency injection đơn giản và nhanh cho cả Android và Java, bao gồm 2 phần: thư viện Dagger (size 100kb) và trình biên dịch Dagger. Thư viện này chứa tất cả những logic cần thiết và một số chú thích.Nó cũng sử dụng chuẩn chú thích javax.inject, làm code của bạn khác với các dependency injection khác của framework như Spring hay Guice. Dagger được cấp phép theo Apache License 2.0, được phát triển và điều hành bởi Square và Google và có thể tìm được ở đây: 9. LeakCanary Bạn có biết những người thợ mỏ sử dụng một con chim hoàng yến nhốt trong một chiếc lồng, nếu khí gas nhiều đến mức con hoàng yến chết, đó sẽ là dấu hiệu để họ rời khỏi mỏ. LeakCanary dễ dàng phát hiện các đối tượng bị rò rỉ bằng cách thêm một vài dòng code Java vào code đã có sẵn. Nó miễn phí và dễ dàng sử dụng. LeakCanary được cấp phép theo Apache License 2.0, được phát triển và điều hành bởi Square và có thể tìm được ở đây: https://github.com/square/leakcanary. 10. ZXing Sử dụng mã vạch và mã QR làm tiêu chuẩn trong các thiết bị đọc dữ liệu. Ban đầu được viết bằng Java, nó có thể đọc và tạo mã vạch trên nhiều nền tảng, và nó đã được chuyển sang nhiều ngôn ngữ khác. Thư viện này đã được phát triển một thời gian và có cơ sở người dùng tốt. Trình đọc mã QR được dùng trên smartphone cũng sử dụng thư viện này. Nó làm việc hiệu quả và có lịch sử tốt. ZXing được phát triển bởi Sean Oven,Daniel Switkin, ZXing Team và được cấp phép theo Apache License 2.0. Nó có thể tìm được ở đây: https://github.com/zxing/zxing 11. Libphonenumber Khi phân tích cú pháp và định dạng số điện thoại, không có nhiều giải pháp sẵn có tốt và miễn phí. Rất may, Google team đã đưa ra một thư viện có tên Libphonenumber. Đây có lẽ là thư viện tốt và toàn diện nhất để phân tích cú pháp, xác nhận và định dạng số điện thoại. Nó khá đơn giản và dễ dàng để sử dụng API và cũng đã được chuyển sang các ngôn ngữ khác ngoài JVM như C# và PHP. Libphonenumber được phát triển và điều hành bởi Google và được cấp phép Apache License 2.0. Download tại đây: https://github.com/googlei18n/libphonenumber 12.Tape Đây là một thư viện khác của Square. Tape là một tập hợp của các lớp để xử lý hàng đợi. Thật tuyệt khi xử lý luồng dữ liệu và download dữ liệu trong môi trường không ổn định.Thay vì code xử lý hàng đợi bằng tay, Tape sẽ làm thay bạn. Nếu có lỗi nào đó, Tape sẽ Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 3 tự động chạy lại lệnh hoặc hoạt động lại một lần nữa. Ngoài ra, tất cả các kết quả trung gian sẽ được tự đọng o lưu trữ, đây cũng là một tính năng hữu ích của Tape. Tape được được cấp phép Apache License 2.0, bạn có thể tìm tại đây: https://github.com/square/tape 13.Jitpack.io Jitpack.io được phát triển bởi nhóm nghiên cứu của Streametry Ltd. Jitpack có thể built bất kỳ project GitHub nào và phát hành tới repo Maven công cộng. Nó giúp tiết kiệm thời gian và rắc rối khi xây dựng dependency. Nó là một trong những cách đơn giản nhất để xuất bản bất kì project GitHub nào như một Maven dependency Bạn có thể kiểm tra Jitpack tại đây: Jitpack uses a custom terms of usage license. 1.2. Tiến trình và luồng 1.2.1 Tiến trình Process là quá trình hoạt động của một ứng dụng. Điều đó nghĩa là gì? Có thể lấy một ví dụ như sau, khi bạn click đúp chuột vào biểu tượng MS Word, một process chạy ứng dụng Word được khởi tạo. 1.2.2. Luồng Thread là một tiến trình đơn vị xử lý của máy tính có thể thực hiện một công việc riêng biệt. Trong Java các luồng được quản lý bởi máy ảo Java (JVM). Thread là một bước điều hành bên trong một process. Một process dĩ nhiên có thể chứa nhiều thread bên trong nó. Khi chúng ta chạy ứng dụng Word, hệ điều hành tạo ra một process và bắt đầu chạy các thread chính của process đó. Điểm quan trọng nhất cần chú ý là một thread có thể làm bất cứ nhiệm vụ gì một process có thể làm. Tuy nhiên, vì một process có thể chứa nhiều thread, mỗi thread có thể coi như là một process nhỏ. Vậy, điểm khác biệt mấu chốt giữa thread và process là công việc mỗi cái thường phải làm. Một điểm khác biệt nữa đó là nhiều thread nằm trong cùng một process dùng một không gian bộ nhớ giống nhau, trong khi process thì không. Điều này cho phép các thread đọc và viết cùng một kiểu cấu trúc và dữ liệu, giao tiếp dễ dàng giữa các thread với nhau. Giao thức giữa các process, hay còn gọi là IPC (interprocess communication) thì tương đối phức tạp bởi các dữ liệu có tính tập trung sâu hơn. 1.2.3. Lớp Hander Khi một tiến trình được tạo cho một ứng dụng, main thread của nó được dành riêng để chạy một message queue, queue này quản lý các đối tượng bậc cao của ứng dụng (activity, intent receiver, v.v..) và các cửa sổ mà chúng tạo ra. Ta có thể tạo các thead phụ, chúng tương tác với thread chính của ứng dụng qua một Handler. Khi ta tạo một Handler mới, nó được gắn với message queue của thread tạo ra nó – từ đó trở đi, nó sẽ gửi các message và các runnable tới message queue đó và thực thi chúng khi chúng ra khỏi message queue. Hai ứng dụng chính của Handler: xếp lịch cho các message và runnable cần được thực thi vào thời điểm nào đó trong tương tai và xếp hàng một action cần thực hiện tại một thread khác. Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 4 Một số phương thức hay dùng của Handler – Activity.runOnUiThread(Runnable) – View.post(Runnable) – View.postDelayed(Runnable, long) Có 2 cách tạo lớp Handler Tạo một lớp thread mới kế thừa từ lớp Thread public class NewThread extends Thread{ public void run() { print(“Hello”) } } Tạo một biến mới của lớp Thread với đối tượng Runnable Thread background = new Thread(new Runnable() { public void run() { print(“Hello”) } } Và để chạy bất kỳ một thread nào ta đều phải gọi phương thức start(); background.start() Ví dụ import android.os.Handler; Handler mHandler = new Handler(); // ... new Thread() { public void run() { // Instantiate XML parser mHandler.post (new Runnable() { public void run() { parsingStatus.setText (“Began Parsing...”); } }); // XML Parsing loop here // Update parsingStatus has needed mHandler.post (new Runnable() { public void run() { parsingStatus.setText (“Finished parsing...”); } }); } }.start(); public void onClick(View v) { new Thread(new Runnable() { public void run() { Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 5 // a potentially time consuming task final Bitmap bitmap = processBitMap("image.png"); mImageView.post(new Runnable() { public void run() { mImageView.setImageBitmap(bitmap); } }); } }).start(); } Bước 1: Tạo Project và thiết lập quyền cần thiết trong file app\Manifest\AndroidManifest.xml Bước 2: Thiết kế các giao diện cần thiết cho ứng dụng res\layout\*.xml <LinearLayout xmlns:android="" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ProgressBar android:id="@+id/progress" style="?android:attr/progressBarStyleHorizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" /> Bước 3: Xây dựng các lớp và các chức năng *.java import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.ProgressBar; public class HandlerDemo extends Activity { ProgressBar bar; Handler handler=new Handler() { @Override public void handleMessage(Message msg) { bar. incrementProgressBy(5); } }; boolean isRunning=false; @Override Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 6 public void onCreate(Bundle icicle) { super. onCreate(icicle); setContentView(R.layout.main); bar=(ProgressBar)findViewById(R.id.progress); } public void onStart() { super. onStart(); bar. setProgress(0); Thread background=new Thread(new Runnable() { public void run() { try { for (int i=0;i<20 && isRunning;i++) { Thread. sleep(1000); handler. sendMessage(handler. obtainMessage()); } } catch (Throwable t) { // just end the background thread } } }); isRunning=true; background. start(); } public void onStop() { super. onStop(); isRunning=false; } } 1.2.4. Giới thiệu đa luồng Multithread là khái niệm cho nhiều tiến trình chạy đồng thời. Một ứng dụng Java ngoài luồng chính có thể có các luồng khác thực thi đồng thời làm ứng dụng chạy nhanh và hiệu quả hơn. VD: Trong một game đánh nhau có 2 người chơi thì mỗi người chơi sẽ do 1 luồng quản lý. Các hoạt cảnh game có thể do một luồng khác quản lý. Làm cho game trở nên sinh động. Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 7 Hình 1. Hình ảnh mô phòng MultiThreading. Ưu điểm của đa luồng: Mỗi luồng có thể dùng chung và chia sẻ nguồn tài nguyên trong quá trình chạy, nhưng có thể thực hiện một cách độc lập. Ứng dụng trách nhiệm có thể được tách + Luồng chính chạy giao diện người dung + Các luồng phụ nhiệm gửi đến luồng chính. Luồng mang tính chất trừu tượng Một chương trình đa luồng hoạt động nhanh hơn trên máy tính có cấu hình tốt và mạnh * Nhược điểm của đa luồng: Càng nhiều luồng thì xử lý càng phức tạp Cần phát hiện tránh các luồng chết, luồng chạy mà không làm gì trong ứng dụng cả 1.3. AsyncTask 1.3.1. Tổng quan về lớp AsyncTask AsyncTask là 1 class hỗ trợ, cung cấp cơ chế thuận tiện để di chuyển những xử lý tốn thời gian vào những tiến trình chạy ngầm (background thread). Nó cung cấp các sự kiện xử lý đồng bộ, đưa ra kết quả khi tiến thành hoàn thành. AsyncTask bao gồm 1 tiến trình chạy ngầm và một UI cập nhật kết quả khi tiến trình kết thúc(theo “Professional Android 2 Application”) 1.3.2. Mô tả lớp AsyncTask Để tạo task bất đồng bộ này thì cần extend AsyncTask. Cần chỉ định một class thực hiện phương thức execute, với format sau: AsyncTask Nếu không muốn sử dụng tham số truyền vào, tiến độ update, hoặc kết quả trả về, sử dụng Void cho tất cả. Ví dụ: Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 8 Hình 2. Lớp kế thừa từ lớp AsyncTask Trong đó các hàm cần chú ý: – onPreExecute: hàm này sẽ chạy đầu tiên khi class được gọi. – doInBackground: đây là phương thức chạy background nên NÓ KHÔNG ĐƯỢC TƯƠNG TÁC VỚI OBJECT Ui (vd như set text cho textview hay showToast ở đây là không được). ở đây đặt phần code xử lý tốn thời gian vào, và sử dụng phương thức publishProgress để cho phép phương thức onProgressUpdate() update lên UI. Khi tiến trình này kết thúc, trả về kết quả cuối cùng cho xử lý onPostExecute. – onProgressUpdate: nhận các thông số thông qua phương thức publishProgress trong doInBackground. Phương thức này thì đồng bộ với UI đang chạy. – onPostExecute: là phương thức được gọi khi doInBackground hoàn thành. Giải thích cho ví dụ DownLoad: – Ta thực hiện một phương thức dowdload một tập tin. Bạn xử lý như sau: hiện lên một progress thông báo % của quá trình download, và hiển thì thông báo thành công khi hoàn thành download. Như vậy thì ở: – onPreExecute: sẽ hiển thị thanh progress đang ở 0%. – doInBackground: thực hiện download, trong này bạn xử lý để lấy được % download là n, bàn dùng phương thức publishProgress để truyền n ra ngoài. Chú ý là trong này bạn không thể update cái progress lên n% được được. – onProgressUpdate: nhận được n và bạn sẽ update cho progress lên n %. – onPostExecute: kết thúc download, hiện thị Toast thông báo download thành công. Hình 3. Mô hình làm việc AsyncTask Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 9 Hình 4. Thứ tự thực hiện các phương thức của lớp AsyncTask 1.3.3. Ứng dụng tải ảnh từ internet Bước 1: Tạo Project và thiết lập quyền cần thiết trong file app\Manifest\AndroidManifest.xml Bước 2: Thiết kế các giao diện cần thiết cho ứng dụng res\layout\*.xml <LinearLayout xmlns:android="" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Ảnh hiển thị" android:id="@+id/textView" /> <ImageView android:layout_width="200dp" android:layout_height="200dp" android:id="@+id/img" android:layout_gravity="center_horizontal" /> Bước 3: Xây dựng các lớp và các chức năng *.java import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ImageView; import com.google.android.gms.appindexing.Action; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.common.api.GoogleApiClient; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 10 public class MainActivity extends AppCompatActivity { ImageView img; String uri = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.httpconnection); img = (ImageView) findViewById(R.id.img); //Biến u lấy uri; URL(uri)fair nằm trong try catch // B3 Chạy loadImageFromInternet runOnUiThread(new Runnable() { @Override public void run() { // Gọi lớp loadImageFromInternet vừa Tạo trong B2 new loadImageFromInternet().execute(uri); } }); } // url, %tải về private class loadImageFromInternet extends AsyncTask { //doInBackground: Hàm chỉ hành động. VD này là hành động lấy hình từ internet @Override protected String doInBackground(String... params) { //Biến u lấy uri try { URL u = new URL(params[0]); Bitmap bm=BitmapFactory.decodeStream(u.openConnection().getInputStream()); img.setImageBitmap(bm); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } } } Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 11 1.3.4. Ứng dụng ProgressBar với AsyncTask Bước 1: Tạo ứng dụng vào thiết lập quyền truy cập internet Bước 2: Thiết kế giao diện main.xml <LinearLayout xmlns:android="" xmlns:tools="" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.nguyennghia.asynctaskworking.MainActivity"> <ProgressBar android:id="@+id/pb_counter" style="?android:attr/progressBarStyleHorizontal" android:indeterminate="false" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_message" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:layout_gravity="center" android:text="Start" android:id="@+id/btn_counter" android:layout_width="wrap_content" android:layout_height="wrap_content" /> Bước 3.1.Tạo lớp kế thừa từ AsyncTask class UpdateProgresBarTask extends AsyncTask{ @Override protected void onPreExecute() { super.onPreExecute(); tvMessage.setText("Update"); } @Override protected Void doInBackground(Integer... params) { int n = params[0]; for(int i = 0; i < n; i++) publishProgress(i); return null; } @Override protected void onProgressUpdate(Integer... values) { Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 12 super.onProgressUpdate(values); pbCounter.setProgress(values[0]); } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); tvMessage.setText("End"); btnCounter.setEnabled(true); } } Bước 3.2: Tạo lớp MainActivity.java package com.example.nguyennghia.asynctaskworking; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private ProgressBar pbCounter; private TextView tvMessage; private Button btnCounter; private static final int MAX = 100000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pbCounter = (ProgressBar)findViewById(R.id.pb_counter); pbCounter.setMax(MAX); tvMessage = (TextView)findViewById(R.id.tv_message); btnCounter = (Button)findViewById(R.id.btn_counter); btnCounter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new UpdateProgresBarTask().execute(MAX); btnCounter.setEnabled(false); } }); } Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 13 class UpdateProgresBarTask extends AsyncTask{ @Override protected void onPreExecute() { super.onPreExecute(); tvMessage.setText("Update"); } @Override protected Void doInBackground(Integer... params) { int n = params[0]; for(int i = 0; i < n; i++) publishProgress(i); return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); pbCounter.setProgress(values[0]); } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); tvMessage.setText("End"); btnCounter.setEnabled(true); } } } Chạy ứng dụng Hình 5. Kết quả ứng dụng ProgressBar Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 14 Bài 2 Tin nhắn 2.1. SmsManager 2.1.1. Giới thiệu SmsManager SmsManager là lớp giúp quản lý SMS như: gửi tin nhắn dữ liệu, text, phương thức dung để getDefault(). Stt. Phương thức & Miêu tả 1 ArrayList divideMessage(String text) Phương thức này phân chia một thông điệp text thành một số phần nhỏ, không lớn hơn kích cỡ thông điệp SMS tối đa 2 static SmsManager getDefault() Phương thức này được sử dụng để lấy instance mặc định của SmsManager 3 void sendDataMessage(String destinationAddress, String scAddress, short destinationPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) Phương thức này được sử dụng để gửi một dữ liệu dựa trên SMS tới một cổng (port) ứng dụng cụ thể 4 void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList parts, ArrayList sentIntents, ArrayList deliveryIntents) Gửi một text có nhiều phần dựa trên SMS 5 void sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) Gửi một text dựa tên SMS 2.1.2. Để thực hiện xây dựng ứng dụng với SmsManager qua các bước sau: Bước 1 Tạo project. Cấp quyền tương ứng trong AndroidManifest.xml của project, đặt dòng Bước 2 Thiết kế giao diện mainactivity.xml Cần có editText nhập số điện thoại; editText nhập nội dung tin nhắn ; buttons end để thực hiện hành động gửi tin nhắn đi trong send.xml Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 15 <LinearLayout xmlns:android="" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="SENDING SMS" android:textSize="40dp" /> <EditText android:id="@+id/edtPhone" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Nhập số điện thoại" android:inputType="phone" /> <EditText android:id="@+id/edtMessage" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Nhập tin nhắn" android:inputType="text" /> <Button android:id="@+id/btnSend1" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Send" /> Bước 3 Code Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 16 3.1 Import các package cần thiết cho việc gửi SMS import android.telephony.SmsManager; 3.2 Ra lệnh gửi SMS với số điện thoại là phoneNumber (String) và tin nhắn message (String) muốn gửi SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage("phoneNo", null, "sms message", null, null); Cụ thể trong MainActivity.java như sau package diepnh.sms; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.telephony.SmsManager; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity { Button btnsend1; EditText edtphone, edtmessage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sendsms); edtphone = (EditText) findViewById(R.id.edtPhone); edtmessage = (EditText) findViewById(R.id.edtMessage); btnsend1 = (Button) findViewById(R.id.btnSend1); btnsend1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendSMS(); } }); } protected void sendSMS() { String phone = edtphone.getText().toString(); String message = edtmessage.getText().toString(); try { Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 17 SmsManager manager = SmsManager.getDefault(); manager.sendTextMessage(phone, null, message, null, null); Toast.makeText(SendSMS.this, "SMS Succedded, ConGradulation!", Toast.LENGTH_SHORT).show(); setContentView(R.layout.sendsms); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(SendSMS.this, "SMS faild, please try again later.", Toast.LENGTH_SHORT).show(); } } } 2.2. Telephony 2.2.1. Giới thiệu Telephony Manager Telephony Manager cung cấp quyền truy cập vào thông tin về các dịch vụ điện thoại trên thiết bị. Ứng dụng có thể sử dụng các phương thức trong lớp này để xác định các dịch vụ điện thoại và các quốc gia, cũng như truy cập vào một số loại thông tin thuê bao. Ứng dụng cũng có thể đăng ký một người biết lắng nghe để nhận được thông báo của nhà nước thay đổi điện thoại. Lớp này không khởi tạo lớp này trực tiếp; thay vào đó, bạn lấy một tham chiếu đến một thể hiện qua Context.getSystemService (Context.TELEPHONY_SERVICE). 2.2.2. Thao tác với Telephony Manager Bước 1 Tạo project và cấp quyền tương ứng trong AndroidManifest.xml của project, đặt dòng Bước 2 Thiết kế giao diện activity_main.xml gồm TextView để hiển thị thong tin <RelativeLayout xmlns:android="" xmlns:tools="" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="diepnh.telephonemanagerdemo.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/TextViewphoneInfo" android:text="Thông tin:" /> Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 18 Accessing the Telephony Manager: TelephonyManager tm=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); package diepnh.telephonemanagerdemo; import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.telephony.TelephonyManager; import android.widget.TextView; public class MainActivity extends AppCompatActivity { TextView phoneInfo; String info = "Phone Details:\n"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); phoneInfo = (TextView) findViewById(R.id.TextViewphoneInfo); //Get the instance of TelephonyManager TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); //Calling the methods of TelephonyManager the returns the information String IMEINumber = tm.getDeviceId(); String subscriberID = tm.getDeviceId(); String SIMSerialNumber = tm.getSimSerialNumber(); String networkCountryISO = tm.getNetworkCountryIso(); String SIMCountryISO = tm.getSimCountryIso(); String softwareVersion = tm.getDeviceSoftwareVersion(); String voiceMailNumber = tm.getVoiceMailNumber(); //Get the phone type String strphoneType = ""; int phoneType = tm.getPhoneType(); switch (phoneType) { case (TelephonyManager.PHONE_TYPE_CDMA): strphoneType = "CDMA"; break; Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 19 case (TelephonyManager.PHONE_TYPE_GSM): strphoneType = "GSM"; break; case (TelephonyManager.PHONE_TYPE_NONE): strphoneType = "NONE"; break; } //getting information if phone is in roaming boolean isRoaming = tm.isNetworkRoaming(); info += "\n IMEI Number:" + IMEINumber; info += "\n SubscriberID:" + subscriberID; info += "\n Sim Serial Number:" + SIMSerialNumber; info += "\n Network Country ISO:" + networkCountryISO; info += "\n SIM Country ISO:" + SIMCountryISO; info += "\n Software Version:" + softwareVersion; info += "\n Voice Mail Number:" + voiceMailNumber; info += "\n Phone Network Type:" + strphoneType; info += "\n In Roaming?: " + isRoaming; phoneInfo.setText(info); } } 2.3. Intent 2.3.1. Định nghĩa Intent mang dữ liệu từ một thành phần tới thành phần khác bên trong ứng dụng hoặc bên ngoài ứng dụng. Đối tượng Intent, là một cấu trúc dữ liệu thụ động giữ một miêu tả trừu tượng của một hành động để được thực hiện. Intent trong Android là một miêu tả trừu tượng của một hoạt động để được thực hiện. Nó có thể được sử dụng với startActivity để chạy một Activity, broadcastIntent để gửi nó tới bất kỳ thành phần BroadcastReceiver nào quan tâm đến, và vớistartService(Intent)hoặc bindService(Intent, ServiceConnection, int) để giao tiếp với một Service ở Background. 2.3.2. Phương thức và mô tả Intent Stt Phương thức & Miêu tả 1 Context.startActivity() Đối tượng Intent được truyền tới phương thức này để chạy một Activity mới hoặc lấy một Activity đang tồn tại để làm cái gì đó mới 2 Context.startService() Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 20 Đối tượng Intent được truyền tới phương thức này để khởi tạo một Service hoặc phân phối các chỉ thị mới tới một Service đang chạy 3 Context.sendBroadcast() Đối tượng Intent được truyền tới phương thức này để phân phối thông báo tới tất cả BroadcastReceiver cần quan tâm 2.3.3. Thao tác với intent Bước 1: Import các package cần thiết cho việc gửi SMS import android.telephony.SmsManager; Bước 1: Khởi động một ứng dụng SMS được cài đặt trên thiết bị Android Intent IntentDemo = new Intent(Intent.ACTION_VIEW); Bước 2: Xác định phương thức và kiểu dữ liệu gửi: smsto: dạng URI sử dụng phương thức setData() và kiểu dữ liệu sẽ là vnd.android-dir/mms-sms sử dụng phương thức setType(), smsIntent.setData(Uri.parse("smsto:")); smsIntent.setType("vnd.android-dir/mms-sms"); Bước 3: putExtra()các thành phần tương ứng Ví dụ với gửi SMS smsIntent.putExtra("address", phone); smsIntent.putExtra("sms_body", message); Hay Ví dụ với gửi email Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); email.putExtra(Intent.EXTRA_EMAIL, recipients); email.putExtra(Intent.EXTRA_SUBJECT, subject.getText().toString()); email.putExtra(Intent.EXTRA_TEXT, body.getText().toString()); startActivity(Intent.createChooser(email, "Choose an email client from...")); Bước 4: Thực thi và hiển thị thông báo startActivity(smsIntent); 2.4. BroadcastReceiver 2.4.1. Giới thiệu về Broadcast Receiver Broadcast Receiver phản hồi các thông báo phát ra từ các ứng dụng khác hoặc từ chính hệ thống. Những thông báo này đôi khi được gọi là các event hoặc intent. Ví dụ, các ứng dụng cũng có thể khởi tạo các tín hiệu broadcast để thông báo cho ứng dụng khác biết rằng một số dữ liệu đã được về tới thiết vị và là có sẵn cho chúng để sử dụng, vì thế Broadcast Receiver thông dịch thông tin đó và khởi tạo hành động thích hợp. Một ứng dụng nghe các Intent được phát ra cụ thể bằng cách đăng ký một Broadcast Receiver trong AndroidManifest.xml file. Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 21 Hình 6. Hoạt động Broadcast Receiver BROADCAST-RECEIVER BroadcastReceiver có nhiệm vụ nhận, lọc các tín hiệu và thông báo. Một số system event được định nghĩa là là các trường final static trong lớp Intent. Bảng dưới liệt kê một số system event quan trọng: Event Miêu tả android.intent.action.BATTERY_CHANGED Thông báo này chứa trạng thái nạp, mức độ, và thông tin khác về pin android.intent.action.BATTERY_LOW Chỉ trạng thái low battery trên thiết bị android.intent.action.BATTERY_OKAY Chỉ rằng pin bây giờ là tốt sau khi low battery android.intent.action.BOOT_COMPLETED Đây là tín hiệu broadcast thông báo sau khi hệ thống đã kết thúc boot android.intent.action.BUG_REPORT Chỉ activity để báo cáo một bug android.intent.action.CALL Thông báo một lời gọi tới ai đó được xác định bởi dữ liệu android.intent.action.CALL_BUTTON Người dùng nhấn nút call để tới Dialer (trình gọi điện) hoặc giao diện UI thích hợp khác để tạo một cuộc gọi android.intent.action.DATE_CHANGED Date đã được thay đổi android.intent.action.REBOOT Reboot thiết bị 2.4.2. Ứng dụng thông báo thay đổi trạng thái wifi Với ứng dụng này, bất cứ khi nào trạng thái wifi của thiết bị Android thay đổi, thì thiết bị sẽ nhận được thông báo nhận bởi MyReceiver và trình triển khai logic bên trong phương thức onReceive() sẽ được thực thi. Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 22 Bước 1: Tạo Project. Tạo lớp MyBroadCast kế thừa thừ lớp BroadcastReceiver. Tạo phương thức onReceive() thông báo thay đổi trạng thái wifi public class MyBroadCast extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"Trạng thái wifi đã thay đổi", Toast.LENGTH_SHORT).show(); } } Bước 2: Khai báo cặp thẻ receiver trong AndroidManifest.xml để gọi tới MyBroadCast Lọc các action theo yêu cầu là lọc trạng thái wifi thay đổi. <manifest xmlns:android="" package="diepnh.broadcast_demo"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> 2.4.3. Ví dụ ứng dụng BroadCast tự định nghĩa Bước 1: Tạo Project. Tạo lớp MyBroadCastReceived kế thừa thừ lớp BroadcastReceiver. Tạo phương thức onReceive() thông báo thay đổi trạng thái wifi public class MyBroadCastReceived extends BroadcastReceiver { @Override Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 23 public void onReceive(Context context, Intent intent) { String IntentData=intent.getStringExtra("CD3"); Toast.makeText(context,"Dữ liệu nhận tu BroadCastReceived: "+IntentData,Toast.LENGTH_LONG).show(); } } Bước 2: code Truyền kết quả Intent Bước 2.1; Khái báo Intent Intent it=new Intent(); Bước 2.2: Định nghĩa 1 hành động cho MyBroadCastReceived, sẽ lọc trong manifest it.setAction("Com.MyBroadCastReceived.Demo"); Bước 2.3: putExtra key . value it.putExtra("CD3","Hello TK125"); Bước 2.4: Đăng ký hành động cho MyBroadCastReceived với sendsendBroadcast, chú ý truyền vào Intent sendBroadcast(it); public class MainActivity extends AppCompatActivity { Button btnsendBroadCast; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnsendBroadCast = (Button) findViewById(R.id.btnBroadCast); btnsendBroadCast.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent it=new Intent(); // Định nghĩa 1 hành động cho MyBroadCastReceived, sẽ lọc trong manifest it.setAction("Com.MyBroadCastReceived.Demo"); // putExtra key . value it.putExtra("CD3","Hello TK125"); // Đăng ký hành động cho MyBroadCastReceived với sendsendBroadcast, chú ý truyền vào Intent sendBroadcast(it); } }); } } Bước 3: Khai báo cặp thẻ receiver trong AndroidManifest.xml để gọi tới MyBroadCast Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 24 Trong đó: MyBroadCastReceived tên lớp con kế thừa BroadCastReceived Com.MyBroadCastReceived.Demo là hành động cho MyBroadCastReceived được khai báo tương ứng hành động Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 25 Bài 3 Thư điện tử Thư điện tử (Email) là thông điệp được phân phối bằng phương tiện điện tử từ người dùng một hệ thống với một hoặc nhiều người nhận thông qua một mạng lưới. Trước khi bắt đầu Email Activity, Bạn phải biết chức năng email với mục đích, ý định là mang dữ liệu từ một thành phần để thành phần khác có trong các ứng dụng hoặc bên ngoài ứng dụng khi lập trình android. 3.1. Gửi email Để gửi một email từ ứng dụng của bạn, bạn không cần phải thực hiện một ứng dụng email từ đầu, nhưng bạn có thể sử dụng một trong hiện tại như các ứng dụng mặc định Email được cung cấp từ Android, Gmail, Outlook, K–9 Mail vv . Đối với điều này mục đích, chúng ta cần phải viết một hoạt động mà ra mắt một ứng dụng email, sử dụng một Intent ngầm với các hành động đúng và dữ liệu. Trong ví dụ này, chúng tôi sẽ gửi một email từ ứng dụng của chúng tôi bằng cách sử dụng một đối tượng Intent mà ra mắtkhách hàng email hiện có. 3.1.1. Intent Object – Những hỗ trợ để sử dụng tính năng Email Android đã được xây dựng trong hỗ trợ thêm TO, SUBJECT, CC, TEXT vv lĩnh vực mà có thể được gắn vào các mục đích trước khi gửi ý định một khách hàng mục tiêu email. Bạn có thể sử dụng sau trường bổ sung trong email của bạn. STTExtra Data & Description 1 EXTRA_BCC Chuỗi String [] gửi đến địa chỉ e-mail mà trong blind carbon copy. 2 EXTRA_CC Chuỗi String [] gửi đến địa chỉ e-mail mà trong carbon copy. 3 EXTRA_EMAIL Chuỗi String [] gửi đến địa chỉ e-mail trong hộp thư đến. 4 EXTRA_HTML_TEXT Chuỗi liên tục đó là liên kết với Intent, sử dụng ACTION_SEND để cung cấp một thay thế cho EXTRA_TEXT nhưHTML . 5 EXTRA_SUBJECT 6 EXTRA_TEXT Một CharSequence không đổi đó là liên kết với Intent, sử dụng với ACTION_SEND để cung cấp các dữ liệu theo nghĩa đen được gửi tới. 7 EXTRA_TITLE Một tiêu đề hộp thoại CharSequence để cung cấp cho người dùng khi sử dụng với một ACTION_CHOOSER. Giống như tin nhắn SMS, Android cũng hỗ trợ e-mail. Các ứng dụng Gmail/Email trên Android cho phép bạn cấu hình một tài khoản e-mail POP3 hoặc IMAP. Bên cạnh việc gửi và nhận e-mail bằng cách sử dụng ứng dụng Gmail/Email, bạn cũng có thể gửi tin nhắn e- mail lập trình từ bên trong ứng dụng Android Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 26 3.1.2. Intent ứng dụng trong gửi email Phần sau đây giải thích các phần khác nhau của các đối tượng Intent của chúng tôi yêu cầu để gửi một email. 1. Intent Object – Gửi Email Intent emailIntent = new Intent(Intent.ACTION_SEND); 2. Intent Object – Thiết lập Data/Type để gửi Email Để gửi một email, bạn cần phải xác định mailto: như URI sử dụng phương thức SetData () và kiểu dữ liệu sẽ được để text/plain sử dụng phương thức setType () như sau: emailIntent.setData(Uri.parse("mailto:")); emailIntent.setType("text/plain"); putExtra() các thành phần email emailIntent.putExtra() 3. Intent Object – Những hỗ trợ để sử dụng tính năng Email Android đã được xây dựng trong hỗ trợ thêm TO, SUBJECT, CC, TEXT vv lĩnh vực mà có thể được gắn vào các mục đích trước khi gửi ý định một khách hàng mục tiêu email. Bạn có thể sử dụng sau trường bổ sung trong email của bạn 3.2. Gmail API API Gmail là một dịch vụ web nó sử dụng API RESTful với tải trọng JSON Thư và nhãn là các đơn vị cơ bản của một hộp thư. Bản nháp, lịch sử và chủ đề đều chứa một hoặc nhiều thư có siêu dữ liệu bổ sung. Thông điệp không thay đổi: chúng chỉ có thể được tạo và xóa. Không có thuộc tính thông báo nào có thể được thay đổi ngoài các nhãn được áp dụng cho một thông báo nhất định. Nhãn là phương tiện chính để phân loại và tổ chức các thư và chủ đề. Nhãn có mối quan hệ nhiều đến nhiều với tin nhắn và chủ đề: một tin nhắn có thể có nhiều nhãn được áp dụng cho một nhãn và một nhãn có thể được áp dụng cho nhiều bài viết hoặc chủ đề. Nhãn cũng có hai loại: hệ thống và người sử dụng. Nhãn hệ thống, chẳng hạn như INBOX, TRASH, hoặc SPAM, được tạo nội bộ và không thể được tạo, xóa hoặc sửa đổi. Tuy nhiên, một số nhãn hệ thống, chẳng hạn như INBOX, có thể được áp dụng cho hoặc loại bỏ khỏi tin nhắn và chủ đề. Nhãn người dùng có thể được thêm, xóa, hoặc sửa đổi bởi người sử dụng hoặc ứng dụng. Các bản nháp đại diện cho các thư chưa gửi. Bản thân các thông điệp không thể được sửa đổi khi đã được tạo, nhưng tin nhắn có trong bản nháp có thể được thay thế. Gửi bản nháp sẽ tự động xóa bản nháp và tạo một thư với nhãn hệ thống SENT. Lịch sử là tập hợp các thư được sửa đổi gần đây theo thứ tự thời gian. Mặc dù lịch sử được dự định là một phương pháp đồng bộ hoá một máy khách nhẹ, thông thường nó chỉ chứa các bản ghi các thay đổi trong vòng 30 ngày vừa qua. Trong một số trường hợp, chẳng hạn như khi khách hàng trở nên quá lỗi thời, khách hàng nên đồng bộ hoá theo cách thủ công. Chủ đề là tập hợp các thư đại diện cho một cuộc trò chuyện. Giống như tin nhắn, chủ đề cũng có thể có nhãn áp dụng cho chúng. Tuy nhiên, không giống như các tin nhắn, chủ đề không thể được tạo, chỉ xóa. Thông điệp có thể được đưa vào một chủ đề. Cài đặt kiểm soát tính năng của Gmail hoạt động như thế nào cho người dùng. Cài đặt khả dụng cho truy cập POP và IMAP, chuyển tiếp email, bộ lọc, tự động trả lời kỳ nghỉ, gửi bí danh và chữ ký. Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 27 3.3. Một số chức năng của email 3.3.1. Xem email public class EmailinboxActivity extends Activity { /** Called when the activity is first created. */ EmailManager emailManager; private String stmpHost = "smtp.gmail.com"; private String mailServer = "imap.gmail.com"; public String urlServer = "gmail.com"; public String username = " Any Gmail Username"; public String password = " Any Gmail Password"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); emailManager=new EmailManager(username, password, urlServer, stmpHost, mailServer); try { // emailManager.getInboxMails(); emailManager.close(); } catch (MessagingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public class ByteArrayDataSource implements DataSource { private byte[] data; private String type; public ByteArrayDataSource(byte[] data, String type) { super(); this.data = data; this.type = type; } public ByteArrayDataSource(byte[] data) { super(); this.data = data; } public void setType(String type) { this.type = type; } public String getContentType() { if (type == null) return "application/octet-stream"; else return type; Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 28 } public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(data); } public String getName() { return "ByteArrayDataSource"; } public OutputStream getOutputStream() throws IOException { throw new IOException("Not Supported"); } } public class EmailAccount { public String urlServer = "gmail.com"; public String username = "username"; public String password = "password"; public String emailAddress; public EmailAccount(String username, String password, String urlServer) { this.username = username; this.password = password; this.urlServer = urlServer; this.emailAddress = username + "@" + urlServer; } } public class EmailAuthenticator extends Authenticator { private EmailAccount account; public EmailAuthenticator(EmailAccount account) { super(); this.account = account; } protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(account.emailAddress, account.password); } } 3.3.2 Tạo thư nháp Ứng dụng có thể tạo các bản nháp bằng cách sử dụng phương thức create.draft. theo các bước sau Tạo mẩu tin MIME, mẩu tin được dịch bởi RFC 2822. Chuyển đổ tin nhắn thành 1 xâu mã hóa base64url Tạo tin nháp, thiết lập giá trị của trường drafts.message.raw thành xâu mã Bước 1: Tạo thư điện tử đơn giản với lớp MimeMessage trong gói javax.mail.internet. /** * Create a MimeMessage using the parameters provided. * * @param to email address of the receiver * @param from email address of the sender, the mailbox account Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 29 * @param subject subject of the email * @param bodyText body text of the email * @return the MimeMessage to be used to send email * @throws MessagingException */ public static MimeMessage createEmail(String to, String from, String subject, String bodyText) throws MessagingException { Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); MimeMessage email = new MimeMessage(session); email.setFrom(new InternetAddress(from)); email.addRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress(to)); email.setSubject(subject); email.setText(bodyText); return email; } Bước 2: Mã hóa the MimeMessage, Khởi tạo 1 đối tượng Message, và thiết lập giá trị xâu mã hóa theo base64url như giá trị của thuộc tính raw /** * Create a message from an email. * * @param emailContent Email to be set to raw of message * @return a message containing a base64url encoded email * @throws IOException * @throws MessagingException */ public static Message createMessageWithEmail(MimeMessage emailContent) throws MessagingException, IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); emailContent.writeTo(buffer); byte[] bytes = buffer.toByteArray(); String encodedEmail = Base63.encodeBase64URLSafeString(bytes); Message message = new Message(); message.setRaw(encodedEmail); return message; } Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 30 Once you have a created a Message, you can create a Draft object and pass it to the drafts.create method. /** * Create draft email. * * @param service an authorized Gmail API instance * @param userId user's email address. The special value "me" * can be used to indicate the authenticated user * @param emailContent the MimeMessage used as email within the draft * @return the created draft * @throws MessagingException * @throws IOException */ public static Draft createDraft(Gmail service, String userId, MimeMessage emailContent) throws MessagingException, IOException { Message message = createMessageWithEmail(emailContent); Draft draft = new Draft(); draft.setMessage(message); draft = service.users().drafts().create(userId, draft).execute(); System.out.println("Draft id: " + draft.getId()); System.out.println(draft.toPrettyString()); return draft; } 3.3.3 Cập nhật thư rác Thật là đơn giản để tạo 1 thư nháp. Để cập nhật 1 thư nháp ta phải cung cấp 1 nguồn Draft trong yêu cầu với trường draft.message.raw Ta có thể lấy thư MIME được chứa trong draft bởi lời gọi drafts.get với tham số format=raw. Tham khảo thêm drafts.update. 3.3.4 Gửi thư rác Khi gửi 1 thư nháp, ta có thể chọn để gửi thư như hoặc gửi thư nháp cập nhật. Nếu ta cập nhật nội dung thư nháp với 1 thư mới. Hỗ trợ nguồn thư nháp trong than củalời gọi drafts.send; thiết lập draft.id của thư nháp được gửi và thiết lập trường draft.message.raw thành thư đã mã hóa thành xâu mã theo base64url Tham khảo thêm drafts.send. Thao khảo thêm https://developers.google.com/gmail/api/guides https://www.youtube.com/watch?v=MitDYGsxnaE Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 31 Bài 4 Ứng dụng tin nhắn và ứng dụng thư điện tử 4.1. Tổng hợp kiến thức liên quan Nhận tin nhắn dung lớp BroadcastReceiver để nghe các tin nhắn SMS. Khi một tin nhắn SMS được nhận, phương pháp onReceive() là fired. Các tin nhắn SMS được chứa trong đối tượng Intent (Itent; tham số thứ hai trong phương pháp onReceive()) thông qua một đối tượng Bundle. Các tin nhắn được lưu trữ trong một mảng Object trong định dạng PDU. Để trích xuất mỗi tin nhắn, bạn sử dụng các phương pháp createFromPdu() tĩnh từ lớp SmsMessage. Các tin nhắn SMS sẽ được hiển thị bằng cách sử dụng lớp Toast. Các số điện thoại của người gửi là thu được thông qua phương pháp getOriginatingAddress() . Một đặc điểm thú vị của BroadcastReceiver mà bạn có thể tiếp tục lắng nghe các tin nhắn SMS ngay cả khi ứng dụng không chạy; miễn là các ứng dụng được cài đặt trên thiết bị, bất kỳ tin nhắn SMS sẽ được nhận bởi các ứng dụng. 4.2. Ứng dụng tin nhắn SMS Yêu cầu: tin nhắn SMS được nhận tự động, hiển thị Hướng dẫn: Gửi tin nhắn dung 1 trong 2 cách (bài trước) Trong Android, có thể sử dụng SmsManager API hoặc các thiết bị xây dựng sẵn ứng dụng tin nhắn (SMS) để gửi SMS. Để thực hiện xây dựng ứng dụng Gửi SMS qua các bước sau: Bước 1 Tạo project Cấp quyền tương ứng trong AndroidManifest.xml của project, đặt dòng <manifest xmlns:android="" package="diepnh.sms"> Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 32 <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> Bước 2 Thiết kế giao diện Cần có editText nhập số điện thoại; editText nhập nội dung tin nhắn ; button send để thực hiện hành động gửi tin nhắn đi trong sendsms.xml sendsms.xml <LinearLayout xmlns:android="" android:layout_width="match_parent" android:layout_height="match_parent" Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 33 android:orientation="vertical"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="SENDING SMS" android:textSize="40dp" /> <EditText android:id="@+id/edtPhone" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Nhập số điện thoại" android:inputType="phone" /> <EditText android:id="@+id/edtMessage" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Nhập tin nhắn" android:inputType="text" /> <Button android:id="@+id/btnSend1" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Send" /> <Button android:id="@+id/btnSend2" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_gravity="center" android:text="send intent" /> Thiết kế giao diện receivesms.xml Layout này có thể ko cần. Nếu thiết kế thì như sau: Cần có Text hiển thị số điện thoại và nội dung SMS; button receive SMS để thực hiện hành động lọc SMS nhận về điện thoại và hiển thị trong receiveSMS.xml <LinearLayout xmlns:android="" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textView" Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 34 android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="RECEIVING SMS" android:textSize="40dp" /> <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="received SMS" /> <TextView android:id="@+id/txtMessage" android:layout_width="match_parent" android:layout_height="100dp" android:inputType="text" /> Giao diện activity_main.xml <LinearLayout xmlns:android="" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="SENDING/RECEIVING SMS" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20dp" android:gravity="center" android:id="@+id/textView" /> <Button android:text="Send" android:layout_width="100dp" android:layout_gravity="center" android:layout_height="wrap_content" android:id="@+id/btnSend" /> <Button android:text="Receive" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnReceive" /> Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 35 Bước 3 Code Bước 3.1 sendSMS.java như sau: package diepnh.sms; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.telephony.SmsManager; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class SendSMS extends AppCompatActivity { Button btnsend1, btnsend2; EditText edtphone, edtmessage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sendsms); edtphone = (EditText) findViewById(R.id.edtPhone); edtmessage = (EditText) findViewById(R.id.edtMessage); btnsend1 = (Button) findViewById(R.id.btnSend1); btnsend1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendSMS(); } }); btnsend2 = (Button) findViewById(R.id.btnSend2); btnsend2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendSMS_Intent(); } }); } protected void sendSMS() { String phone = edtphone.getText().toString(); String message = edtmessage.getText().toString(); try { Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 36 SmsManager manager = SmsManager.getDefault(); manager.sendTextMessage(phone, null, message, null, null); Toast.makeText(SendSMS.this, "SMS Succedded, ConGradulation!", Toast.LENGTH_SHORT).show(); setContentView(R.layout.sendsms); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(SendSMS.this, "SMS faild, please try again later.", Toast.LENGTH_SHORT).show(); } } protected void sendSMS_Intent() { String phone = edtphone.getText().toString(); String message = edtmessage.getText().toString(); try { // B1.khởi động một ứng dụng SMS được cài đặt trên thiết bị Android Intent smsIntent = new Intent(Intent.ACTION_VIEW); // Invokes only SMS/MMS clients // B2.Data/Type gửi bằng SMS smsIntent.setData(Uri.parse("smsto:")); smsIntent.setType("vnd.android-dir/mms-sms"); // B3.Extra trong SMS smsIntent.putExtra("address", phone); smsIntent.putExtra("sms_body", message); // B4. Shoot! startActivity(smsIntent); Toast.makeText(SendSMS.this, "SMS Succedded, ConGradulation!", Toast.LENGTH_SHORT).show(); setContentView(R.layout.sendsms); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(SendSMS.this, "SMS faild, please try again later.", Toast.LENGTH_SHORT).show(); } } } Bước 3.2: Cách 1 Khai báo BroadcastReceiver và IntentFilter trong androidManifest.xml Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 37 Sau đó tạo lớp SMSBroadCastReceive kế thừa thừ lớp BroadcastReceiver như sau: package diepnh.sms; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.telephony.SmsManager; import android.telephony.SmsMessage; import android.view.LayoutInflater; import android.widget.Toast; public class SMSBroadCastReceived extends BroadcastReceiver { final SmsManager msgs = SmsManager.getDefault(); String str = "Tin nhắn nhận: "; static int id = 1; @Override public void onReceive(Context context, Intent intent) { //—get the SMS message passed in— Bundle bundle = intent.getExtras(); try { if (bundle != null) { //—retrieve the SMS message received— // một mảng Object trong định dạng PDU lưu các tin nhắn final Object[] MessageContent = (Object[]) bundle.get("pdus"); // SmsMessage msgs = new SmsMessage[MessageContent.length]; for (int i = 0; i < MessageContent.length; i++) { // trích xuất mỗi tin nhắn SmsMessage newSMS = SmsMessage.createFromPdu((byte[]) MessageContent[i]); // Các số điện thoại của người gửi là thu được str += "SMS from " + newSMS.getOriginatingAddress(); str += ": "; // Nội dung tin nhắn str += newSMS.getMessageBody().toString(); str += "\n"; id++; } //—display the new SMS message—Các tin nhắn SMS sẽ được hiển thị bằng cách sử dụng lớp Toast Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 38 Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); AlertDialog.Builder al = new AlertDialog.Builder(context); al.setTitle("Tin nhắn nhận:"); al.setMessage(str); al.create(); al.setView(R.layout.receivesms); al.show(); } else Toast.makeText(context, "ko có Tin nhắn mới", Toast.LENGTH_LONG).show(); } catch (Exception ex) { } } } Bước 3.2: Cách 2 Khai báo BroadcastReceiver và IntentFilter trong ReceiveSMS.java UD chỉ chạy khi mở Ứng dụng thì sẽ như sau: package diepnh.sms; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.telephony.SmsMessage; import android.widget.TextView; /** * Created by DiepNH on 12-02-2017. */ public class ReceivedSMS extends AppCompatActivity { BroadcastReceiver receiver = null; TextView mes; String str=""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.receivesms); mes=(TextView)findViewById(R.id.txtMessage) ; // Lọc SMS_RECEIVED viết trong UD, UD đóng thì dừng IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 39 receiver =new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); // một mảng Object trong định dạng PDU lưu các tin nhắn final Object[] MessageContent = (Object[]) bundle.get("pdus"); // SmsMessage msgs = new SmsMessage[MessageContent.length]; for (int i = 0; i < MessageContent.length; i++) { // trích xuất mỗi tin nhắn SmsMessage newSMS = SmsMessage.createFromPdu((byte[]) MessageContent[i]); // Các số điện thoại của người gửi là thu được String smsnumber=newSMS.getDisplayOriginatingAddress().toString(); // Nội dung tin nhắn String smsbody=newSMS.getMessageBody().toString(); str += "SMS from " + smsnumber;// newSMS.getOriginatingAddress(); str += "\nBodySMS: "+smsbody+"\n"; mes.setText(str); } }}; registerReceiver(receiver,filter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); } } Bước 3.3: Cuối cùng ta có MainActivity.java package diepnh.sms; import android.content.Intent; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.telephony.SmsManager; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 40 public class MainActivity extends AppCompatActivity { Button btnsend, btnreceive; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnsend= (Button) findViewById(R.id.btnSend); btnsend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent it=new Intent(MainActivity.this,SendSMS.class); startActivity(it); } }); btnreceive = (Button) findViewById(R.id.btnReceive); btnreceive.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent it=new Intent(MainActivity.this,ReceiveSMS.class); startActivity(it); } }); } } 4.3. Ứng dụng thư điện tử Yêu cầu: Xây dựng ứng dụng gửi và nhận email Bước 1: Tạo Project và thiết lập permission trong manifest.xml Bước 2: THiết kế giao diện Soạn và gửi thư compose.xml Hòm thư nhận về inbox.xml Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 41 Bước 3 Sử dụng Intent package diepnh.sentemail_intent; import android.content.Intent; import android.net.Uri; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends AppCompatActivity { Button btnsend, btndelete; // FloatingActionButton fbtnsend; EditText edtRecepient, edtSubject, edtMessage; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.compose); edtRecepient = (EditText) findViewById(R.id.edtRecepient); edtSubject = (EditText) findViewById(R.id.edtSubject); edtMessage = (EditText) findViewById(R.id.edtMessage); btnsend = (Button) findViewById(R.id.btnSend); btnsend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SendEmail(); } }); btnsend = (Button) findViewById(R.id.btnSend); btnsend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SendEmail(); } }); } protected void SendEmail() { // Khai báo đối tượng emailIntent với hành động gửi Intent emailIntent = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); // Thiết lập dữ liệu và kiểu emailIntent.setData(Uri.parse("mailto:")); emailIntent.setType("message/rfc822"); String[] receivers = edtRecepient.getText().toString().split(";"); Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 42 emailIntent.putExtra(Intent.EXTRA_EMAIL, receivers); emailIntent.putExtra(Intent.EXTRA_SUBJECT, edtSubject.getText().toString()); emailIntent.putExtra(Intent.EXTRA_TEXT, edtMessage.getText().toString()); // run startActivity(emailIntent); startActivity(Intent.createChooser(emailIntent, "send email")); finish(); } } Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 43 Bài 5 Một số dịch vụ trên google 5.1. Giới thiệu Google service API là viết tắt của Application Programming Interface (giao diện lập trình ứng dụng). Nó là 1 giao tiếp phần mềm được dùng bởi các ứng dụng khác nhau. Cũng giống như bàn phím là một thiết bị giao tiếp giữa ngườI dùng và máy tính, API là 1 giao tiếp phần mếm chẳng hạn như giữa chương trình và hệ điều hành (HĐH). Google APIs is a set of application programming interfaces (APIs) developed by Google which allow communication with Google Services and their integration to other services. Examples of these include Search, Gmail, Translate or Google Maps. Third-party apps can use these APIs to take advantage of or extend the functionality of the existing services. The APIs provide functionality like analytics, machine learning as a service (the Prediction API) or access to user data (when permission to read the data is given). Another important example is an embedded Google map on a website, which can be achieved using the Static maps API,[1] Places API[2] or Google Earth API Usage of some of the APIs requires authentication and authorization using the OAuth 2.0 protocol. OAuth 2.0 is a simple protocol. To start, it is necessary to obtain credentials from the Developers Console. Then the client app can request an access token from the Google Authorization Server, and uses that token for authorization when accessing a Google API service 5.2. Google Map Service Google Map Service là một dịch vụ ứng dụng vào công nghệ bản đồ trực tuyến trên web miễn phí được cung cấp bởi Google, hỗ trợ nhiều dịch vụ khác của Google đặc biệt là dò đường và chỉ đường; hiển thị bản đồ đường sá, các tuyến đường tối ưu cho từng loại phương tiện, cách bắt xe và chuyển tuyến cho các loại phương tiện công cộng (xe bus, xe khách ...), và những địa điểm (kinh doanh, trường học, bệnh viện, cây ATM...) trong khu vực cũng như khắp nơi trên thế giới. Map API là một phương thức cho phép 1 website B sử dụng dịch vụ bản đồ của website A (gọi là Map API) và nhúng vào website của mình (site B). Site A ở đây là google map, site B là các website cá nhân hoặc tổ chức muốn sử dụng dịch vụ của google (di chuột, room, đánh dấu trên bản đồ) Google Maps Android API (viết tắt: GMAA) hỗ trợ các thao tác với giao diện đồ họa của bản đồ bao gồm: • Vẽ biểu tượng trên bản đồ (Marker). • Đồ họa đường thẳng (Polylines). • Đồ họa hình đa giác (Polygons). • Bitmap trên bản đồ (Ground & Tile Overlay). Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 44 MAP_TYPE_NORMAL MAP_TYPE_HYBRID MAP_TYPE_NONE MAP_TYPE_SATELLITE MAP_TYPE_TERRAIN Hình 7. Các kiểu giao diện hiển thị bản đồ mà Google Maps cung cấp Bài tập thực hành CĐ3: Lập trình dịch vụ mạng trên Android Bộ môn Công nghệ Phân mềm khoa Công nghệ Thông tin Trang 45 Các kiểu này ta có thể dùng coding để thay đổi kiểu hiển thị thông qua hàm: setMapType(int). - Ta có thể thiết lập các giá trị ban đầu và điều khiển cho Google Maps bao gồm: • Góc nhìn (Camera) • Thu phóng (zoom) • Chuyển điểm (location) • Xoay (bearing) • Góc nghiêng (titl) • La bàn và điều khiển thu phóng. • Các điều khiển cử chỉ trên bản đồ. Ứng dụng của bạn có thành phần bản đồ, dữ liệu bản đồ nằm tại trung tâm dữ liệu của Google, vì vậy ứng dụng của bạn liên tục truy xuất dữ liệu bản đồ thông qua một dịch vụ Dữ liệu bản đồ Google được cung cấp miễn phí, nhưng cần phải có một API Key, nó giống như một giấy giới thiệu (Credentials) để truy cập dữ liệu bản đồ. Hình 8. API key và google service 5.2.1. Một số ứng dụng của Google Map API  Đánh dấu các địa điểm trên bản đồ kèm theo thông tin cho địa điểm đó: khu vui chơi giải trí, nhà hàng khách sạn, cây A

Các file đính kèm theo tài liệu này:

  • pdf01200001_1903_1983546.pdf