Báo cáo lập trình android chỉ dẫn người dùng theo vị trí
Trang 1TRƯỜ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 BÀI TẬP LỚN
LẬP TRÌNH ANDROID
ĐỀ TÀI 1 :
Chỉ dẫn người dùng theo vị trí
Giáo viên hướng dẫn: Nguyễn Hồng Quang
Sinh viên thực hiện:
Nguyễn Khánh Hưng 20081279 TTM-K53 Bùi Văn Hải 20080842 HTĐ1-K53 Trần Văn Toàn 20082715 TTM-K53
Đỗ Ngọc Tân 20082312 TTM-K53
Hà Nội 11/2012
Trang 22
MỤC LỤC
I Cơ sở lý thuyết 3
1 Giới thiệu chung 3
2 Các tham số truy cập Google Maps 3
II Mô tả các chức năng chính của chương trình 4
1 Nội dung công việc 4
2 Các chức năng 5
3 Cấu trúc chương trình 6
III Cài đặt chương trình 6
1 Hiển thị MapView 6
2 Hiển thị người dùng trên bản đồ số 7
3 Cảnh bảo người dùng trước một địa điểm xác định 7
4 Dẫn đường người dùng 8
5 Hiển thị thông tin thời tiết 13
IV Minh họa kết quả 17
V KẾT LUẬN 20
TÀI LIỆU THAM KHẢO 21
Trang 33
I Cơ sở lý thuyết
1 Giới thiệu chung
Trong thế giới web ngày nay, các giải pháp bản đồ là một thành phần không thể thiếu Chúng ta sử dụng chúng để thấy vị trí của mọi vật, để tìm vị trí của một địa chỉ, để lấy về thông tin dẫn đường, và làm nhiều thứ khác Hầu hết thông tin có một vị trí, và nếu vật nào đó có một vị trí thì nó có thể hiển thị trên một bản đồ
Có một số công ty cung cấp các giải pháp về bản đồ như Yahoo! Maps và Bing Maps, nhưng phổ biến nhất vẫn là Google maps Thực tế theo trang programmableweb.com, google maps là API phổ biến nhất trên internet Theo thống
kê của trang này tháng 5/2010, 43% là sử dụng Google Maps API
Để sử dụng được các dịch vụ và API của google maps bạn cần phải đăng ký với dịch vụ Google Maps và đồng ý với các điều khoản dịch vụ áp dụng trước khi bạn
lấy dữ liệu từ Google Maps
2 Các tham số truy cập Google Maps
2.1 Geocoding
Geocoding là quá trình chuyển đổi địa chỉ giống như “Bach Khoa Ha Noi” ) thành tọa độ địa lý (như latitude "21.004409", longitude "105.845896"), mà chúng
ta có thể sử dụng để dánh dấu hay định vị
Trang 44
Geocoding Request
http://maps.googleapis.com/maps/api/geocode/output?parameters
Trong đó output có thể là các giá trị sau:
json file chỉ dẫn output trong JavaScript Object Notation (JSON)
xml: file xml
Các thông số yêu cầu
o address: địa chỉ muốn thành geocode hoặc latlng: giá trị latitude/longitude hoặc components: thành phần lọc mà chúng ta muốn có
geocode
o sensor: có hoặc không yêu cầu mã hóa vị trí địa lý từ một thiết
bị với cảm biến vị trí Giá trị true hoặc false
Trong đó: address = địa điểm cần biết thông tin
II Mô tả các chức năng chính của chương trình
1 Nội dung công việc
Trang 55
o Dẫn đường người dùng bằng các lời nhắc âm thanh;
o Hiển thị thông tin thời tiết tại địa điểm muốn đến
2 Các chức năng
Hiển thị Google Maps
Hiển thị vị trí người dùng trên Google Maps
Mô tả: Khi thiết bị nhận được tín hiệu GPS, chương trình sẽ tự động hiển thị vị trí của thiết bị trên bản đồ
Cảnh báo người dùng khi họ đứng gần (phạm vi bán kính 200m) một địa điểm xác định
Mô tả: Ban đầu người dùng click vào một vị trí bất kỳ trên bản đồ
(vị trí đích cần đến) Sau đó nhấn vào menu “Địa điểm” để lưu lại
vị trí đích Khi thiết bị nằm trong bán kính vị trí đích 200m, chương trình sẽ hiển thị thông tin nhắc nhở người dùng
Dẫn đường người dùng với các bản tin chỉ dẫn bằng văn bản
Mô tả: Người dùng click vào menu “Tìm đường”, nhập địa chỉ nguồn và địa chỉ đích Sau đó click button “OK”, chương trình sẽ
hiển thị đường đi giữa 2 vị trí và văn bản chỉ dẫn người dùng
Dẫn đường người dùng bằng các lời nhắc âm thanh
Mô tả: Ban đầu người dùng click vào một vị trí bất kỳ trên bản đồ
(vị trí đích cần đến) Sau đó nhấn vào menu “Địa điểm” để lưu lại
vị trí đích Sau đó khi click vào menu “Voice Routing” thiết bị sẽ
hiển thị lời nhắc bằng văn bản và bằng âm thanh cho người dùng
Hiển thị thông tin thời tiết tại địa điểm muốn đến
Mô tả: Khi người dùng click vào một vị trí bất kỳ trên bản đồ, sau
đó nhấn menu “Thời tiết” chương trình sẽ hiển thị thông tin thời
tiết tại nơi muốn đến Thông tin gồm hình ảnh, địa điểm, thời gian hiện tại, nhiệt độ và thời tiết cụ thể Ngoài ra còn có thêm chức năng xem thông tin thời tiết cụ thể khi người dùng truy cập vào
địa chỉ cung cấp thông qua button “More”
Trang 66
3 Cấu trúc chương trình
Chương trình chạy trên hệ điều hành Android phiên bản Android Google API 4.1.2
Class MapsActivity: Class chính với các chức năng thực hiện các nhiệm
vụ: tạo các chức năng cho chương trình, cập nhật vị trí, tạo cơ sở dữ liệu nếu chưa tồn tại,
Class InfoRouting: lấy thông tin định tuyến từ file xml: danh danh vị trí,
và chỉ dẫn
Class WeatherForecast: lấy thông tin thời tiết từ file xml
Class WeatherHelper: tạo, truy vấn cơ sở dữ liệu về thời tiết
III Cài đặt chương trình
Trang 77
2 Hiển thị người dùng trên bản đồ số
Để hiển thị vị trí người sử dụng trên bản đồ , class Activity chính phải implements interface LocationListener và cài đặt một số phương thức khác :
onLocationChanged(Location l) : Phương thức này được gọi mỗi khi vị trí của người sử dụng thay đổi (tọa độ mà GPS nhận được thay đổi) Ở phương thức này sẽ xác định kinh độ , vĩ độ của vị trí hiện tại và vẽ lại hình ảnh (OverlayItem)
onProviderDisabled(String provider)
onProviderEnabled(String provider)
onStatusChanged(String provider, int status, Bundle extras)
Để xác định kinh độ , vĩ độ hiện tại sử dụng :
public void onLocationChanged(Location location)
Trong phương thức draw ta thêm dòng lệnh sau:
mapView.getProjection().toPixels(pointGPS, screenPts);
// -add the
getResources(), R.drawable.notify_icon);
canvas.drawBitmap(bmpOri, screenPts.x-16, screenPts.y-32,
null);
3 Cảnh bảo người dùng trước một địa điểm xác định
Để cảnh báo cho người dùng thì trước tiên phải cập nhật vị trí người dùng
public void onLocationChanged(Location location) {
int lat = (int) (location.getLatitude() * 1E6);
int lng = (int) (location.getLongitude() * 1E6);
GeoPoint point = new GeoPoint(lat, lng);
createMarker();
mapController.animateTo(point);
mapController.setCenter(point);
Trang 8endLon, distance);
(int)distance[0] + " mét.", Toast.LENGTH_LONG).show();
}
Để thực hiện việc cảnh báo người dùng, trước tên cần lựa chọn 1 vị trí sẽ đến, vị trí
đó được lưu vào biến pointGoal
Trong đó:
origin = địa chỉ nguồn Sử dụng tham số này khi yêu cầu dẫn đường lái
xe Khi phát triển trên nền tảng di động, để sử dụng MyLocatiion (tọa độ GPS) ta thiết lập saddr trống “” đối với Android, đối với iPhone, thiết lập saddr là “Current%20Location”
destination = địa chỉ đích Sử dụng khi yêu cầu thông tin dẫn đường
language = ngôn ngữ hiển thị trong file xml
Trang 9File xml trên chứa các thông tin dẫn đường từ 2 điểm cho trước
Trong các node <step> chứa các chỉ dẫn cụ thể về địa điểm tiếp theo cần tới Node <duration> chứa thời gian cần đi , tính theo vận tốc trung bình của các phương tiện
Node <distance> chứa khoảng cách tình theo đường bộ cần phải di chuyển Node <start_location> và <end_location> chứa kinh độ , vĩ độ của địa điểm bắt đầu và địa điểm kết thúc
Node <start_address> và <end_address> là địa chỉ của 2 địa điểm
Trong chương trình có 2 loại chỉ dẫn cho người dùng :
a Chỉ đường bằng các chỉ dẫn văn bản :
Mục tiêu
Lấy tọa độ điềm bắt đầu và đích đến của người dùng Sau đó vẽ một LinePath giữa 2 điểm.Hướng dẫn chi tiết cách đi bằng văn bản cho người dùng
Trang 10//chứa các node của lộ trình
private ArrayList<String> listInstructions = new ArrayList<String>();
private void getDirections(){
nl3 = doc.getElementsByTagName("html_instructions");
for ( int i = 0; i < nl3.getLength(); i++)
{
Node node3 = nl3.item(i);
String strInstru = Html.fromHtml(node3.getTextContent()).toString();
listInstructions add(strInstru);
}
}
}
Sau khi có các Node lộ trình gọi lớp MyOverlays để vẽ
public class MyOverlay extends Overlay {
Trang 1111
public void drawPath(MapView mv, Canvas canvas) {
}
}
Để hiển thị chỉ dẫn lộ trình cho người dùng
Xây dụng lớp showInstructionsDialog():lớp này đọc các thông tin tại các
Node trong lớp Inforouting để hiện thị lên màn hình
public void showInstructionsDialog()
b Chỉ đường bằng lời nhắc âm thanh
Giá trị cần lấy nằm trong node <html_instructions>. Giá trị này có định dạng
html chỉ rõ hướng đi tới địa điểm kế tiếp Ví dụ :
Đi về hướng <b>Tây</b> lên <b>Tạ Quang Bửu</b> về phía <b>Nội bộ Bách Khoa</b>
Để lấy được dữ liệu này trước hết khởi tạo kết nối Http đến url phía trên và
lấy dữ liệu về InputStream :
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpPost httpPost = new HttpPost(url);
response = httpClient.execute(httpPost, localContext);
InputStream in = response.getEntity().getContent();
Sau đó dùng DocumentBuilder để phân tích :
DocumentBuilder builder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(in);
Lấy về nội dung node <html_instructions> đầu tiên
NodeList nl;
nl = doc.getElementsByTagName( "html_instructions" ); Node node = nl.item(0);
nextDirection = node.getTextContent();
Trang 12Khai báo biến :
private TextToSpeech tts; và khởi tạo trong hàm onCreate
tts = new TextToSpeech(this, this);
Phương thức onInit kiểm tra trạng thái TextToSpeech và thiết lập ngôn ngữ (US) , nếu có lỗi thì ghi vào file log
public void onInit(int status) {
if(status == TextToSpeech.SUCCESS) {
int result = tts.setLanguage(Locale.US);
if(result == TextToSpeech.LANG_MISSING_DATA || result
== TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS" , "This Languge is not supported" );
} }
Để đảm bảo đối tượng TextToSpeech được tắt ở phương thức onDestroy() :
protected void onDestroy() {
if(tts != null) {
tts.stop();
tts.shutdown();
Trang 1313
}
super.onDestroy();
}
5 Hiển thị thông tin thời tiết
Sử dụng thông tin thời tiết do wunderground.com cung cấp Từ vị trí địa điểm cần biết thông tin thời tiết có kinh độ, vĩ độ x, y Để xác định ta phân tích file xml tải vệ từ URL:
http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query= x,y
Trong đó:
query = x, y: kinh độ, vĩ độ địa chỉ cần biết thông tin thời tiết
Cấu trúc chính của file như sau:
node <full> </full> chứa thông tin về thành phố có vị trí đã cho
<local_time> chứa thông tin về thời gian hiện tại
<weather> chứa thông tin thời tiết cần hiển thị
<temp_c> nhiệt độ theo độ C
<forecast_url> đường dẫn chứa thông tin thời tiết chi tiết
Trang 1414
Class WeatherForecast nhận thông số khởi tạo là cơ sở dữ liệu về thời tiết và vị
trí kinh độ vĩ độ địa điểm cần hiển thị
Để lấy được dữ liệu trước tiên ta phải kết nối với url đã cho:
BasicResponseHandler();
responseHandle);
buildForecast(responseBody);
Phương thức buildForcast(String raw) nhận đầu vào là String responseBody
sẽ đọc thông tin thời tiết từ file xml đã tải về
StringReader(raw)));
Thông tin về thành phố được lưu trữ trong thuộc tính city
doc.getElementsByTagName("display_location").item(0);
disLocation.getElementsByTagName("full").item(0);
this.setCity(city.getFirstChild().getNodeValue());
Thông tin về thời gian được lưu trữ trong thuộc tính time
doc.getElementsByTagName("local_time").item(0);
strTime = strTime.substring(0, strTime.indexOf(","));
this.setTime(strTime);
Thông tin về thời tiết được lưu trữ trong thuộc tính weather
doc.getElementsByTagName("weather").item(0);
if(c.getCount() > 0)
{
c.moveToFirst();
this.setWeather("Thời tiết: " + helper.getTypeVN(c));
this.setIconUrl(helper.getIcon(c));
Trang 1515
}
else
{
this.setWeather("Thời tiết: " + strWeather);
this.setIconUrl("unknown");
}
Ở đây thông tin thời tiết là tiếng anh nên sẽ được hiển thị tiếng việt thông qua tham chiếu từ cơ sở dữ liệu có sẵn Icon thời tiết cũng được truy vấn từ CSDL thông qua biến thời tiết
Thông tin về nhiệt độ
doc.getElementsByTagName("temp_c").item(0);
this.setTemperature("Nhiệt độ: " +
temperature.getFirstChild().getNodeValue() + " độ C");
Trang 16db.execSQL("CREATE TABLE if not exists types" +
"(_id INTEGER PRIMARY KEY AUTOINCREMENT, english TEXT, vietnam TEXT, icon TEXT);");
Truy vấn chuỗi tiếng việt, icon tương ứng với chuỗi tiếng anh
public Cursor getType(String strEnglish)
{
english = \"" + strEnglish + "\"", null)
}
Lấy chuỗi tiếng việt từ truy vấn
public String getTypeVN(Cursor c)
{
}
Lấy chuỗi icon từ truy vấn
public String getIcon(Cursor c)
{
}
Trang 1717
IV Minh họa kết quả
Hiển thị vị trí người dùng
Cảnh báo người dùng
Để cảnh báo người dùng trước tiên phải chọn vị trí cần đến trên bản đồ:
Chọn 1 vị trí và click vào menu “Điểm đến” để lưu vị trí
Điểm đến là Hồ Tiền – ĐHBKHN (21.004364,105.843378), vị trí hiện tại trên đường Tạ Quang Bửu ĐHBKHN (21.005105,105.843077):
Trang 1818
Dẫn đường người dùng bằng văn bản
Khi click vào menu “Tìm đường” sẽ hiện ra 2 lựa chọn cho người dùng Khi click button “OK” chương trình sẽ hiển thị thông tin chỉ dẫn
o Chọn 2 vị trí trên bản đồ: Chương trình sẽ hiển thị thông tin dẫn
đường giữa 2 địa điểm đã được chọn trên bản đồ (Chương trình cho phép người dùng lựa chọn tối đã 2 vị trí, khi chọn mỗi vị trí người dùng click vào menu “Điểm đến” để lưu lại
o Nhập 2 địa điểm: Người dùng nhập điểm đầu vào điểm cuối
Dẫn đường người dùng vào âm thanh
Để dẫn đường người dùng trước tiên phải chọn vị trí cần đến trên bản đồ: Chọn 1 vị trí và click vào menu “Điểm đến” để lưu vị trí Sau đó click vào menu “Voice Routing” để nghe thông tin chỉ dẫn
Hiển thị thông tin thời tiết
Khi click vào menu “Thời tiết” sẽ có 3 lựa chọn cho người dùng Khi click vào button “OK” chương trình sẽ hiển thị thông tin thời tiết tại vị trí đã chọn
o Vị trí của bạn: Chương trình sẽ hiển thị thông tin thời tiết tại vị trí
Trang 2020
Thông qua việc nghiên cứu và thực hiện bài tập lớn chúng em đã thu được nhiều kiến thức thực tế, đồng thời bổ sung thêm những kinh nghiệm quý báu cho công việc sau này Do thời gian có hạn nên báo cáo không thể tránh khỏi những sai sót, rất mong được thầy góp ý bổ sung giúp chúng em hoàn chỉnh đề tài này
Trang 2121
TÀI LIỆU THAM KHẢO
1 Slide bài giảng của thầy Nguyễn Hồng Quang