如何在不用安装googleplay也不用下载google play service sdk状况下使用googleMap的mark点击和路线规划

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

相关文章
相关标签/搜索