高德地图---路径规划---语音导航的开发

原创 2015年11月20日 13:46:52

第一步导入高德地图导航开发包及对应的功能类

这里写图片描述

第二步路径规划的类继承导航的接口

Activity_NaviChoose extends Activity implements OnRouteSearchListener,AMapNaviListener

OnRouteSearchListener路径规划的接口
AMapNaviListener导航的接口

第三步路径规划

自驾路径规划

/**
     * 自驾路径规划
     */
    public void dringRoute() {
        Log.e("route", "--------------dringRoute---------------");
        RouteSearch routeSerch=new RouteSearch(Activity_NaviChoose.this);
        routeSerch.setRouteSearchListener(this);
        LatLonPoint start_lat=new LatLonPoint(la_start, ln_start); //起点
        LatLonPoint end_lat=new LatLonPoint(la_end,ln_end);//终点
        RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(
                start_lat, end_lat);
        DriveRouteQuery query = new DriveRouteQuery(fromAndTo, RouteSearch.DrivingDefault,
                null, null, "");// 第一个参数表示路径规划的起点和终点,第二个参数表示驾车模式,第三个参数表示途经点,第四个参数表示避让区域,第五个参数表示避让道路
        routeSerch.calculateDriveRouteAsyn(query);// 异步路径规划驾车模式查询   // 异步路径规划公交模式查询

    }

步行路径规划

/**
     * 步行路径规划
     */
    public void warkRoute() {
        Log.e("route", "--------------warkRoute---------------");
        RouteSearch routeSerch=new RouteSearch(Activity_NaviChoose.this);

        routeSerch.setRouteSearchListener(this);
        LatLonPoint start_lat=new LatLonPoint(la_start, ln_start); //定位本地坐标
        LatLonPoint end_lat=new LatLonPoint(la_end,ln_end);
        RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(
                start_lat, end_lat);
        WalkRouteQuery query=new WalkRouteQuery(fromAndTo, RouteSearch.WalkDefault);
        routeSerch.calculateWalkRouteAsyn(query);
    }

公交路径规划

public void busRoute() {
        RouteSearch routeSerch=new RouteSearch(Activity_NaviChoose.this);

        routeSerch.setRouteSearchListener(this);
        LatLonPoint start_lat=new LatLonPoint(la_start, ln_start); //定位本地坐标
        LatLonPoint end_lat=new LatLonPoint(la_end,ln_end);
        RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(
                start_lat, end_lat);
        //是否计算夜班车,默认为不计算。0:不计算,1:计算。可选
        BusRouteQuery query=new BusRouteQuery(fromAndTo, RouteSearch.BusDefault, "北京", 0);
        routeSerch.calculateBusRouteAsyn(query);
    }

第四步 添加路径规划回调方法–重写接口OnRouteSearchListener的方法

自驾回调

@Override
    public void onDriveRouteSearched(DriveRouteResult result, int rCode) {
        Log.e("route", "--------------onDriveRouteSearched---------------");
        if (rCode == 0) {
            if (result != null && result.getPaths() != null
                    && result.getPaths().size() > 0) {
                DriveRouteResult driveRouteResult = result;
                DrivePath drivePath = driveRouteResult.getPaths().get(0);
                aMap.clear();// 清理地图上的所有覆盖物
                DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(
                        this, aMap, drivePath, driveRouteResult.getStartPos(),
                        driveRouteResult.getTargetPos());
                drivingRouteOverlay.removeFromMap();
                drivingRouteOverlay.addToMap();
                drivingRouteOverlay.zoomToSpan();
                CodeToString(new LatLng(la_start, ln_start));
                CodeToString(new LatLng(la_end, ln_end));
            } else {
                Toast.makeText(getApplicationContext(), "对不起 没有搜索到相关数据", 0).show();
            }
        } else if (rCode == 27) {
            Toast.makeText(getApplicationContext(), "搜索失败 请检查网络连接", 0).show();

        } else if (rCode == 32) {
            Toast.makeText(getApplicationContext(), "验证无效", 0).show();

        } else {
            Toast.makeText(getApplicationContext()," 未知错误 请稍后重试 错误码为"+rCode, 0).show();

        }
    }

步行回调

@Override
    public void onWalkRouteSearched(WalkRouteResult result, int rCode) {
        Log.e("route", "--------------onWalkRouteSearched---------------");
        if (rCode == 0) {
            if (result != null && result.getPaths() != null
                    && result.getPaths().size() > 0) {
                WalkRouteResult  walkRouteResult = result;
                WalkPath walkPath = walkRouteResult.getPaths().get(0);
                aMap.clear();// 清理地图上的所有覆盖物
                WalkRouteOverlay walkRouteOverlay = new WalkRouteOverlay(this,
                        aMap, walkPath, walkRouteResult.getStartPos(),
                        walkRouteResult.getTargetPos());
                walkRouteOverlay.removeFromMap();
                walkRouteOverlay.addToMap();
                walkRouteOverlay.zoomToSpan();
                CodeToString(new LatLng(la_start, ln_start));
                CodeToString(new LatLng(la_end, ln_end));
            } else {
                Toast.makeText(getApplicationContext(), "对不起 没有搜索到相关数据", 0).show();
            }
        } else if (rCode == 27) {
            Toast.makeText(getApplicationContext(), "搜索失败 请检查网络连接", 0).show();
        } else if (rCode == 32) {
            Toast.makeText(getApplicationContext(), "验证无效", 0).show();
        } else {
            Toast.makeText(getApplicationContext()," 未知错误 请稍后重试 错误码为"+rCode, 0).show();
        }
    }

公交回调

@Override
    public void onBusRouteSearched(BusRouteResult result, int rCode) {
        Log.e("route", "--------------onBusRouteSearched---------------");
        if (rCode == 0) {
            if (result != null && result.getPaths() != null
                    && result.getPaths().size() > 0) {
                BusRouteResult busRouteResult = result;
                BusPath busPath = busRouteResult.getPaths().get(0);
                //获取公交换乘路段列表
                List<BusStep> steps = busPath.getSteps();

                StringBuffer showBusLine = showBusLine(steps);
                String string = showBusLine.toString().substring(0, showBusLine.toString().length()-6);
                saveNaviLine(string,"gj");
                Log.e("公交线路", string);

                aMap.clear();// 清理地图上的所有覆盖物
                BusRouteOverlay routeOverlay = new BusRouteOverlay(this, aMap,
                        busPath,busRouteResult.getStartPos(),
                    busRouteResult.getTargetPos()
                        );
                routeOverlay.removeFromMap();
                routeOverlay.addToMap();
                routeOverlay.zoomToSpan();
            } else {
                Toast.makeText(getApplicationContext(), "对不起 没有搜索到相关数据", 0).show();
            }
        } else if (rCode == 27) {
            Toast.makeText(getApplicationContext(), "搜索失败 请检查网络连接", 0).show();
        } else if (rCode == 32) {
            Toast.makeText(getApplicationContext(), "验证无效", 0).show();
        } else {
            Toast.makeText(getApplicationContext()," 未知错误 请稍后重试 错误码为"+rCode, 0).show();
        }
    }

其中公交可以获取站点的信息

/**
     * @param steps
     * 分析公交线路
     */
    private StringBuffer showBusLine(List<BusStep> steps) {
        sb.delete(0,sb.length());
        Log.e("公交路段数量", "----------------------"+steps.size());
        for(int i=0;i<steps.size();i++){
            BusStep busStep = steps.get(i);

            RouteBusLineItem busLine = busStep.getBusLine(); //获取公交导航信息

            //System.out.println("-------------------"+busLine.toString()); 地铁1号线(四惠东--苹果园) 05:05-23:15
            if(busLine!=null && !busLine.equals(null)){
                Log.e("公交站名称", "--------------"+busLine.getBusLineName());
                BusStationItem arrivalBusStation = busLine.getArrivalBusStation();//到达站
                BusStationItem departureBusStation = busLine.getDepartureBusStation();//出发站

                String busStationName = arrivalBusStation.getBusStationName();//到达站公交站名称
                String busStationName2 = departureBusStation.getBusStationName();//出发站公交站名称

                Log.e("公交",busLine.getBusLineName()+"到达"+busStationName);
                //Log.e("站名","到达站公交站名称"+busStationName+"出发站公交站名称"+busStationName2);
                sb.append(busLine.getBusLineName()+"到达"+busStationName+"--换乘--");
            }else{
                Log.e("null", "------------busStep.getBusLine().equals(null)---------------------");
            }

        }

        return sb;

    }

第五步 添加自驾和步行的导航

第一步 注册导航和语音

可以在oncreate()方法中注册

 //语音播报开始
        TTSController ttsManager = TTSController.getInstance(this);// 初始化语音模块
        ttsManager.init();
        AMapNavi.getInstance(this).setAMapNaviListener(ttsManager);// 设置语音模块播报

        TTSController.getInstance(this).startSpeaking();

        //导航注册
        AMapNavi.getInstance(this).setAMapNaviListener(this);

第二部 开启导航的方法

/**
     * 开启导航的方法
     */
    public void StartNavi(int i) {
        Log.e("navi", "-----------StartNavi-------------");
        //起点终点
         NaviLatLng mNaviStart = new NaviLatLng(la_start, ln_start);
         NaviLatLng mNaviEnd = new NaviLatLng(la_end,ln_end);
        //起点终点列表
         ArrayList<NaviLatLng> mStartPoints = new ArrayList<NaviLatLng>();
         ArrayList<NaviLatLng> mEndPoints = new ArrayList<NaviLatLng>();
         mStartPoints.add(mNaviStart);
         mEndPoints.add(mNaviEnd);

         if(i==1){  //自驾    起点  终点  途经点  模式:最快  最省钱等
             AMapNavi.getInstance(this).setAMapNaviListener(this);
             AMapNavi.getInstance(this).calculateDriveRoute(mStartPoints,
                        mEndPoints, null, AMapNavi.DrivingDefault);
         }else{  //步行
             AMapNavi.getInstance(this).calculateWalkRoute(mNaviStart, mNaviEnd); 
         }



    }

第三步 导航的回调,重写导航接口AMapNaviListener的方法

其中这个方法标志着导航成功调用导航页面

@Override
    public void onCalculateRouteSuccess() {
        Log.e("Navi", "-------onCalculateRouteSuccess--------------------");

        Intent intent = new Intent(Activity_NaviChoose.this,
                SimpleNaviActivity.class);  //导航页面
        intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        Bundle bundle=new Bundle();
        bundle.putInt(Utils.ACTIVITYINDEX, Utils.SIMPLEGPSNAVI);
        bundle.putBoolean(Utils.ISEMULATOR, false);
        intent.putExtras(bundle);
        startActivity(intent);

    }

添加导航页面布局及相关参数

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
   <com.amap.api.navi.AMapNaviView
        android:id="@+id/simplenavimap"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       />

</LinearLayout>
<string name="preference_default_tts_role">xiaoyan</string>
    <string name="preference_key_tts_speed">tts_speed</string>
    <string name="preference_title_tts_speed">语速</string>
    <string name="preference_default_tts_speed">50</string>
    <string name="preference_dialog_title_tts_speed">选择语速</string>
    <string name="preference_key_tts_volume">tts_volume</string>
    <string name="preference_title_tts_volume">音量</string>
    <string name="preference_default_tts_volume">50</string>
    <string name="preference_dialog_title_tts_volume">选择音量</string>
    <string name="preference_key_tts_pitch">tts_pitch</string>
    <string name="preference_title_tts_pitch">语调</string>
    <string name="preference_default_tts_pitch">50</string>
      <string name="app_id">5613985e</string>

最后处理一下导航页面类的返回按钮跳转回哪个页面即可

Android 高德地图集成 地图展示+定位+路线规划+各种原有图标的隐藏处理

先占坑

关于Android高德导航的简单demo

。。。。。刚写了地图的,再来个导航的吧 导航其实,个人感觉,比地图更容易写。。。毕竟,地图中控件太多,而简单的导航只需要回调数据即可。。 话不多说。。干货直接上。。 im...

高的地图之导航:

在移动互联飞速发展的今天!O2O的崛起,许多应用都离不开可导航功能!经过几天的学习,今天把所学所想些一下。以供分享: 高德地图的基本配置请看我的第一篇博客,百度地图之定位 1.首先下载高德提供的S...

更新高德地图语音模块

使用安卓sdk 24 编译官方导航Demo崩溃解决办法

百度语音SDK使用

百度语音SDK提供: 语音识别:将声音转成文字 语音合成:将文字转成语音文件,然后播放语音文件,即文字变声音。 语音唤醒:语音唤醒,激活运用程序...

安卓高德地图开发之引入导航功能

安卓高德地图开发之引入导航功能实现

Android开发实现高德地图定位详解

一、 要实现高德地图定位呢,首先需要做好以下几步准备: 1. 在高德开放平台注册帐号 注册地址:http://lbs.amap.com 2. 在开发中下载Android平台下的...
  • Mr_wzc
  • Mr_wzc
  • 2016年05月26日 18:40
  • 25760

高德地图使用(一)--定位

现在的app中经常会用到对地图的调用,包括定位以及导航等,这里我们公司所做的项目里,我同ios部讨论了一段时间,还是选择高德地图吧,高德相对百度而言地图内容更加丰富,接口更加有好一点,精确度更高一定。...
  • lansus
  • lansus
  • 2015年12月03日 15:51
  • 5354

高德地图定位及导航开发流程

关于高德地图导航定位及导航 最进简单研究了一下关于高德地图的使用,,简单实现了定位搜素,以及驾车的路径规划,一下将介绍我的实现过程: 先展示一下实现的简单效果: 首先需要进行配置,配置详情如下:...
  • wannaj
  • wannaj
  • 2017年08月07日 20:32
  • 453

Android 使用高德SDK实现导航笔记

Demo效果图: 实现逻辑: 首先使用检索功能获取目的地的经纬度作为终点,使用定位功能获取当前位置的经纬度作为起点。然后将起始点传递给导航模块就可以了。 主要代码:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高德地图---路径规划---语音导航的开发
举报原因:
原因补充:

(最多只允许输入30个字)