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

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

作者: 星辉祝愿 | 来源:发表于2017-10-19 15:05 被阅读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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/dliuuxtx.html