android app调用第三方地图路线规划导航(百度,高德,腾

2017-10-19  本文已影响494人  星辉祝愿

因为直接使用高德的sdk提供的导航被投诉说不准,所以需要接第三方。 把BAT系的地图都接上了,有兄弟找到其他的地图调用方法告诉下小弟,一起完善。
工具类: MapRouteUtil

地图包名:

    public static String GAODE_MAP = "com.autonavi.minimap";
    public static String BAIDU_MAP = "com.baidu.BaiduMap";
    public static String TENXUN_MAP = "com.tencent.map";
    public static String GOOGLE_MAP = "com.google.android.apps.maps";

谷歌地图被墙了所以没有去接入。找到搜狗,凯立德等其他地图的调用告诉下我哈哈。

验证手机中是否安装了地图

public static boolean isInstalled(Context context, String packageName) {
        boolean installed = false;
        if (TextUtils.isEmpty(packageName)) {
            return false;
        }
        List<ApplicationInfo> installedApplications = context.getPackageManager().getInstalledApplications(0);
        for (ApplicationInfo in : installedApplications) {
            if (packageName.equals(in.packageName)) {
                installed = true;
                break;
            } else {
                installed = false;
            }
        }
        return installed;
    }

高德地图

http://lbs.amap.com/api/amap-mobile/guide/android/route

/**
     * 启动高德App进行路线规划导航 http://lbs.amap.com/api/amap-mobile/guide/android/route
     *
     * @param context
     * @param sourceApplication 必填 第三方调用应用名称。如 "appName"
     * @param sid
     * @param sla
     * @param slon
     * @param sname
     * @param did
     * @param dlat
     * @param dlon
     * @param dName
     * @param dev               起终点是否偏移(0:lat 和 lon 是已经加密后的,不需要国测加密; 1:需要国测加密)
     * @param t                 t = 0(驾车)= 1(公交)= 2(步行)= 3(骑行)= 4(火车)= 5(长途客车)
     *                          (骑行仅在V788以上版本支持)
     */
    public static void toGaoDeRoute(Context context, String sourceApplication
            , String sid, String sla, String slon, String sname
            , String did, String dlat, String dlon, String dName
            , String dev, String t) {
        StringBuffer stringBuffer = new StringBuffer("androidamap://route/plan?sourceApplication=").append(sourceApplication);
        if (!TextUtils.isEmpty(sid)) {
            stringBuffer.append("&sid=").append(sid);
        }
        if (!TextUtils.isEmpty(sla)) {
            stringBuffer.append("&sla=").append(sla);
        }
        if (!TextUtils.isEmpty(sla)) {
            stringBuffer.append("&sla=").append(sla);
        }
        if (!TextUtils.isEmpty(slon)) {
            stringBuffer.append("&slon=").append(slon);
        }
        if (!TextUtils.isEmpty(sname)) {
            stringBuffer.append("&sname=").append(sname);
        }
        if (!TextUtils.isEmpty(did)) {
            stringBuffer.append("&did=").append(did);
        }
        stringBuffer.append("&dlat=").append(dlat);
        stringBuffer.append("&dlon=").append(dlon);
        stringBuffer.append("&dName=").append(dName);
        stringBuffer.append("&dev=").append(dev);
        stringBuffer.append("&t=").append(t);


        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);

        //将功能Scheme以URI的方式传入data
        Uri uri = Uri.parse(stringBuffer.toString());
        intent.setData(uri);
        context.startActivity(intent);
    }

百度地图

http://lbsyun.baidu.com/index.php?title=uri/api/android

ps: 百度的坐标类型是:bd09 。如果使用高德的坐标 需要 转换坐标 或者 添加参数 coord_type=gcj02

 /**
     * 百度路线规划 URL接口:baidumap://map/direction
     *
     * @param context
     * @param origin             起点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示
     *                           origin和destination二者至少一个有值(默认值是当前定位地址)
     *                           经纬度: 39.9761,116.3282
     *                           经纬度和名称:
     *                           latlng:39.9761,116.3282|name:中关村 (注意:坐标先纬度,后经度)
     * @param destination        终点名称或经纬度,或者可同时提供名称和经纬度,此时经纬度优先级高,将作为导航依据,名称只负责展示。
     * @param mode               导航模式,可选transit(公交)、driving(驾车)、walking(步行)和riding(骑行).默认:driving
     * @param region             城市名或县名
     * @param origin_region      起点所在城市或县
     * @param destination_region 终点所在城市或县
     * @param sy                 公交检索策略,只针对mode字段填写transit情况下有效,值为数字。
     *                           0:推荐路线
     *                           2:少换乘
     *                           3:少步行
     *                           4:不坐地铁
     *                           5:时间短
     *                           6:地铁优先
     * @param index              公交结果结果项,只针对公交检索,值为数字,从0开始
     * @param target             0 图区,1 详情,只针对公交检索有效
     * @param coord_type         坐标类型,可选参数,默认为bd09经纬度坐标。
     *                           允许的值为bd09ll、bd09mc、gcj02、wgs84。
     *                           bd09ll表示百度经纬度坐标,
     *                           bd09mc表示百度墨卡托坐标,
     *                           gcj02表示经过国测局加密的坐标,
     *                           wgs84表示gps获取的坐标
     */
    private static void toBaiDuDirection(Context context, String origin, String destination, String mode
            , String region, String origin_region, String destination_region
            , String sy, String index, String target, String coord_type) {

        StringBuffer sb = new StringBuffer("baidumap://map/direction?mode=").append(mode);

        boolean isHasOrigin = false;
        boolean isHasdestination = false;
        if (!TextUtils.isEmpty(origin)) {
            isHasOrigin = true;
            sb.append("&origin=" + origin);
        }
        if (!TextUtils.isEmpty(destination)) {
            isHasdestination = true;
            sb.append("&destination=" + destination);
        }

        if (!isHasOrigin && !isHasdestination) {
            MyToast.showShort(context, " 请输入起点或目的地");
            return;
        }

        if (!TextUtils.isEmpty(region)) {
            sb.append("&region=" + region);
        }
        if (!TextUtils.isEmpty(origin_region)) {
            sb.append("&origin_region=" + origin_region);
        }
        if (!TextUtils.isEmpty(destination_region)) {
            sb.append("&destination_region=" + destination_region);
        }
        if (!TextUtils.isEmpty(sy)) {
            sb.append("&sy=" + sy);
        }
        if (!TextUtils.isEmpty(index)) {
            sb.append("&index=" + index);
        }
        if (!TextUtils.isEmpty(target)) {
            sb.append("&target=" + target);
        }
        if (!TextUtils.isEmpty(coord_type)) {
            sb.append("&coord_type=" + coord_type);
        }


        Intent i1 = new Intent();
        i1.setData(Uri.parse(sb.toString()));
        context.startActivity(i1);
    }

腾讯地图

uri地址 qqmap://map/routeplan
腾讯的uri在官网文档上的我是找不到的,后来被我在这里发现了:https://github.com/xujinyang/IntentMapGuide
官网也只有http的文档,所以就参考:http://lbs.qq.com/uri_v1/guide-route.html

/**
     * @param context
     * @param type      公交:bus
     *                  驾车:drive
     *                  步行:walk(仅适用移动端)
     * @param fromName
     * @param fromcoord fromcoord=39.873145,116.413306
     * @param toName
     * @param tocoord
     */
    public static void toTenCent(Context context, String type, String fromName, String fromcoord, String toName, String tocoord) {
        StringBuffer fromTo = new StringBuffer("qqmap://map/routeplan?type=");

        if (TextUtils.isEmpty(type))
            type = "drive";
        fromTo.append(type);

        if (!TextUtils.isEmpty(fromName))
            fromTo.append("&from=" + fromName);

        if (!TextUtils.isEmpty(fromcoord))
            fromTo.append("&fromcoord=" + fromcoord);

        if (!TextUtils.isEmpty(toName))
            fromTo.append("&to=" + toName);
        if (!TextUtils.isEmpty(tocoord))
            fromTo.append("&tocoord=" + tocoord);

         Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_DEFAULT);

        //将功能Scheme以URI的方式传入data
        intent.setData(Uri.parse( fromTo.toString() ));
        context.startActivity(intent);

    }

效果图

这是路线规划的效果图,如果想直接调用导航就自己去看文档改下方法名就可以了

Paste_Image.png
上一篇下一篇

猜你喜欢

热点阅读