驾车导航
本页用于汽车实时引导。只查询汽车距离和预览路线时使用驾车路线规划;徒步使用步行导航。
方式一:直接打开 SDK 内置导航页
推荐需要现成导航界面的接入方使用此方式。配置配套 maps-delivery 及其 Maven 依赖,完成 Android Key、服务与数据集元数据。代码只传业务任务和终点,地图、指引、语音和导航服务由 SDK 提供。
package example.docs;
import android.app.Activity;
import cn.sukha.mapsdk.delivery.*;
public final class DrivingPageExample {
public static void show(Activity host, String taskId, long revision,
double latitude, double longitude) {
DeliveryNaviParams params = DeliveryNaviParams.builder()
.taskId(taskId).revision(revision)
.destination(DeliveryPoint.wgs84(latitude, longitude))
.destinationName("客户选择的收货入口")
.vehicleType(DeliveryVehicleType.CAR)
.language("zh-CN").voiceLanguage("zh-CN")
.voiceEnabled(true).recordJourney(false).build();
SukhaNaviPage.getInstance().showRouteActivity(host, params);
}
}
在用户点击导航后调用。taskId、阶段和 revision 来自宿主业务;同一任务改变目的地时递增修订号。示例关闭轨迹记录;这不会自动接入客户的订单上传队列。SDK 软件授权也不会授予平台订单、商家或管理员权限。
首次导航需按系统提示授权精确定位;Android 对通知和前台位置服务的要求由目标系统决定。默认页通过 SDK 自身流程算路和启动,不需要先调用预览 RouteSearch,也不要求宿主复制导航 Activity 实现。
方式二:自定义前台驾车 UI
使用 NavigationClient,按 initialize → onReady → startLocation → 有效位置 → calculateDriveRoute → onCalculateRouteSuccess → 用户 startNavi 的顺序接入。以下类展示状态与资源拥有关系;地图和按钮由宿主提供。
package example.docs;
import android.content.Context;
import java.util.function.Consumer;
import cn.sukha.mapsdk.api.SukhaLatLng;
import cn.sukha.mapsdk.api.SukhaRoute;
import cn.sukha.mapsdk.location.SukhaLocation;
import cn.sukha.mapsdk.navi.services.NavigationClient;
public final class DriveControllerExample implements AutoCloseable {
private final NavigationClient navi;
private boolean ready, planned;
public DriveControllerExample(Context context, Consumer<String> status) {
navi = new NavigationClient(context);
navi.setNaviListener(new NavigationClient.Listener() {
@Override public void onReady(String version) {
ready = true; navi.startLocation(); status.accept("等待有效定位");
}
@Override public void onCalculateRouteSuccess(SukhaRoute route) {
planned = true; status.accept("路线就绪,可点击开始");
}
@Override public void onCalculateRouteFailure(String message) {
planned = false; status.accept(message);
}
@Override public void onError(String code, String message) {
status.accept(code + ": " + message);
}
});
navi.initialize();
}
public void plan(SukhaLatLng destination) {
SukhaLocation fix = navi.getLastKnownLocation();
if (!ready || fix == null || fix.getErrorCode() != 0)
throw new IllegalStateException("等待初始化和有效定位");
planned = false; navi.calculateDriveRoute(destination);
}
public void start() {
if (!planned) throw new IllegalStateException("先准备驾车路线");
navi.startNavi();
}
public void stop() { navi.stopNavi(); }
@Override public void close() { navi.close(); }
}
所有调用在主线程进行;创建前先取得相应定位权限。SDK 在真实开始时继续校验位置时间和精度,示例的非空检查不能代替该校验。前台页面离开时停止或关闭;需要锁屏/后台持续运行时改用前台导航服务,不要让 Activity 单独承担后台定位。
自定义界面应监听什么
| 回调 / 值 | 用途 |
|---|---|
onLocationChanged(SukhaLocation) |
真实定位或错误,先判断错误码、时间与精度 |
onNaviInfoUpdate(info) |
info.progress 提供剩余距离、秒数和指引;按 locationReliable 显示定位状态 |
info.getDisplaySpeedText() |
SDK 格式化的 km/h 数值或未知标记,不自行把缺失速度当作 0 |
info.getSpeedMetersPerSecond() |
原始展示速度,单位米/秒;不可用时为 NaN |
onCalculateRouteFailure(message) |
算路失败;允许用户重试或改选入口 |
onArriveDestination(side) |
到达状态,结束业务操作仍由宿主自己的后台判断 |
中文、英文、缅文界面及语音的配置见导航总览。SDK 默认导航页跟随宿主实际主题;切换昼夜应通过宿主主题配置或公开地图选项,不修改内部图层或反射私有字段。