在正式版本的Android SDK 中,移除了原有M5 版本里面的DrivingDirection package,所以無法透過程序來規劃導航線路。因此導航功能的實現我們是通過載入web 導航網頁的方式實現的。Android 提供了一個名為WebView的控件來專門瀏覽網頁。
WebView控件是基于WebKit 瀏覽器網頁排版引擎的一個java接口,它能夠完美支持html、javascript、css.有時我們可以把整個UI 甚至數據處理都交給WebView,配合PHP 等服務器端程序,這樣的Android 應用開發更為簡單UI 更為豐富。因此本系統的導航功能的主要工作就集中在編寫Google Map Api javascript 版本的導航網頁以及WebView與javascript 的數據交互中。
1、WebView 的定義及設置:
首先要在XML 布局文件中定義WebView控件;然后在程序中裝載這個控件,設置屬性;最后通過loadUrl 方法實現網頁的載入。
WebView 常用的類有:WebSettings、WebViewClient、WebChromeClient.
WebSettings 用來設置WebView的一些屬性狀態,如:
// 設置可以訪問文件
webSettings.setAllowFileAccess(true);
// 設置支持縮放
webSettings.setBuiltInZoomControls(true);
WebViewClient 專門輔助WebView處理各種通知、請求等事件類,通過WebView 的setWebViewClient 方法來指定一個WebViewClient 對象,如下:
webView.setWebViewClient(newWebViewClient()
{
public boolean shouldOverrideUrlLoading(WebViewview,String url){
view.loadUrl(url);
return true;
}
})
WebChromeClient 類專門用來輔助WebView對話框、網站圖標、網站Title、加載進度等。使用方法如下:
webView.setWebChromeClient(newWebChromeClient()
{
@Override
// 該方法為處理javascript 中的alert 事件
public boolean onJsAlert (WebView view,String url,Stringmessage,
JsResult result){
// TODO Auto- generated method stub
return super.onJsAlert(view,url,message,result);
});
設置完WebView后主要工作就是Html 網頁的編寫。
2、編寫Html 網頁實現線路規劃:
線路規劃的前提是必須要指定起始地址以及出行方式,本系統用戶是通過在Activity 中輸入地址和選擇出行方式來向系統提交信息。WebView 必須從應用中獲取信息,然后發送給Html,供javascript 調用并實現導航。
在android 應用端,定義一個類保存用戶輸入的起始地址的經緯度信息:
// 在javascript 腳本中調用得到LatlngData 對象
public LatlngData getLatlngData()
{ return latlngData;
}
/* 定義一個latlngData 類,保存經緯度信息,經緯度由Geocoder.getFromLocationNAME()方法按照用戶輸入地址解析而得到。*/
class LatlngData
{ String startLatlng;
String endLatlng;
public LatlngData()
{
this.startLatlng=“”;
this.endLatlng =“”;
}
public String getStartLatlng()
{
return startLatlng;
}
public String getEndLatlng()
{
return endLatlng;
}
}
// 通過LatlngDataInterface () 方法將數據類綁定給javascript,這樣javascript 就能夠獲// 得了用戶的數據了。
public class DataJavaScriptInterface{
public LatlngData LatlngDataInterface(){
latlngData = getLatlngData();
return latlngData;
}
在Html 網頁中編寫以下代碼獲得數據,并通過格式轉換使數據能夠為線路規劃所接受,代碼如下:
var latlngData = window.demo.LatlngDataInterface();
// 獲取起點和終點位置的經緯度信息為String 格式
startLatlng = latlngData.getStartLatlng();
endLatlng = latlngData.getEndLatlng();
// 把String 格式經緯度轉換為Float 格式
startLat = parseFloat(startLatlng.substring(0,8));
startLng = parseFloat(startLatlng.substring(10,18));
endLat = parseFloat(endLatlng.substring(0,8));
endLng = parseFloat(endLatlng.substring(10,18));
通過DirectionsService 對象計算路線(使用各種交通方式)。
此對象與Google Maps API Directions Service 進行通信,該服務將接收路線請求并傳回計算結果。可以自行處理這些路線結果,也可以使用DirectionsRenderer 對象渲染這些結果:
function calcRoute(){
start = beginLatlng;
end = endLatlng;
var request = {
origin:start,
destination:end,
travelMode: google.maps.DirectionsTravelMode.DRIVING
};
directionsService.route(request,function(response,status){
if(status == google.maps.DirectionsStatus.OK){
var warnings = document.getElementById(“warnings_panel”);
warnings.innerHTML = “” + response.routes [0].warnings + “”;
directionsDisplay.setDirections(response);
showSteps(response);
}
});
}
評論
查看更多