要实现 Android 高德地图的步行导航,你需要创建以下几个类:

  1. MainActivity: 主活动类,负责初始化地图、处理定位、添加标记点等操作。
  2. MapUtil: 地图工具类,封装了一些常用的地图操作方法,如获取地图、添加标记点、路线规划等。
  3. NavigationActivity: 导航活动类,负责实现步行导航功能。

下面是一个简单的实现代码示例:

MainActivity.java:

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;

import com.amap.api.maps.AMap;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;

public class MainActivity extends AppCompatActivity {

    private MapView mapView;
    private AMap aMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化地图
        mapView = findViewById(R.id.map_view);
        mapView.onCreate(savedInstanceState);
        aMap = mapView.getMap();

        // 定位权限申请
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        } else {
            // 启动定位
            aMap.setMyLocationEnabled(true);
        }

        // 添加标记点
        LatLng latLng = new LatLng(39.906901, 116.397972);
        Marker marker = aMap.addMarker(new MarkerOptions().position(latLng).title('Marker').snippet('Default Marker'));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }
}

MapUtil.java:

import android.content.Context;
import android.widget.Toast;

import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.route.RouteSearch;

public class MapUtil {

    private static final int ROUTE_TYPE_WALK = 3;

    public static void moveCamera(AMap aMap, double latitude, double longitude, float zoom) {
        aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), zoom));
    }

    public static void addMarker(AMap aMap, double latitude, double longitude, String title, String snippet) {
        LatLng latLng = new LatLng(latitude, longitude);
        Marker marker = aMap.addMarker(new MarkerOptions().position(latLng).title(title).snippet(snippet));
        marker.showInfoWindow();
    }

    public static void searchRoute(Context context, RouteSearch routeSearch, LatLonPoint startPoint, LatLonPoint endPoint) {
        RouteSearch.WalkRouteQuery query = new RouteSearch.WalkRouteQuery(new RouteSearch.FromAndTo(startPoint, endPoint));
        routeSearch.calculateWalkRouteAsyn(query);
    }

    public static void showToast(Context context, String message) {
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
    }
}

NavigationActivity.java:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.amap.api.maps.AMap;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.LatLng;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.route.RouteSearch;

public class NavigationActivity extends AppCompatActivity implements RouteSearch.OnRouteSearchListener {

    private MapView mapView;
    private AMap aMap;
    private RouteSearch routeSearch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_navigation);

        mapView = findViewById(R.id.map_view);
        mapView.onCreate(savedInstanceState);

        aMap = mapView.getMap();
        routeSearch = new RouteSearch(this);
        routeSearch.setRouteSearchListener(this);

        // 获取起点和终点的经纬度
        double startLatitude = getIntent().getDoubleExtra('startLatitude', 0);
        double startLongitude = getIntent().getDoubleExtra('startLongitude', 0);
        double endLatitude = getIntent().getDoubleExtra('endLatitude', 0);
        double endLongitude = getIntent().getDoubleExtra('endLongitude', 0);

        // 开始路线规划
        MapUtil.searchRoute(this, routeSearch, new LatLonPoint(startLatitude, startLongitude), new LatLonPoint(endLatitude, endLongitude));
    }

    @Override
    public void onWalkRouteSearched(WalkRouteResult result, int errorCode) {
        if (errorCode == 1000) {
            if (result != null && result.getPaths() != null && result.getPaths().size() > 0) {
                WalkPath walkPath = result.getPaths().get(0);
                List<LatLng> latLngs = MapUtil.parseWalkPath(walkPath);
                Polyline polyline = aMap.addPolyline(new PolylineOptions().addAll(latLngs).width(10).color(Color.BLUE));
            } else {
                MapUtil.showToast(this, '没有找到路线');
            }
        } else {
            MapUtil.showToast(this, '路线规划失败,错误码:' + errorCode);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }
}

这只是一个简单的示例,你可以根据实际需求进行修改和完善。同时,你还需要在 AndroidManifest.xml 文件中添加相关权限和申请高德地图的 Key。

Android 高德地图步行导航实现详解:代码示例与类结构

原文地址: https://www.cveoy.top/t/topic/pgpR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录