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 ............
190 trang |
Chia sẻ: putihuynh11 | Lượt xem: 526 | Lượt tải: 0
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:
- 01200001_1903_1983546.pdf