高德地图展示宝贝位置、两点间行车路线、跳转本地导航

高德官方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地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值