Báo cáo lập trình android chỉ dẫn người dùng theo vị trí
TRƯNG ĐI HC BCH KHOA H NI VIỆN CÔNG NGHỆ THÔNG TIN V TRUYỀN THÔNG BO CO BI 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 Ni 11/2012 2 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 3 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ị 4 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 o Geocode responses Xml trả về thông tin địa chỉ đã nhập http://maps.googleapis.com/maps/api/geocode/xml?address=Bach+Khoa+Ha+Noi &sensor=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 Chỉ dẫn người dùng theo vị trí Phát triển một ứng dụng chạy trên thiết bị đầu cuối di động thực hiện các chức năng sau: o Hiển thị vị trí người dùng trên bản đồ số (chẳng hạn Google Map) được mở ra trên màn hình thiết bị di động o 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 trước; o Dẫn đường người dùng với các bản tin chỉ dẫn bằng văn bản; 5 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”. 6 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 1. Hiển thị MapView Để hiển thị được Google Maps trong ứng dụng trước hết cần phải đăng kí 1 key miễn phí từ Google Maps API , rồi sử dụng mapview để hiển thị . Tạo file xml có chứa MapView <com.google.android.maps.MapView android:id="@+id/mvMain" android:layout_width="fill_parent" android:layout_height="fill_parent" android:apiKey="02qRkLmrjmMkRpapZNpr0E_FzOesmyBtaBhdu8A" android:enabled="true" android:clickable="true" /> Tạo Activity Activity muốn hiển thị được Google Maps cần phải extends MapActivity và override phương thức isRouteDisplayed(). 7 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) { pointGPS = new GeoPoint((int)(location.getLatitude() * 1E6), (int)(location.getLongitude() * 1E6)); } Để hiển thị vị trí ta thêm hình ảnh vị trí trên Google Maps chúng ta sẽ thêm item vào overlay của Maps. Trước tạo một lớp mới MyOverlay kế thừa Overlay Trong phương thức draw ta thêm dòng lệnh sau: Point screenPts = new Point(); mapView.getProjection().toPixels(pointGPS, screenPts); // add the marker Bitmap bmpOri = BitmapFactory.decodeResource( 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); 8 } Lấy địa chỉ điểm cần đến và tính khoảng cách với vị trí hiện tại và tính. Khoảng cách 2 điểm cho tới khi cách vị trí cần tới 200m thì đưa ra thông báo if(pointGoal != null) { float[] distance = new float[2]; double startLat = pointGPS.getLatitudeE6() / 1.0E6; double startLon = pointGPS.getLongitudeE6()/ 1.0E6; double endLat = pointGoal.getLatitudeE6() / 1.0E6; double endLon = pointGoal.getLongitudeE6() / 1.0E6; Location.distanceBetween(startLat, startLon, endLat, endLon, distance); if(distance[0] <= 200.0) { Toast.makeText(MapsActivity.this, "Bạn cách đích " + (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 4. Dẫn đường người dùng Từ vị trí của điểm nguồn có kinh độ , vĩ độ là x1,y1 , cần xác định chỉ dẫn tới điểm đích có kinh độ , vĩ độ là x2, y2 . Để xác định ta phân tích file xml tải về từ url : http://maps.googleapis.com/maps/api/directions/xml?origin=x1,y1&de stination=x2,y2&sensor=false&units=metric" 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 9 Cấu trúc của file như sau : <DirectionsResponse> <status></status> <route> <summary></summary> <leg> <step> <travel_mode></travel_mode> <start_location></start_location> <end_location></end_location> <polyline><points></points></polyline> <duration><value></value><text></text></duration> <html_instructions></html_instructions> <distance><value></value><text></text></distance> </step> <step></step> … <duration></duration> <distance></distance> <start_location></start_location> <end_location></endlocation> <start_address></start_address> <end_address></endress> </route> </DirectionsResponse> File 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. 10 Vẽ đường Xây dựng lớp InfoRouting đọc file xml để lấy được các thông tin về các Node của lộ trình. class InfoRouting{ //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 { @Override public boolean draw(Canvas canvas, MapView mv, boolean shadow, long when) { super.draw(canvas, mv, shadow); . . . . . . . . . . . . . . . . . . . . . . } [...]... 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. .. 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): 17 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. .. 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ị. .. của bạn: Chương trình sẽ hiển thị thông tin thời tiết tại vị trí người dùng đang đứng o Vị trí đã chọn: Chương trình sẽ hiển thị thông tin thời tiết tại vị trí người dùng chọn trên bản đồ o Nhập địa điểm: Chương trình sẽ hiển thị thông tin thời tiết tại vị trí người dùng nhập vào 18 Khi thông tin thời tiết đã hiển thị, có 2 lựa chọn cho người dùng: Button “Close” sẽ đóng cửa sổ hiển thị; Button “More”... phát ra âm thanh chỉ dẫn đường Phát âm kí tự chỉ dẫn Sử dụng package : android. speech.tts.TextToSpeech Để sử dụng gói này trước hết class phải implements giao diện OnInitListener và cài đặt phương thức onInit(int status) Khai 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ữ... tts.setLanguage(Locale.US); if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { Log.e("TTS","This Languge is not supported"); } } } Khi người dùng chọn phát chỉ dẫn bằng âm thanh (từ menu) chuỗi kí tự chỉ dẫn sẽ được lấy về và phát thành tiếng : nextMove = getNextDirection(src_lat, src_long, dest_lat, dest_long); tts.speak(nextMove, TextToSpeech.QUEUE_FLUSH, null); Để... đó node chứa thông tin về thành phố có vị trí đã cho chứa thông tin về thời gian hiện tại chứa thông tin thời tiết cần hiển thị nhiệt độ theo độ C đường dẫn chứa thông tin thời tiết chi tiết 13 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... } } Để 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() { final View view = getLayoutInflater().inflate(R.layout.instructions, null); TextView textView = (TextView)view.findViewById(R.id.viewInstru); -} b Chỉ đường bằng lời nhắc âm... 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 20 TÀI LIỆU THAM KHẢO 1 Slide bài giảng của thầy Nguyễn Hồng Quang 2 http://vietshare.vn/500/71 /Android- Google-Maps-Tutorial Phan-3.aspx 3 http://mobiforge.com/developing/story/using-google-maps -android 4 http://developer .android. com/reference/packages.html... 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: . “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ỳ. chương trình 1. Nội dung công việc Chỉ dẫn người dùng theo vị trí Phát triển một ứng dụng chạy trên thiết bị đầu cuối di động thực hiện các chức năng sau: o Hiển thị vị trí người dùng trên. } } Để 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 4. Dẫn đường người dùng Từ vị trí của điểm nguồn có kinh độ ,