Report

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
Viện Công nghệ Thông tin và Truyền thông

Báo cáo môn
Phát triển ứng dụng trên các thiết bị di động
Đề tài Xây dựng ứng dụng xem dự báo thời tiết
trên hệ điều hành Android

Sinh viên thực hiện: Hoàng Văn Phi

MSSV: 20156227

Nguyễn Anh Tuấn MSSV: 20156760

Hà Nội 05/2019

Danh mục hình vẽ

Mục lục

CHƯƠNG 1. TỔNG QUAN ĐỀ TÀI

1.1. Giới thiệu chung
Ngày nay cùng với sự phát triển không ngừng của xã hội thì
nhu cầu của con người ngày càng tăng, đặc biệt trong đó là các nhu
cầu về công nghệ để phục vụ cuộc sống hàng ngày của mỗi cá nhân
khi mà công nghệ ngày càng phát triển mạnh mẽ như hiện nay.
Nắm bắt được nhu cầu đó các công ty công nghệ đã không ng ừng
đổi mới và tạo ra nhiều công nghệ mới để đáp ứng nhu c ầu đó.
Trong đó không thể không nhắc đến các công nghệ di động và các
ứng dụng trên đó. Trong những năm trước đây, việc cập nhật thông
tin của chúng ta chủ yếu qua sách báo, radio, tivi,… Điều đó gây ra
sự hạn chế trong việc cập nhật thông tin thời gian thực. Nhưng với
sự phát triển của công nghệ di động, chúng ta có thể đem theo bên
mình những chiếc điện thoại thông minh nhỏ gọn tới bất c ứ đâu và
có thể cập nhật thông tin tại bất kì thời điểm nào. Không những vậy,
trên những chiếc điện thoại thông minh hiện nay còn có nh ững tiện
ích, ứng dụng tuyệt vời hỗ trợ cho một nhu cầu nào đó của con
người.

Figure 1 ứng dụng thời tiết trên điện thoại


Với nhu cầu đi lại, tổ chức các sự kiện, vui chơi giải trí ngày
càng tăng cao thì việc nắm bắt tình hình thời tiết là điều rất quan
trọng. Nó giúp chúng ta chuẩn bị trước những ngày thời tiết x ấu,
tránh những địa điểm thời tiết tốt cũng như chọn được địa điểm với
thời tiết thuận lợi hơn. Hiểu được nhu cầu đó, các ứng dụng về xem
dự báo thời tiết được tạo ra giúp chúng ta nắm bắt tình hình thời tiết
ngay trên chiếc điện thoại của mình. Mặc dù hiện nay đã có rất
nhiều ứng dụng về thời tiết như vậy với nhiều tính năng khác nhau
và trên nhiều hệ điều hành di động khác nhau, nhưng chúng em v ẫn
xin xây dựng một ứng dụng "Xem dự báo thời tiết trên Android" đ ể

củng cố lại kiến thức về android đã được học trong môn "Phát triển
ứng dụng trên các thiết bị di động", đồng thời tìm hiểu các công
nghệ liên quan để xây dụng lên một ứng dụng về thời tiết hoàn
chỉnh.

1.2. Phân tích bài toán







Ứng dụng xem thời tiết được xây dựng có các chức năng chính nh ư
sau:
Xem thông tin thời tiết tại địa điểm hiện tại.
Xem thông tin dự báo thời tiết trong các ngày tiếp theo.
Tìm và thêm các vị trí ưu thích để theo dõi
Xóa các vị trí đang theo dõi
Xem các thông tin thời tiết cơ bản tại một vị trí bất kỳ trên bản đồ
Google map

1.3. Các kỹ thuật sử dụng
 Sử dụng kết hợp các loại layout khác nhau: RelativeLayout,
LinearLayout, ScrollView, TableLayout,..
 Tùy biến hiển thị ListView, DropDown item
 Sử dụng recycling row
 Truyền dữ liệu giữa các activity
 Kỹ thuật xử lý multi-threading với lớp AsyncTask
 Kỹ thuật làm việc với API webservice OpenWeatherMap để lấy dữ

liệu thời tiết.
 Kỹ thuật xử lý chuỗi json, chuyển đổi sang java class
 Kỹ thuật làm việc với GoogleMap API
 Kỹ thuật thao tác với database SQLite
 Xử lý các sự kiện tương tác với người dùng
 Hiển thị lên notification bar

1.4. Các thư viện sử dụng trong ứng dụng
 pub.devrel:easypermissions:2.0.1 : Thư viện

giúp điều khiển

các quyền ứng dụng tại runtime trong android.



com.google.android.gms:play-services-maps:16.1.0 : gói cài
đặt giúp ta xây dựng giao diện bản đồ google map trong ứng dụng.




com.google.android.gms:play-services-location:16.0.0 : gói
cài đặt giúp lấy vị trí thiết bị dựa vào Google play services



com.google.code.gson:gson:2.8.5 : Thư viện giúp ta chuyển đổi
các đối tượng Json sang các Java class một cách nhanh chóng.

1.5. Phân chia công việc nhóm
Hoàng Văn Phi

- Phân tích và xây dựng giao diện tổng quát cho
ứng dụng
- Code giao diện các Activity thêm vị trí theo dõi và
giao diện bản đồ
- Các chức năng dùng Google api,
OpenWeatherMap api, Google play services

Nguyễn Anh Tuấn


- Hiển thị thông báo trên notification bar
- Làm báo cáo và các phần riêng.
- phân tích và xây dựng giao diện tổng quát cho
ứng dụng

CHƯƠNG 2. PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG
2.1. Các đối tượng chính trong hệ thống
Các đối tượng chính của hệ thống được tạo ra qua việc phân tích kết
quả là chuỗi json trả về từ API OpenWeatherMap được biểu diễn
theo hình 2 dưới đây.

Trong đó các thông tin nhận từ API được chuyển về các java class:
 Clouds có thuộc tính all là một số nguyên chứa thông tin tỉ lệ mây
trên bầu trời theo đơn vị %.
 Coords gồm hai thuộc tính:
o lon là một số thực chứa giá trị kinh độ của một vị trí với
dấu (-) biểu thị vị trí nằm ở tây bán cầu và ngược lại..
o lat là một số thực chứa giá trị vĩ độ của một vị trí với dấu
(-) biểu thị vị trí nằm ở nam bán cầu và ngược lại.

 Main bao gồm các thuộc tính:









o temp là một số thực chứa giá trị nhiệt độ hiện tại của
một vị trí theo đơn vị Kelvin.
o temp_min là một số thực chứa giá trị nhiệt độ nhỏ nhất
trong ngày hiện tại của một vị trí theo đơn vị Kelvin.
o temp_max là một số thực chứa giá trị nhiệt độ cao nhất
trong ngày hiện tại của một vị trí theo đơn vị Kelvin.
o sea_level là một số thực chứa giá trị áp suất khí quyển
trên mực nước biển theo đơn vị hPa.
o grnd_level là một số thực chứa giá trị áp suất khí quyển
trên mặt đất theo đơn vị hPa.

o pressure là một số thực chứa giá trị áp suất khí quyển (ở
mực nước biển, nếu không có dữ liệu sea_level hoặc
grnd_level) theo đơn vị hPa.
o humidity là một số thực chứa giá trị độ ẩm theo đơn vị %.
Wind bao gồm hai thuộc tính:
o speed là một số thực chứa giá trị tốc độ gió theo đơn vị
mét/giây.
o deg là một số thực chứa giá trị hướng gió theo đơn vị độ.
Sys bao gồm các thuộc tính:
o message là một số biến của hệ thống.
o country là một chuỗi chứa giá trị mã quốc gia như VI, US,
JP, …
o sunrise là một số nguyên chứa giá trị thời gian bình minh
theo dạng unix timestamp.
o sunset là một số nguyên chứa giá trị thời gian hoàng hôn
theo dạng unix timestamp.
Weather bao gồm các thuộc tính:
o id là id của điều kiện thời tiết hiện tại.
o main là một chuỗi mô tả một nhóm của tham số thời tiết
như Rain, Snow, …

o description là một chuỗi mô tả chi tiết điều kiện thời tiết
trong nhóm.
o icon là một chuỗi chứa icon id mô tả cho thời tiết hiện tại.
OpenWeatherJson là lớp chứa tất cả thông tin của chuỗi json trả
về bao gồm:
o id là một số nguyên chứa định danh của thành phố hiện
tại.
o dt là một số nguyên chứa thông tin về thời gian nhận dữ
liệu theo kiểu unix timestamp.
o name là một chuỗi chứa tên thành phố.
o Và tất cả các thuộc tính là các lớp nêu trên theo quan h ệ
1-n.

2.2. Các Activity của ứng dụng
2.2.1. Home Activity
2.2.2. Activity thêm vị trí theo dõi
Đây là activity cho phép người dùng:
-

Tìm kiếm các vị trí mong muốn theo dõi qua ô tìm kiếm

autoCompleteTextView
Xem các vị trí đang theo dõi được hiển thị trên một listView
Xóa một vị trí khỏi danh sách đang theo dõi

Các kỹ thuật được sử dụng:
-

Kết hợp giữa các layout khác nhau
Tùy biến item hiển thị chi tiết thông tin của vị trí dùng cho c ả
autoCompleteView và listView.
Làm việc với cơ sở dữ liệu SQLite

2.2.3. Activity hiển thị thời tiết trên bản đồ
Đây là activity cho phép người dùng:
-

Xem thông tin thời tiết tại một địa điểm bất kỳ trên bản đồ
Xem thông tin thời tiết tại vị trí hiện tại
Thay đổi loại bản đồ


Các kỹ thuật được sử dụng:
-

Tạo giao diện bản đồ qua Google Map API
Lấy vị trí hiện tại của người dùng qua Google play services
Lấy dữ liệu thời tiết qua API webservices OpenWeatherMap
Xử lý đa luồng
Chuyển đổi các đối tượng json sang java class tương ứng
Sử dụng kết hợp giữa các layout khác nhau
Hiển thị thông tin thời tiết lên notification bar

2.3. Cơ sở dữ liệu của ứng dụng
Bảng ''location'' chứa thông tin các vị trí mà API OpenWeatherMap
cung cấp. Bảng này dùng để lưu trữ các vị trí đang theo dõi của
người dùng được thêm thông qua activity thêm vị trí theo dõi.
Trường
_id
id
name
country
lat
lon

Kiểu dữ liệu
INTEGER

Mô tả
là trường bắt buộc của sqlite cho

TEXT
TEXT
TEXT
DOUBLE
DOUBLE

mỗi bảng, tự động tăng.
là định danh của một vị trí
là tên của một vị trí
là mã quốc gia của một vị trí
là tọa độ vĩ độ của một vị trí
là tọa độ kinh độ của một vị trí

CHƯƠNG 3 CÀI ĐẶT CHƯƠNG TRÌNH
3.1. Cấu hình các API và thư viện sử dụng
3.1.1. Cấu hình API OpenWeatherMap
Đi tới https://openweathermap.org/ và ấn nút sign up để đăng kí tài khoản
Giao diện đăng ký tài khoản

Figure 2 giao diện đăng ký tài khoản OpenWeatherMap

Sau khi đăng nhập chúng ta vào tab API keys để tạo key truy c ập API cho
ứng dụng.

Figure 3 giao diện tạo api key của OpenWeatherMap

3.1.2. Cấu hình API GoogleMap
Đi tới https://console.cloud.google.com đăng nhập với tài khoản google
Tạo mới một project cho ứng dụng

Figure 4 giao diện tạo project mới trong google cloud platform

Chọn tab API & Services > Dashboard, sau đó click ch ọn Enable APIs and
Services

Figure 5 giao diện APIs & Services

Tìm kiếm

Maps SDK for Android và chọn Enable

Figure 6 giao diện enable map sdk cho android

Tiếp tục chọn tab API & Services > Credentials, click "Create credentials"
> "API key" để tạo mới một API key cho ứng dụng. Hoặc ta có th ể s ử d ụng
luôn link đã được tạo trong google_maps_api.xml để tạo API key.

Figure 7 giao diện tạo API key trong credentials

Key thu được điền vào file google_maps_api.xml trong thư mục values

Figure 8 nội dung file google_maps_api.xml

3.2. Activity home
3.3. Activity thêm vị trí theo dõi
3.3.1. Giao diện
Gồm hai thành phần chính: 1 search input AutoCompleteView để ng ười
dùng tìm vị trí muốn theo dõi và 1 ListView để hiển thị danh sách v ị trí
người dùng đang theo dõi.

3.3.2. Code các bước xử lý
Bước 1: tìm lại các view trong activity

Bước 2: xây dựng một lớp adapter mới cho autoCompleteTextView

Bước 3: khởi tạo danh sách gợi ý tìm kiếm vị trí và xử lý sự kiện người
dùng chọn 1 item trên dropdown

Bước 4: xây dựng một lớp adapter mới cho listView, lấy dữ liệu danh sách
đã có từ cơ sở dữ liệu

Bước 5: khởi tạo listView hiển thị danh sách vị trí người dùng theo dõi

3.4. Activity xem thời tiết trên map
3.4.1. Giao diện

3.4.2. Lấy vị trí thiết bị Android location
Một trong những tính năng hữu ích của điện thoại đó là tính n ăng v ị trí.
Hiện nay, có hai cách để có thể lấy được vị trí thiết bị người dùng trên
android đó là sử dụng Android location API và Google play services API.
Android Location API sử dụng 3 nguồn cung cấp để lấy vị trí là:

 LocationManager.GPS_PROVIDER - nguồn này xác định vị trí dựa
trên vệ tinh.
 LocationManager.NETWORK_PROVIDER - nguồn này xác định vị trí
dựa trên cột thu phát sóng của mạng di động và các điểm truy cập
WIFI.
 LocationManager.PASSIVE_PROVIDER - nguồn này trả về vị trí sinh
ra bởi các nguồn khác. Ví dụ bạn nhận được vị trí cập nhật một cách
thụ động khi mà các ứng dụng khác hoặc dịch vụ khác yêu cầu mà
không phải bạn thực sự yêu cầu điều này.
Google Play services location API là cách mới mà Google giới thiệu để có
thể lấy được vị trí hiện tại của thiết bị. API này không dùng "Fused Location
Provider" mà tự động chọn nguồn cung cấp vị trí để sử dụng dựa trên độ
chính xác và mức tiêu thụ pin. API này cũng được Google khuyến khích sử
dụng thay thế cho Android Location API cũ. Các bước thực hiện được mô tả
dưới đây.
Bước 1: Với android 6.0 trở lên, ta cần kiểm tra quyền truy cập v ị trí tại
runtime và xử lý các kết quả trả về trong onRequestPermissionsResult()

Bước 2: Kiểm tra thiết bị có hỗ trợ Google play services
if(GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this)==
ConnectionResult.SUCCESS)
return true;

Bước 3: Cài đặt client và build yêu cầu vị trí

Bước 4: Tiến hành lấy vị trí và cập nhật khi vị trí thay đổi

3.4.3. Code xử lý các sự kiện người dùng tương tác trên bản đồ

3.4.4. Xử lý nhận dữ liệu thời tiết từ api

3.4.5. Hiển thị trên notification bar

3.5. Demo ứng dụng
Dưới đây là các sreenshot demo của ứng dụng

3.5.1. Activity home

3.5.2. Activity thêm vị trí
Khi người dùng nhập ký tự bất kì vào ô tìm kiếm, ứng dụng sẽ hiển thị một
danh sách các vị trí

Figure 9 chức năng thêm vị trí theo dõi mới

Khi người dùng ấn chọn một vị trí, vị trí đó sẽ được thêm vào cơ sở dữ liệu
và hiển thị lên danh sách đang theo dõi của ứng dụng

Figure 10 danh sách hiển thị các vị trí đang theo dõi

Khi người dùng ấn giữ một vị trí sẽ có một dialog hiển thị tùy chọn có
muốn xóa vị trí khỏi danh sách theo dõi không.

Figure 11 hộp thoại xác nhận xóa vị trí khỏi danh sách theo dõi

3.5.3. Activity xem thời tiết của một vị trí bất kì trên b ản đ ồ
Khi mở giao diện khi chưa có kết nối internet người dùng sẽ nhận được
một message yêu cầu bật internet

Figure 12 thông báo yêu cầu người dùng mở kết nối internet

Ứng dụng sẽ yêu cầu người dùng cấp quyền truy cập vị trí để có thể sử
dụng chức năng myLocation

Figure 13 ứng dụng yêu cầu quyền truy cập vị trí

Nếu người dùng từ chối thì sẽ nhận được một tin nhắn giải thích cần cấp
quyền cho ứng dụng

Figure 14 thông báo khi người dùng không cấp truyền

Khi người dùng ấn nút myLocation sẽ được yêu cầu bật GPS nếu GPS chưa
được bật, và đưa giao diện đến menu setting GPS

Figure 15 yêu cầu bật GPS

Figure 16 menu cài đặt bật GPS

Khi GPS đã được bật, ứng dụng sẽ chuyển tới vị trí hiện tại của người dùng
và hiện thị thông tin thời tiết tại đó

Figure 17 hiển thị thông tin thời tiết tại vị trí hiện tại

Khi người dùng click vào vị trí bất kì trên bản đồ, ứng dụng sẽ hiển thị
thông tin thời tiết cơ bản tại vị trí đó.

Figure 18 hiển thị thông tin tại vị trí bất kỳ

Thông tin thời tiết cơ bản trên notification bar của đi ện tho ại

CHƯƠNG 4 KẾT LUẬN
4.1. Kết quả đạt được
Trên đây là toàn bộ những phân tích và thi ết kế h ệ th ống ứng d ụng "Xem d ự báo
thời tiết" trên android với mục đích giúp mọi ng ười có th ể theo dõi tình hình th ời
tiết mọi lúc, mọi nơi với chiếc smartphone của mình. Về cơ b ản ứng d ụng đã đáp
ứng đầy đủ yêu cầu của bài toán nhóm đã đặt ra ban đ ầu, giao di ện đ ơn gi ản, d ễ
sử dụng, các chức năng có thể sử dụng ổn định, không có l ỗi nghiêm tr ọng nào
xảy ra…..

4.2. Định hướng phát triển