简介:
公司的项目用到了高德的导航功能,所以自己总结了一下高德的导航,希望对大家有所帮助。该功能集成了高德的导航和讯飞的语音播报。
集成步骤:
1) 到高德地图官网,申请账号和KEY, 进行集成
添加依赖,并且在app目录下的build,gradle文件中配置:
2) 在清单文件中添加权限以及配置:
这是配置的步骤。
3) 功能的实现,废话少说,直接上代码;
public class MainActivity extends Activity implements AMapNaviListener, View.OnClickListener, CompoundButton.OnCheckedChangeListener,LocationSource, AMapLocationListener { private boolean congestion, cost, hightspeed, avoidhightspeed; //筛选路线条件 /** * 导航对象(单例) */ private AMapNavi mAMapNavi; private AMap mAmap; /** * 地图对象 */ private MapView mRouteMapView; private Marker mStartMarker; private Marker mEndMarker; /** * 选择起点Action标志位 */ private boolean mapClickStartReady; /** * 选择终点Aciton标志位 */ private boolean mapClickEndReady; private NaviLatLng endLatlng = new NaviLatLng(39.955846, 116.352765); private NaviLatLng startLatlng = new NaviLatLng(39.925041, 116.437901); private List<NaviLatLng> startList = new ArrayList<NaviLatLng>(); /** * 途径点坐标集合 */ private List<NaviLatLng> wayList = new ArrayList<NaviLatLng>(); /** * 终点坐标集合[建议就一个终点] */ private List<NaviLatLng> endList = new ArrayList<NaviLatLng>(); /** * 保存当前算好的路线 */ private SparseArray<RouteOverLay> routeOverlays = new SparseArray<RouteOverLay>(); /** * 当前用户选中的路线,在下个页面进行导航 */ private int routeIndex; /**路线的权值,重合路线情况下,权值高的路线会覆盖权值低的路线**/ private int zindex = 1; /** * 路线计算成功标志位 */ private boolean calculateSuccess = false; //路线计算状态 private boolean chooseRouteSuccess = false; //路径选择状态 private boolean mFirstFix=false; //记录是否第一次定位 private AMapLocationClient mlocationClient; //定位服务类 private AMapLocationClientOption mLocationOption; //设置定位参数 private OnLocationChangedListener mListener; private final int SDK_PERMISSION = 1; //申请权限 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRouteMapView = (MapView) findViewById(R.id.navi_view); mRouteMapView.onCreate(savedInstanceState); mAmap = mRouteMapView.getMap(); init(); //调用初始化控件方法 getPersimmions(); //获取定位动态权限 } /** * 初始化控件 */ private void init() { //获取布局文件中的控件 CheckBox congestion = (CheckBox) findViewById(R.id.congestion); CheckBox cost = (CheckBox) findViewById(R.id.cost); CheckBox hightspeed = (CheckBox) findViewById(R.id.hightspeed); CheckBox avoidhightspeed = (CheckBox) findViewById(R.id.avoidhightspeed); Button calculate = (Button) findViewById(R.id.calculate); Button startPoint = (Button) findViewById(R.id.startpoint); Button endPoint = (Button) findViewById(R.id.endpoint); Button selectroute = (Button) findViewById(R.id.selectroute); Button gpsnavi = (Button) findViewById(R.id.gpsnavi); //设置控件的单击事件 calculate.setOnClickListener(this); startPoint.setOnClickListener(this); endPoint.setOnClickListener(this); selectroute.setOnClickListener(this); gpsnavi.setOnClickListener(this); //复选框事件 congestion.setOnCheckedChangeListener(this); cost.setOnCheckedChangeListener(this); hightspeed.setOnCheckedChangeListener(this); avoidhightspeed.setOnCheckedChangeListener(this); /** * 地图单击事件,实现在地图中选择起点与终点 */ mAmap.setOnMapClickListener(new AMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { //控制选起点 if (mapClickStartReady) { //设置选中起点的坐标 startLatlng = new NaviLatLng(latLng.latitude, latLng.longitude); mStartMarker.setPosition(latLng); //在起点坐标位置绘制起点图标 startList.clear(); //清除起点坐标 startList.add(startLatlng); //保存起点坐标 mapClickStartReady = false; //设置起点标志状态 } //控制选终点 if (mapClickEndReady) { endLatlng = new NaviLatLng(latLng.latitude, latLng.longitude); mEndMarker.setPosition(latLng); endList.clear(); endList.add(endLatlng); mapClickEndReady = false; } } }); StartMarker(); //获取起点图标 EndMarker(); //获取终点图标 //创建导航对象 mAMapNavi = AMapNavi.getInstance(getApplicationContext()); mAMapNavi.addAMapNaviListener(this); //添加导航事件回调监听 setUpMap(); //调用设置地图属性方法 } //获取起点图标 private void StartMarker() { // 获取设置起点的图标 mStartMarker = mAmap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory .fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.start)))); } //获取终点图标 private void EndMarker() { mEndMarker = mAmap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory .fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.end)))); } /** * 添加定位动态权限 */ private void getPersimmions() { /*** * 定位权限为必须权限,用户如果禁止,则每次进入都会申请 */ if (Build.VERSION.S