如何在不用安裝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);

相關文章
相關標籤/搜索