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

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

这里写图片描述

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

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>

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

猜你喜欢

转载自blog.csdn.net/shuiermengqi/article/details/49946473