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

原创 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---高德地图(5)导航界面(语音播报)实现

配置工程:实现语音播报的功能需要到科大讯飞官网下载相应的sdk,目前使用到的是语音合成功能(将文本内容转换成语音) 将对应的配置文件复制保存到Libs目录下。添加相应的权限和appkey     ...
  • u012360883
  • u012360883
  • 2016年04月27日 19:58
  • 2473

Android Studio建立百度地图步骤及导航无语音解决方法

1、新建一个项目,取得android studio的sha1值(android studio的终端输入一行shell命令:keytool -v -list -keystore debug.keysto...
  • chenli_001
  • chenli_001
  • 2017年04月21日 18:28
  • 950

更新高德地图语音模块

使用安卓sdk 24 编译官方导航Demo崩溃解决办法
  • guchuanhang
  • guchuanhang
  • 2016年07月10日 10:56
  • 4027

接入高德 SDK 遇到的问题 01:语音导航中科大讯飞在线语音合成次数限制

需求:采用高德导航SDK实现路线导航,并且实现语音播报导航 问题:高德导航语音合成开发指南中建议采用的科大讯飞在线语音合成存在次数限制,远远达不到生产环境的需求量 解决:采用百度离在线语音识别 A...
  • zeqiao
  • zeqiao
  • 2018年01月02日 15:40
  • 201

浅谈百度地图的简单开发最后收官之实现导航功能(五)

这篇是高仿百度地图的最后一篇了,今天主要来实现百度地图的导航的功能,并且该导航还自带语音播报功能,然后最后对整个百度地图开发过程遇到的问题进行一些列举,并给出一些解决的办法,可能总结的不是很齐全,希望...
  • u013064109
  • u013064109
  • 2016年03月21日 23:33
  • 10994

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

第一步导入高德地图导航开发包及对应的功能类第二步路径规划的类继承导航的接口Activity_NaviChoose extends Activity implements OnRouteSearchLi...
  • shuiermengqi
  • shuiermengqi
  • 2015年11月20日 13:46
  • 4385

iOS开发中使用百度地图计算两点间的距离

我们在使用到百度地图的项目中可能会需要计算两点间的距离,我们可以很容易通过百度地图的开发文档中找到计算两点间距离的方法: BMKMapPoint point1 = BMKMapPointFo...
  • u010105969
  • u010105969
  • 2017年05月18日 10:21
  • 1924

高德地图驾车路径规划详情获取

用到这个功能,花了不少时间,还是在大神的指点下才弄出来。没办法毕竟菜鸟一个,原来没有写博客的习惯,从来都是看大神的,然后去用,现在开始记录一下吧,。。。。菜鸟博客,有不对的地方轻喷。。。从高德的sdk...
  • qq_35400125
  • qq_35400125
  • 2016年07月13日 10:25
  • 2050

Android高德地图步行路径规划错乱的问题解决[问题一]

因为最近项目需求要做地图,用的是高德的。需要在两点之间规划步行路径。 但是在开发中遇到了些比较蛋疼的问题。做次记录以备日后查阅。 我用的是高德4.11版本的3d地图 问题一: 步行路径规划,当终点...
  • w1383202
  • w1383202
  • 2016年10月23日 20:11
  • 1510

iOS高德地图使用-搜索,路径规划

最近赶项目,好久没更新。抽出时间把高德地图的搜索和路径规划整理一下 项目中想加入地图功能,使用高德地图第三方,想要实现确定一个位置,搜索路线并且显示的方法。耗了一番功夫,总算实现了。一、配置工作1....
  • u010330109
  • u010330109
  • 2016年05月06日 11:52
  • 2914
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高德地图---路径规划---语音导航的开发
举报原因:
原因补充:

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