第一步导入高德地图导航开发包及对应的功能类
第二步路径规划的类继承导航的接口
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>
最后处理一下导航页面类的返回按钮跳转回哪个页面即可