天天看點

根據經緯度跳轉三方app地圖導航

package com.shendi.Utils;


import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.net.Uri;
import android.widget.Toast;

import com.shendi.View.application.MyApplication;

import java.io.File;
import java.util.List;

/**
 * Created by zhq_zhao on 2017/5/5.
 * 注意百度不需要起始位置的經緯度,而高德需要起始位置的經緯度
 * 使用第三方導航:高德、百度。。。。。。。。。。
 */
public class AmapUtil {
    private static AmapUtil mAmapUtil;
    private LocationManager locationManager;
    private String locationProvider;
    private String slat;
    private String slng;
    private  Location location;

    public AmapUtil(Context getApplicationContext) {
        //擷取地理位置管理器
        locationManager = (LocationManager) getApplicationContext.getSystemService(Context.LOCATION_SERVICE);
        //擷取所有可用的位置提供器
        List<String> providers = locationManager.getProviders(true);
        if(providers.contains(LocationManager.GPS_PROVIDER)){
            //如果是GPS
            locationProvider = LocationManager.GPS_PROVIDER;
        }else if(providers.contains(LocationManager.NETWORK_PROVIDER)){
            //如果是Network
            locationProvider = LocationManager.NETWORK_PROVIDER;
        }else{
            Toast.makeText(MyApplication.context, "沒有可用的位置提供器", Toast.LENGTH_SHORT).show();
            return ;
        }
        //擷取Location
        location = locationManager.getLastKnownLocation(locationProvider);
        if(location !=null){
            //不為空,顯示地理位置經緯度
            getLocationInfo(location);
        }
    }

    /**擷取起點位置用于高德地圖導航的使用
     *
     * @param location
     */
    private void getLocationInfo(Location location) {
        if (location != null) {
            //擷取緯度
            slat = String.valueOf(location.getLatitude());
            //擷取經度
            slng = String.valueOf(location.getLongitude());

        } else {
            Toast.makeText(MyApplication.context, "請允許定位權限", Toast.LENGTH_SHORT).show();
            return ;
        }
    }

    /**
     * 根據包名檢測某個APP是否安裝
     * @param packageName 包名  百度的包名為 com.baidu.BaiduMap,高德com.autonavi.minimap,騰訊
     * @return true 安裝 false 沒有安裝
     */
    public static boolean isInstallByRead(String packageName) {
        return new File("/data/data/" + packageName).exists();
    }
    public static AmapUtil getInstance(){
        if(mAmapUtil ==null){
            mAmapUtil =new AmapUtil(MyApplication.context);
        }
        return mAmapUtil;
    }

    /**
     * 打開百度地圖導航用戶端
     * intent = Intent.getIntent("baidumap://map/navi?location=34.264642646862,108.95108518068&type=BLK&src=thirdapp.navi.you
     * location 坐标點 location與query二者必須有一個,當有location時,忽略query
     * query    搜尋key   同上
     * type 路線規劃類型  BLK:躲避擁堵(自駕);TIME:最短時間(自駕);DIS:最短路程(自駕);FEE:少走高速(自駕);預設DIS
     */
    public void openBaiduNavi(Context context,String lat,String lng) {
        StringBuffer stringBuffer = new StringBuffer("baidumap://map/geocoder?location=")
                .append(lat).append(",").append(lng).append("&type=TIME");
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(stringBuffer.toString()));
        intent.setPackage("com.baidu.BaiduMap");
        context.startActivity(intent);
    }
    /**
     * 打開google Web地圖導航
     */
    public void openWebGoogleNavi(Context context,String lat,String lng) {
        StringBuffer stringBuffer = new StringBuffer("http://ditu.google.cn/maps?hl=zh&mrt=loc&q=").append(lat).append(",").append(lng);
        Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(stringBuffer.toString()));
        context. startActivity(i);
    }
    /**
     * 打開google地圖用戶端開始導航
     * q:目的地
     * mode:d駕車 預設
     */
    public void openGoogleNavi(Context context,String lat,String lng) {
        StringBuffer stringBuffer = new StringBuffer("google.navigation:q=").append(lat).append(",").append(lng).append("&mode=d");
        Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(stringBuffer.toString()));
        i.setPackage("com.google.android.apps.maps");
        context.startActivity(i);
    }


    /**
     * @param  //slat 起點
     * @param dlat 終點
     * @param dev 必填 是否偏移(0:lat 和 lon 是已經加密後的,不需要國測加密; 1:需要國測加密)
     * @param t t = 1(公交) =2(駕車) =4(步行)
     * @param showType 高德導航
     * /*"androidamap://route?sourceApplication=changanchuxing"
     * + "&slat=36.2&slon=116.1&sname=abc&dlat=36.3"
     * + "&dlon=116.2&dname=def&dev=0&m=0&t=1&showType=1"
     * 高德開放平台 http://lbs.amap.com/api/uri-api/guide/android-uri-explain/route/
     */
    public  void goToGaodeNaviActivity2(Context context, String sourceApplication, String sname, String dlat, String dlon, String dname, String dev, String m,
                                             String t, String showType) {
        String locationStr = "androidamap://route?sourceApplication="
                + sourceApplication
                +
                "&slat="
                + slat
                + "&slon="
                + slng
                +
                "&sname="
                + sname
                + "&dlat="
                + dlat
                + "&dlon="
                + dlon
                + "&dname="
                + dname
                + "&dev="
                + dev
                + "&m="
                + m
                + "&t="
                + t
                + "&showType="
                + showType;
        Intent intent = new Intent("android.intent.action.VIEW",
                android.net.Uri.parse(locationStr));
        intent.setPackage("com.autonavi.minimap");
        context.startActivity(intent);
    }
}
    //-------------------------------------以下的暫時廢棄不用---------------------------------------------------------------//
//
//    /**
//     * 啟動BaiduApp進行導航
//     * <h3>Version</h3> 1.0
//     * <h3>CreateTime</h3> 2016/6/27,11:23
//     * <h3>UpdateTime</h3> 2016/6/27,11:23
//     * <h3>CreateAuthor</h3> luzhenbang
//     * <h3>UpdateAuthor</h3>
//     * <h3>UpdateInfo</h3> (此處輸入修改内容,若無修改可不寫.)
//     *
//     * @param context 上下文
//     * @param origin 必選  起點名稱或經緯度,或者可同時提供名稱和經緯度,此時經緯度優先級高,将作為導航依據,名稱隻負責展示。例如:
//     * latlng:34.264642646862,108.95108518068|name:我家
//     * @param destination 必選 終點名稱或經緯度,或者可同時提供名稱和經緯度,此時經緯度優先級高,将作為導航依據,名稱隻負責展示。
//     * @param mode 必選 導航模式,固定為transit、driving、walking,分别表示公交、駕車和步行
//     * @param region 必選 城市名或縣名 當給定region時,認為起點和終點都在同一城市,除非單獨給定起點或終點的城市。
//     * @param origin_region 必選  起點所在城市或縣
//     * @param destination_region 必選  終點所在城市或縣
//     * @param coord_type 可選 坐标類型,可選參數,預設為bd09經緯度坐标。
//     * @param zoom 可選 展現地圖的級别,預設為視覺最優級别。
//     * @param src 必選 調用來源,規則:companyName|appName。
//     */
//    /** 百度導航 */
//    public static void goToBaiduNaviActivity(Context context, String origin, String destination,
//                                             String mode, String region, String origin_region, String destination_region,
//                                             String coord_type, String zoom, String src) {
//        StringBuffer stringBuffer = new StringBuffer("intent://map/direction?origin=");
//        stringBuffer.append(origin)
//                .append("&destination=")
//                .append(destination)
//                .append("&mode=")
//                .append(mode);
//        if (!TextUtils.isEmpty(region)) {
//            stringBuffer.append("&region=").append(region);
//        }
//        if (!TextUtils.isEmpty(origin_region)) {
//            stringBuffer.append("&origin_region=").append(origin_region);
//        }
//        if (!TextUtils.isEmpty(destination_region)) {
//            stringBuffer.append("&destination_region=").append(destination_region);
//        }
//        if (!TextUtils.isEmpty(coord_type)) {
//            stringBuffer.append("&coord_type=").append(coord_type);
//        }
//
//        if (!TextUtils.isEmpty(zoom)) {
//            stringBuffer.append("&zoom=").append(zoom);
//        }
//        stringBuffer.append("&src=")
//                .append(src)
//                .append("#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");
//        String intentString = stringBuffer.toString();
//        try {
//            Intent intent = Intent.getIntent(intentString);
//            context.startActivity(intent);
//        } catch (URISyntaxException e) {
//            e.printStackTrace();
//        }
//    }
//
//    /***
//     * @param originlat 起點次元
//     * @param originlon 起點經度
//     * @param destinationlat 終點
//     * @param mode 出行方式 導航模式,固定為transit(公交)、 driving(駕車)、walking(步行)和riding(騎行). 預設:driving
//     * 具體看百度地圖開放者平台官網  http://lbsyun.baidu.com/index.php?title=uri/api/android
//     */
//  /*// 公交路線規劃
//  //i1.setData(Uri.parse("baidumap://map/direction?origin=name:對外經貿大學|latlng:39.98871,116.43234&destination=name:西直門&mode=transit&sy=3&index=0&target=1"));
//  // 駕車路線規劃
//  i1.setData(Uri.parse("baidumap://map/direction?region=beijing&origin=39.98871,116.43234&destination=name:西直門&mode=driving"));
//  // 步行路線規劃
//  i1.setData(Uri.parse("baidumap://map/direction?region=beijing&origin=39.98871,116.43234&destination=40.057406655722,116.2964407172&mode=walking"));
//  startActivity(i1);*/
//    public static void goToBaiduNaviActivity(Context context, double originlat, double originlon,
//                                             double destinationlat, double destinationlon, String mode) {
//        String locationStr = "baidumap://map/direction?origin="
//                + GCJ02ToBD09(originlon, originlat)[1]
//                + ","
//                + GCJ02ToBD09(originlon, originlat)[0]
//                + "&destination="
//                + GCJ02ToBD09(destinationlon, destinationlat)[1]
//                + ","
//                + GCJ02ToBD09(destinationlon, destinationlat)[0]
//                + "&mode="
//                + mode;
//        Intent intent = new Intent("android.intent.action.VIEW",
//                android.net.Uri.parse(/*stringBuffer.toString()*/locationStr));
//        intent.setPackage("com.baidu.BaiduMap");
//        context.startActivity(intent);
//    }
//
//    /**
//     *  file:///E:/someDownCode/IntentMapGuide-master/%E8%85%BE%E8%AE%AF%E5%9C%B0%E5%9B%BE_URI%E8%A7%84%E8%8C%83%E6%96%87%E6%A1%A3_150417/URI%E8%A7%84%E8%8C%83%E6%96%87%E6%A1%A3.html
//     * qqmap://map/routeplan?type=drive&from=天壇南門&fromcoord=39.873145,116.413306&to=國家大劇院&tocoord=39.907380,116.388501
//     * coord=39.904956,116.389449    lat<緯度>,lng<經度>
//     * //移動端啟動騰訊地圖App,并顯示從出發點[天壇南門] 到 [目的地坐标(國家大劇院)] 的駕車路線規劃
//     * @param context
//     * @param type 路線規劃方式參數:公交 bus   駕車 drive    步行 walk
//     * @param from
//     * @param fromLat
//     * @param fromLon
//     * @param to
//     * @param toLat
//     * @param toLon
//     */
//    public static void goToTenCentNaviActivity(Context context, String type, String from,
//                                               double fromLat, double fromLon, String to, double toLat, double toLon) {
//        String locationStr = "qqmap://map/routeplan?type="
//                + type
//                +"&from="
//                + from
//                + "&fromcoord="
//                + fromLat
//                + ","
//                + fromLon
//                + "&to="
//                + to
//                + "&tocoord="
//                + toLat
//                + ","
//                + toLon;
//        System.out.println("tencent-location:" + locationStr);
//        Intent intent = new Intent("android.intent.action.VIEW", android.net.Uri.parse(locationStr));
//        intent.setPackage("com.tencent.map");
//        context.startActivity(intent);
//    }
//

//    /**
//     * 火星坐标系 (GCJ-02) 與百度坐标系 (BD-09) 的轉換
//     * 即谷歌、高德 轉 百度
//     * 騰訊和高德經緯度一樣
//     **經緯度轉換 http://blog.csdn.net/meegomeego/article/details/39927017
//     * @param gcj_lon
//     * @param gcj_lat
//     * @return Double[lon, lat]
//     *CoordtransformUtil檔案坐标轉換
//     */
//    private static double x_PI = 3.14159265358979324 * 3000.0 / 180.0;
//
//    public static Double[] GCJ02ToBD09(Double gcj_lon, Double gcj_lat) {
//        double z =
//                Math.sqrt(gcj_lon * gcj_lon + gcj_lat * gcj_lat) + 0.00002 * Math.sin(gcj_lat * x_PI);
//        double theta = Math.atan2(gcj_lat, gcj_lon) + 0.000003 * Math.cos(gcj_lon * x_PI);
//        Double[] arr = new Double[2];
//        arr[0] = z * Math.cos(theta) + 0.0065;
//        arr[1] = z * Math.sin(theta) + 0.006;
//        return arr;
//    }
    /**
     * 啟動高德App進行導航
     * <h3>Version</h3> 1.0
     * <h3>CreateTime</h3> 2016/6/27,13:58
     * <h3>UpdateTime</h3> 2016/6/27,13:58
     * <h3>CreateAuthor</h3>
     * <h3>UpdateAuthor</h3>
     * <h3>UpdateInfo</h3> (此處輸入修改内容,若無修改可不寫.)
     *
     * @param sourceApplication 必填 第三方調用應用名稱。如 amap
     * @param poiname 非必填 POI 名稱
     * @param lat 必填 緯度
     * @param lon 必填 經度
     * @param dev 必填 是否偏移(0:lat 和 lon 是已經加密後的,不需要國測加密; 1:需要國測加密)
     * @param style 必填 導航方式(0 速度快; 1 費用少; 2 路程短; 3 不走高速;4 躲避擁堵;5 不走高速且避免收費;6 不走高速且躲避擁堵;
     * 7 躲避收費和擁堵;8不走高速躲避收費和擁堵))
     */
    /** 高德導航 **/
//    public static void goToGaodeNaviActivity(Context context, String sourceApplication,
//                                             String poiname, String lat, String lon, String dev, String style) {
//        StringBuffer stringBuffer =
//                new StringBuffer("androidamap://navi?sourceApplication=").append(sourceApplication);
//        if (!TextUtils.isEmpty(poiname)) {
//            stringBuffer.append("&poiname=").append(poiname);
//        }
//        stringBuffer.append("&lat=")
//                .append(lat)
//                .append("&lon=")
//                .append(lon)
//                .append("&dev=")
//                .append(dev)
//                .append("&style=")
//                .append(style);
//
//        Intent intent =
//                new Intent("android.intent.action.VIEW", android.net.Uri.parse(stringBuffer.toString()));
//        intent.setPackage("com.autonavi.minimap");
//        context.startActivity(intent);
//    }

//-----------------------下面是導航第二選擇方案---------------------------------------------------------------------------------------------------------------//
//    /**
//     * 根據位置直接解析跳轉
//     */
//    private void MapduApiShow() {
//        if (isInstallByRead("com.autonavi.minimap")) {//手機安裝了百度地圖
            //百度地圖api調用
            Intent i1 = new Intent();
            // 位址解析
            i1.setData(Uri.parse("baidumap://map/geocoder?src=openApiDemo&address=申迪南路"));
            mActivity.startActivity(i1);
//            //如果不是位址解析而是傳入經緯度那麼就用下面的方法
//            openBaiduNavi(mActivity,lat,lng);
//        } else {
//            if (isInstallByRead("com.autonavi.minimap")) {//手機安裝高德地圖,高德需要起點的經緯度而百度不需要
//                Intent intent = new Intent();
//                intent.setData(Uri
//                        .parse("androidamap://route?sourceApplication=appSelfName"
//                               // + "&slat=36.2&slon=116.1&sname=abc"
//                                + "&slat=36.2&slon=116.1&sname="+"起點"
//                                + "&dlat=36.3" + "&dlon=116.2" +//終點坐标
//                                "&dname=" +"終點"
//                                + "&dev=0&m=0&t=1&showType=1"));
//                mActivity.startActivity(intent);
//            }else{
//                Toast.makeText(mActivity,"請安裝高德或百度地圖用戶端",Toast.LENGTH_LONG).show();
//            }
//        }
//    }
//
//
//    public static boolean isInstallByRead(String packageName) {
//        return new File("/data/data/" + packageName).exists();
//    }
//    public void openBaiduNavi(Context context, String lat, String lng) {
//       // i1.setData(Uri.parse("baidumap://map/geocoder?src=openApiDemo&address=申迪南路"));
//        StringBuffer stringBuffer = new StringBuffer("baidumap://map/geocoder?location=")
//                .append(lat).append(",").append(lng).append("&type=TIME");
//        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(stringBuffer.toString()));
//        intent.setPackage("com.baidu.BaiduMap");
//        context.startActivity(intent);
//    }