咱们都知道在国内访问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);