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

来源:互联网 发布:js正则判断是否为数字 编辑:程序博客网 时间:2024/05/18 22:41

    高德地图导航添加需要添加特定的navi包。

    高德地图开发中添加导航功能的简单实现原理是引入自定义起点和终点数据后调用官方给出的demo代码。

    首先需要一个baseactivity类,给出代码:

package com.example.maptest;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.Window;import android.widget.Toast;import com.amap.api.navi.AMapNavi;import com.amap.api.navi.AMapNaviListener;import com.amap.api.navi.AMapNaviView;import com.amap.api.navi.AMapNaviViewListener;import com.amap.api.navi.model.AMapLaneInfo;import com.amap.api.navi.model.AMapNaviCross;import com.amap.api.navi.model.AMapNaviInfo;import com.amap.api.navi.model.AMapNaviLocation;import com.amap.api.navi.model.AMapNaviStaticInfo;import com.amap.api.navi.model.AMapNaviTrafficFacilityInfo;import com.amap.api.navi.model.AimLessModeCongestionInfo;import com.amap.api.navi.model.AimLessModeStat;import com.amap.api.navi.model.NaviInfo;import com.amap.api.navi.model.NaviLatLng;import com.amap.navi.demo.util.TTSController;import com.autonavi.tbt.NaviStaticInfo;import com.autonavi.tbt.TrafficFacilityInfo;import java.util.ArrayList;import java.util.List;public class BaseActivity extends Activity implements AMapNaviListener,AMapNaviViewListener {protected AMapNaviView mAMapNaviView;protected AMapNavi mAMapNavi;protected TTSController mTtsManager;protected NaviLatLng mEndLatlng = new NaviLatLng(32.1194970000,118.9709290000);protected NaviLatLng mStartLatlng = new NaviLatLng(32.0865760000,118.7775490000);protected final List<NaviLatLng> sList = new ArrayList<NaviLatLng>();protected final List<NaviLatLng> eList = new ArrayList<NaviLatLng>();protected List<NaviLatLng> mWayPointList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);// 实例化语音引擎mTtsManager = TTSController.getInstance(getApplicationContext());mTtsManager.init();//mAMapNavi = AMapNavi.getInstance(getApplicationContext());mAMapNavi.addAMapNaviListener(this);mAMapNavi.addAMapNaviListener(mTtsManager);// 设置模拟导航的行车速度mAMapNavi.setEmulatorNaviSpeed(75);sList.add(mStartLatlng);eList.add(mEndLatlng);}@Overrideprotected void onResume() {super.onResume();mAMapNaviView.onResume();}@Overrideprotected void onPause() {super.onPause();mAMapNaviView.onPause();// 仅仅是停止你当前在说的这句话,一会到新的路口还是会再说的mTtsManager.stopSpeaking();//// 停止导航之后,会触及底层stop,然后就不会再有回调了,但是讯飞当前还是没有说完的半句话还是会说完// mAMapNavi.stopNavi();}@Overrideprotected void onDestroy() {super.onDestroy();mAMapNaviView.onDestroy();// since 1.6.0 不再在naviview destroy的时候自动执行AMapNavi.stopNavi();请自行执行mAMapNavi.stopNavi();mAMapNavi.destroy();mTtsManager.destroy();}@Overridepublic void onInitNaviFailure() {Toast.makeText(this, "init navi Failed", Toast.LENGTH_SHORT).show();}@Overridepublic void onInitNaviSuccess() {// 初始化成功}@Overridepublic void onStartNavi(int type) {// 开始导航回调}@Overridepublic void onTrafficStatusUpdate() {//}@Overridepublic void onLocationChange(AMapNaviLocation location) {// 当前位置回调}@Overridepublic void onGetNavigationText(int type, String text) {// 播报类型和播报文字回调}@Overridepublic void onEndEmulatorNavi() {// 结束模拟导航}@Overridepublic void onArriveDestination() {// 到达目的地}@Overridepublic void onArriveDestination(NaviStaticInfo naviStaticInfo) {// 到达目的地,有统计信息回调}@Overridepublic void onArriveDestination(AMapNaviStaticInfo aMapNaviStaticInfo) {}@Overridepublic void onCalculateRouteSuccess() {// 路线计算成功}@Overridepublic void onCalculateRouteFailure(int errorInfo) {// 路线计算失败Log.i("dm", "errorInfo=" + errorInfo);Toast.makeText(this, "错误信息:" + errorInfo, Toast.LENGTH_SHORT).show();}@Overridepublic void onReCalculateRouteForYaw() {// 偏航后重新计算路线回调}@Overridepublic void onReCalculateRouteForTrafficJam() {// 拥堵后重新计算路线回调}@Overridepublic void onArrivedWayPoint(int wayID) {// 到达途径点}@Overridepublic void onGpsOpenStatus(boolean enabled) {// GPS开关状态回调}@Overridepublic void onNaviSetting() {// 底部导航设置点击回调}@Overridepublic void onNaviMapMode(int isLock) {// 地图的模式,锁屏或锁车}@Overridepublic void onNaviCancel() {finish();}@Overridepublic void onNaviTurnClick() {// 转弯view的点击回调}@Overridepublic void onNextRoadClick() {// 下一个道路View点击回调}@Overridepublic void onScanViewButtonClick() {// 全览按钮点击回调}@Deprecated@Overridepublic void onNaviInfoUpdated(AMapNaviInfo naviInfo) {// 过时}@Overridepublic void onNaviInfoUpdate(NaviInfo naviinfo) {// 导航过程中的信息更新,请看NaviInfo的具体说明}@Overridepublic void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) {// 已过时}@Overridepublic void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) {// 已过时}@Overridepublic void showCross(AMapNaviCross aMapNaviCross) {// 显示转弯回调}@Overridepublic void hideCross() {// 隐藏转弯回调}@Overridepublic void showLaneInfo(AMapLaneInfo[] laneInfos,byte[] laneBackgroundInfo, byte[] laneRecommendedInfo) {// 显示车道信息}@Overridepublic void hideLaneInfo() {// 隐藏车道信息}@Overridepublic void onCalculateMultipleRoutesSuccess(int[] ints) {// 多路径算路成功回调}@Overridepublic void notifyParallelRoad(int i) {if (i == 0) {Toast.makeText(this, "当前在主辅路过渡", Toast.LENGTH_SHORT).show();Log.d("wlx", "当前在主辅路过渡");return;}if (i == 1) {Toast.makeText(this, "当前在主路", Toast.LENGTH_SHORT).show();Log.d("wlx", "当前在主路");return;}if (i == 2) {Toast.makeText(this, "当前在辅路", Toast.LENGTH_SHORT).show();Log.d("wlx", "当前在辅路");}}@Overridepublic void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) {// 更新交通设施信息}@Overridepublic void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) {// 更新巡航模式的统计信息}@Overridepublic void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) {// 更新巡航模式的拥堵信息}@Overridepublic void onLockMap(boolean isLock) {// 锁地图状态发生变化时回调}@Overridepublic void onNaviViewLoaded() {Log.d("wlx", "导航页面加载成功");Log.d("wlx","请不要使用AMapNaviView.getMap().setOnMapLoadedListener();会overwrite导航SDK内部画线逻辑");}@Overridepublic boolean onNaviBackClick() {return false;}}
    在我们自己定义的导航类中,我们需要继承baseactivity类来实现功能,给出GPSNaviActivity类代码:

package com.example.maptest;import android.content.Intent;import android.os.Bundle;import android.util.Log;import com.amap.api.navi.AMapNaviView;import com.amap.api.navi.enums.NaviType;import com.amap.api.navi.model.NaviLatLng;public class GPSNaviActivity extends BaseActivity {// 继承的是baseactivityprivate double sj;private double sw;private double ej;private double ew;private String ssj;private String ssw;private String sej;private String sew;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.e("导航", "进入导航界面");Intent intent = getIntent();  /* 11/17 记 再次重复低级错误 此处intent接收了未传输的数据导致崩溃 *//* 经纬度 纬度在前 */ssj = intent.getStringExtra("sj");sj = Double.parseDouble(ssj);ssw = intent.getStringExtra("sw");sw = Double.parseDouble(ssw);sej = intent.getStringExtra("ej");ej = Double.parseDouble(sej);sew = intent.getStringExtra("ew");ew = Double.parseDouble(sew);Log.e("导航", "获取数据完毕");setContentView(R.layout.activity_basic_navi);mAMapNaviView = (AMapNaviView) findViewById(R.id.navi_view);mAMapNaviView.onCreate(savedInstanceState);mAMapNaviView.setAMapNaviViewListener(this);}@Overridepublic void onInitNaviSuccess() {super.onInitNaviSuccess();/** * 方法: int strategy=mAMapNavi.strategyConvert(congestion, * avoidhightspeed, cost, hightspeed, multipleroute); 参数: *  * @congestion 躲避拥堵 * @avoidhightspeed 不走高速 * @cost 避免收费 * @hightspeed 高速优先 * @multipleroute 多路径 *  *                说明: 以上参数都是boolean类型,其中multipleroute参数表示是否多条路线, *                如果为true则此策略会算出多条路线。 注意: 不走高速与高速优先不能同时为true *                高速优先与避免收费不能同时为true */// 重置起点this.sList.clear();this.mStartLatlng = new NaviLatLng(sw, sj);this.sList.add(mStartLatlng);// 重置了终点this.eList.clear();this.mEndLatlng = new NaviLatLng(ew, ej);this.eList.add(mEndLatlng);int strategy = 0;try {// 再次强调,最后一个参数为true时代表多路径,否则代表单路径strategy = mAMapNavi.strategyConvert(true, false, false, false,false);} catch (Exception e) {e.printStackTrace();}mAMapNavi.calculateDriveRoute(sList, eList, mWayPointList, strategy);}@Overridepublic void onCalculateRouteSuccess() {super.onCalculateRouteSuccess();mAMapNavi.startNavi(NaviType.GPS);}}
    在上述代码中,我根据前一页面传入的起点和终点的值调用gps导航,具体原理参见代码。

    特记下,以备后日回顾。


1 0
原创粉丝点击