Android 打開高德地圖、百度地圖進行導航;打開第三方App去導航;

抽成工具類了,複製下來就能直接用了,直接看代碼吧;php

高德地圖Url Api: http://lbs.amap.com/api/amap-mobile/guide/android/navigationhtml

百度地圖Url Api:http://lbsyun.baidu.com/index.php?title=uri/api/androidandroid

/**
 * Created by ChenboCui on 2018/6/5.
 */
public class MapNaviUtils {
    public static final String PN_GAODE_MAP = "com.autonavi.minimap"; // 高德地圖包名
    public static final String PN_BAIDU_MAP = "com.baidu.BaiduMap"; // 百度地圖包名
    public static final String DOWNLOAD_GAODE_MAP = "http://www.autonavi.com/"; // 高德地圖下載地址
    public static final String DOWNLOAD_BAIDU_MAP = "http://map.baidu.com/zt/client/index/"; // 百度地圖下載地址

    /**
     * 檢查應用是否安裝
     * @return
     */
    public static boolean isGdMapInstalled(){
        return isInstallPackage(PN_GAODE_MAP);
    }
    public static boolean isBaiduMapInstalled(){
        return isInstallPackage(PN_BAIDU_MAP);
    }
    private static boolean isInstallPackage(String packageName) {
        return new File("/data/data/" + packageName).exists();
    }

    /**
     * 百度座標系 (BD-09) 與 火星座標系 (GCJ-02)的轉換
     * 即 百度 轉 谷歌、高德
     *
     * @param latLng
     * @returns
     */
    public static LatLng BD09ToGCJ02(LatLng latLng) {
        double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
        double x = latLng.longitude - 0.0065;
        double y = latLng.latitude - 0.006;
        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
        double gg_lat = z * Math.sin(theta);
        double gg_lng = z * Math.cos(theta);
        return new LatLng(gg_lat, gg_lng);
    }

    /**
     * 火星座標系 (GCJ-02) 與百度座標系 (BD-09) 的轉換
     * 即谷歌、高德 轉 百度
     *
     * @param latLng
     * @returns
     */
    public static LatLng GCJ02ToBD09(LatLng latLng) {
        double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
        double z = Math.sqrt(latLng.longitude * latLng.longitude + latLng.latitude * latLng.latitude) + 0.00002 * Math.sin(latLng.latitude * x_pi);
        double theta = Math.atan2(latLng.latitude, latLng.longitude) + 0.000003 * Math.cos(latLng.longitude * x_pi);
        double bd_lat = z * Math.sin(theta) + 0.006;
        double bd_lng = z * Math.cos(theta) + 0.0065;
        return new LatLng(bd_lat, bd_lng);
    }

    /**
     * 打開高德地圖導航功能
     * @param context
     * @param slat 起點緯度
     * @param slon 起點經度
     * @param sname 起點名稱 可不填(0,0,null)
     * @param dlat 終點緯度
     * @param dlon 終點經度
     * @param dname 終點名稱 必填
     */
    public static void openGaoDeNavi(Context context,double slat, double slon, String sname, double dlat, double dlon, String dname){
        String uriString = null;
        StringBuilder builder = new StringBuilder("amapuri://route/plan?sourceApplication=maxuslife");
        if (0 == slat){
//            //若是不傳起點(註釋下面這段),默認就是如今個人位置(手機當前定位)
//            AMapLocation location = LocationService.getInstance().getAMapLocation();
//            if (LocationService.isSuccess(location)) {
//                builder.append("&sname=個人位置")
//                        .append("&slat=").append(location.getLatitude())
//                        .append("&slon=").append(location.getLongitude());
//            }
        }else {
            builder.append("&sname=").append(sname)
                    .append("&slat=").append(slat)
                    .append("&slon=").append(slon);
        }
        builder.append("&dlat=").append(dlat)
                .append("&dlon=").append(dlon)
                .append("&dname=").append(dname)
                .append("&dev=0")
                .append("&t=0");
        uriString = builder.toString();
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setPackage(PN_GAODE_MAP);
        intent.setData(Uri.parse(uriString));
        context.startActivity(intent);
    }

    /**
     * 打開百度地圖導航功能(默認座標點是高德地圖,須要轉換)
     * @param context
     * @param slat 起點緯度
     * @param slon 起點經度
     * @param sname 起點名稱 可不填(0,0,null)
     * @param dlat 終點緯度
     * @param dlon 終點經度
     * @param dname 終點名稱 必填
     */
    public static void openBaiDuNavi(Context context,double slat, double slon, String sname, double dlat, double dlon, String dname){
        String uriString = null;
        //終點座標轉換
        LatLng destination = new LatLng(dlat,dlon);
        LatLng destinationLatLng = GCJ02ToBD09(destination);
        dlat = destinationLatLng.latitude;
        dlon = destinationLatLng.longitude;

        StringBuilder builder = new StringBuilder("baidumap://map/direction?mode=driving&");
        if (slat != 0){
            //起點座標轉換
            LatLng origin = new LatLng(slat,slon);
            LatLng originLatLng = GCJ02ToBD09(origin);
            slat = originLatLng.latitude;
            slon = originLatLng.longitude;

            builder.append("origin=latlng:")
                    .append(slat)
                    .append(",")
                    .append(slon)
                    .append("|name:")
                    .append(sname);
        }
        builder.append("&destination=latlng:")
                .append(dlat)
                .append(",")
                .append(dlon)
                .append("|name:")
                .append(dname);
        uriString = builder.toString();
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setPackage(PN_BAIDU_MAP);
        intent.setData(Uri.parse(uriString));
        context.startActivity(intent);
    }
}

 

使用:git

 

 

public void test(View v){
        new SingleSelectDialog.Builder(mContext)
                .setTestSize(16)
                .setTextColor(R.color.colorPrimaryDark)
                .setItems(R.array.navi_arrays, (dialog, which) -> {
                    if (which == 0) { // 導航應用1高德
                        if (MapNaviUtils.isGdMapInstalled()) {
                            MapNaviUtils.openGaoDeNavi(mContext,0,0,null,31.239666,121.499809,"上海外灘");
//                            MapUtils.openMap(mContext,"com.autonavi.minimap",new LatLng(31.33260711060764,121.54777721524306,"CCB"));
                        }else {
                            UIHelper.showToast("您還未安裝高德地圖!");
                            new AlertDialog.Builder(this)
                                    .setMessage("下載高德地圖?")
                                    .setPositiveButton("下載", (dialog1, which1) -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(MapNaviUtils.DOWNLOAD_GAODE_MAP))))
                                    .setNegativeButton(R.string.cancel, null)
                                    .show();
                        }
                    } else if (which == 1) { // 導航應用2百度
                        if (MapNaviUtils.isBaiduMapInstalled()){
                            MapNaviUtils.openBaiDuNavi(mContext,0,0,null,31.239666,121.499809,"上海外灘");
//                            MapUtils.openMap(mContext,"com.baidu.BaiduMap",new LatLng(31.33260715160764,121.54777723124306,"CCB"));
                        }else {
                            UIHelper.showToast("您還未安裝百度地圖!");
                            new AlertDialog.Builder(this)
                                    .setMessage("下載百度地圖?")
                                    .setNegativeButton("取消", null)
                                    .setPositiveButton("下載", (dialog12, which12) -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(MapNaviUtils.DOWNLOAD_BAIDU_MAP))))
                                    .show();
                        }
                    }
                })
                .setHead("地圖應用")
                .show();
    }
相關文章
相關標籤/搜索