咱們都知道在國內訪問google是須要勇氣的,開發者在開發集成googleMap的App的時候是捉急的。javascript
這個博客寫的緣由就是咱們在項目中用到了googleMap的Marker和路線規劃,可是網上搜了一下能用的不多,那麼如今問題就來了,怎麼玩?html
首先個人項目對googleMap的使用只是一點點的功能,因此就用到了這一點點功能。那就是Mark和點擊Marker。至於路線規劃直接跳轉到瀏覽器中就行了。標記marker要用到點擊marker來實現xml代碼的更新和顯示marker對應的信息。java
先說一下思路:android
首先國內手機通常都將google服務親手閹割掉了,那麼咱們再獲取google play service 的時候就會出現異常,最起碼個人華爲手機是不行的。git
那麼咱們作成的App若是給國內用戶訪問是否是就須要人安裝google play service 呢?固然這顯然是不行的。web
可是若是咱們訪問網頁,而後經過java和js的交互是否是就能夠實現了,咱們把poi點信息傳送給html,而後點擊marker再調用java代碼是否是就好點了呢?json
貌似不錯,那就開工。canvas
1:本地Html文件api
打開google API for js 咱們就能看到基本地圖以及標註Mark的示例,那麼copy下這麼一代碼也不是難事。瀏覽器
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<meta charset="utf-8">
<title>Simple markers</title>
<style>
html, body, #map-canvas {
height: 100%;
margin: 0;
padding: 0;
}
</style>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script>
<script>
var map;
function initialize() {
var myLatlng = new google.maps.LatLng(35.710838,139.812012);
var mapOptions = {
zoom: 8,
center: myLatlng
}
var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
}
google.maps.event.addDomListener(window, 'load', initialize);
//android會來調用它
function addmark(shopListStr){
var myobj=eval(shopListStr);
var myLatlng = new google.maps.LatLng(myobj[0].latitude,myobj[0].longitude);
var mapOptions = {
zoom: 8,
center: myLatlng
}
var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
var markers = new Array();
for(var i=1;i<myobj.length;i++){
var shopinfo = myobj[i].shopId + ";" + myobj[i].shopName + ";" + myobj[i].grade + ";" + myobj[i].distance + ";" + myobj[i].shopTypeId;
var myLatlng = new google.maps.LatLng(myobj[i].latitude,myobj[i].longitude);
var markera = new google.maps.Marker({
position: myLatlng,
map: map,
title: shopinfo
});
markers[i-1] = markera;
}
var length = markers.length;
for (var j=0;j<length;j++) {
google.maps.event.addListener(markers[j], 'click', function(){
alert(this.title);
});
}
}
function showInfo(shopinfo){
alert(shopinfo);
}
</script>
</head>
<body>
<div id="map-canvas"></div>
</body>
</html>
2:作安卓項目的都明白,咱們都應該知道可是可能沒用過的一個問題就是java代碼是能夠和html進行交互的,因此在java的xml中寫一個webview,用來承載html,捕捉js事件,也用來給html傳值。
在java代碼中添加webview的,而且進行初始化等,1:將列表信息傳到html中(onPageFinished方法中)2:須要拿到點擊marker獲取marker的信息,因此在html中alert就好,在java代碼中監聽webview的alert事件(onJsAlert)就好。
mMapWebView.getSettings().setJavaScriptEnabled(true);
// 在alert的時候監聽並獲取alert數據。
mMapWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
LogUtils.v("message == " + message);
setBottomView(message);
result.confirm();
return true;
}
});
// 當數據加載完成以後將店鋪數據打包成json字符串發送給html的addMark方法
mMapWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
String shopListStr = JSON.toJSONString(mShopList);
mMapWebView
.loadUrl("javascript:addmark('" + shopListStr + "')");
}
});
mMapWebView.loadUrl("file:///android_asset/foreginmap.html");
3:搞定(金星老師說了:完美,完美,完美,重三)。
大概思路就是這樣,不是特別高明,可是解決了一部分問題,只能說知足個人需求,固然也能夠在java代碼中用mapView來作。我也作過嘗試,可是困難比較多,水平有限,只能走小路,作標記,不喜勿噴。
最後路線規劃,我是跳轉到瀏覽器中,或者跳轉到googleMap中的。
String url = 「http://ditu.google.cn/maps?f=d&source=s_d&saddr="
+ startLatitude + "," + startLongitude + "&daddr="
+ endLatitude + "," + endLongitude + "&hl=zh"));
若是強制使用googleMap客戶端打開:
Intent i = new Intent(Intent.ACTION_VIEW,
Uri.parse("http://ditu.google.cn/maps?f=d&source=s_d&saddr="
+ startLatitude + "," + startLongitude + "&daddr="
+ endLatitude + "," + endLongitude + "&hl=zh"));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
& Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
i.setClassName("com.google.android.apps.maps",
"com.google.android.maps.MapsActivity");
startActivity(i);
檢測是否安裝googleMap:
private boolean isGoogleMapsInstalled() {
try {
getPackageManager().getApplicationInfo(
"com.google.android.apps.maps", 0);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
跳轉360市場下載GoogleMap:
Intent intent = new Intent(
Intent.ACTION_VIEW,
Uri.parse("http://openbox.mobilem.360.cn/qcms/view/t/detail?t=2&sid=780")); startActivity(intent);