高德官方API:官方地址
2d地图、添加覆盖物、搜索路线规划、跳转本地安装的导航
效果图:
显示宝贝位置
导航(判断手机是否安装了百度和高德地图)
跳转百度地图
展示路线
主要代码:
package com.hj.locationtest;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import com.amap.api.maps2d.AMap;
import com.amap.api.maps2d.CameraUpdateFactory;
import com.amap.api.maps2d.MapView;
import com.amap.api.maps2d.model.BitmapDescriptorFactory;
import com.amap.api.maps2d.model.LatLng;
import com.amap.api.maps2d.model.MarkerOptions;
import com.amap.api.services.core.AMapException;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.route.BusRouteResult;
import com.amap.api.services.route.DrivePath;
import com.amap.api.services.route.DriveRouteResult;
import com.amap.api.services.route.RideRouteResult;
import com.amap.api.services.route.RouteSearch;
import com.amap.api.services.route.WalkRouteResult;
import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.ToastUtils;
import java.util.ArrayList;
import java.util.List;
/**
* 功能:显示宝贝位置/显示路线/导航跳转
* @author xiehj
* @time 2020/1/21 13:30
*/
public class MainActivity extends AppCompatActivity implements RouteSearch.OnRouteSearchListener {
private BottomSheetKeyMenuDialog bottomSheetKeyMenuDialog;
private List<Integer> openTypeList = new ArrayList<>();
private Context mContext;
private RouteSearch mRouteSearch;
private MapView mapView;
private AMap aMap;
private MarkerOptions markerOption;
private LatLng latlng = new LatLng(39.761, 116.434);
private DriveRouteResult mDriveRouteResult;
private LatLonPoint mStartPoint = new LatLonPoint(31.190332, 121.434503);
private LatLonPoint mEndPoint = new LatLonPoint(30.600281, 114.308185);
private ProgressDialog progDialog = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this.getApplicationContext();
mapView = findViewById(R.id.map);
//获取地图控件引用
mapView = (MapView) findViewById(R.id.map);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
mapView.onCreate(savedInstanceState);
//初始化地图控制器对象
aMap = mapView.getMap();
mRouteSearch = new RouteSearch(this);
mRouteSearch.setRouteSearchListener(this);
}
/**
* 在地图上添加marker
*/
public void addMarkersToMap(View view) {
aMap.clear();
markerOption = new MarkerOptions().icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_RED))
.position(latlng)
.draggable(true);
aMap.addMarker(markerOption);
//设置地图中心点和缩放比
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng,10));
}
/**
* 弹框(根据手机是否安装高德和百度地图+路线)
* @param view
*/
public void daohang(View view) {
boolean baiduInstalled = AppUtils.isAppInstalled("com.baidu.BaiduMap");
boolean gaodeInstalled = AppUtils.isAppInstalled("com.autonavi.minimap");
if (baiduInstalled) {
openTypeList.add(new Integer(0));
}
if (gaodeInstalled) {
openTypeList.add(new Integer(1));
}
bottomSheetKeyMenuDialog = new BottomSheetKeyMenuDialog(this, openTypeList);
bottomSheetKeyMenuDialog.setOnItemClickListener(new BottomSheetKeyMenuDialog.OnItemClickListener() {
@Override
public void onCenterItemClick(BottomSheetKeyMenuDialog dialog, int menu) {
switch (menu) {
case 0://跳转百度地图
Uri baiduuri = Uri.parse("baidumap://map/direction?destination=latlng:" + "31.171717" + "," + "121.462844" + "|name:" + "滨江中心" + "&mode=driving");
startActivity(new Intent(Intent.ACTION_VIEW, baiduuri));
break;
case 1://跳转高德地图
Uri gaodeuri = Uri.parse("amapuri://route/plan/?dlat=" + "31.165372" + "&dlon=" + "121.456477" + "&dname=" + "滨江中心" + "&dev=0&t=0");
startActivity(new Intent(Intent.ACTION_VIEW, gaodeuri));
break;
case 2://显示路线
aMap.clear();
searchRouteResult(RouteSearch.DRIVING_SINGLE_SHORTEST);
default:
break;
}
}
});
bottomSheetKeyMenuDialog.show();
}
/**
* 开始搜索路径规划方案
*/
public void searchRouteResult(int mode) {
if (mStartPoint == null) {
ToastUtils.showShort("定位中,稍后再试...");
return;
}
if (mEndPoint == null) {
ToastUtils.showShort("终点未设置");
}
showProgressDialog();
final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(mStartPoint, mEndPoint);
RouteSearch.DriveRouteQuery query = new RouteSearch.DriveRouteQuery(fromAndTo, mode, null,
null, "");// 第一个参数表示路径规划的起点和终点,第二个参数表示驾车模式,第三个参数表示途经点,第四个参数表示避让区域,第五个参数表示避让道路
mRouteSearch.calculateDriveRouteAsyn(query);// 异步路径规划驾车模式查询
}
/**
* 显示进度框
*/
private void showProgressDialog() {
if (progDialog == null) {
progDialog = new ProgressDialog(this);
}
progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progDialog.setIndeterminate(false);
progDialog.setCancelable(true);
progDialog.setMessage("正在搜索");
progDialog.show();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
mapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mapView.onPause (),暂停地图的绘制
mapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mapView.onSaveInstanceState (outState),保存地图当前的状态
mapView.onSaveInstanceState(outState);
}
@Override
public void onBusRouteSearched(BusRouteResult busRouteResult, int i) {
}
@Override
public void onDriveRouteSearched(DriveRouteResult result, int errorCode) {
dissmissProgressDialog();
if (errorCode == AMapException.CODE_AMAP_SUCCESS) {
if (result != null && result.getPaths() != null) {
if (result.getPaths().size() > 0) {
mDriveRouteResult = result;
final DrivePath drivePath = result.getPaths().get(0);
DrivingRouteOverLay drivingRouteOverlay = new DrivingRouteOverLay(
mContext, aMap, drivePath,
mDriveRouteResult.getStartPos(),
mDriveRouteResult.getTargetPos(), null);
drivingRouteOverlay.setNodeIconVisibility(false);//设置节点marker是否显示
drivingRouteOverlay.setIsColorfulline(true);//是否用颜色展示交通拥堵情况,默认true
drivingRouteOverlay.removeFromMap();
drivingRouteOverlay.addToMap();
drivingRouteOverlay.zoomToSpan();
} else if (result != null && result.getPaths() == null) {
ToastUtils.showShort("对不起,没有搜索到相关数据");
}
} else {
ToastUtils.showShort("对不起,没有搜索到相关数据");
}
} else {
ToastUtils.showShort(errorCode);
}
}
@Override
public void onWalkRouteSearched(WalkRouteResult walkRouteResult, int i) {
}
@Override
public void onRideRouteSearched(RideRouteResult rideRouteResult, int i) {
}
/**
* 隐藏进度框
*/
private void dissmissProgressDialog() {
if (progDialog != null) {
progDialog.dismiss();
}
}
}
仅此记录,希望对看到的朋友有所帮助
demo地址(自己使用建议自己在高德上创建应用,使用正确的key):demo地址