首页 > 解决方案 > 当前位置偏离路线时出现错误

问题描述

我是 mapb box 的新手,我正在开发示例应用程序来学习。我正在使用自定义路线,用户将在开始导航时浏览自定义路线。

当用户的当前位置不在路线上时发生错误。重新路由已禁用

从 Map Matching API 生成的另一个 Activity 获取 DirectionsRoute

代码 -

    val mapboxNavigationOptions = MapboxNavigation
        .defaultNavigationOptionsBuilder(this, getString(R.string.mapbox_access_token))
        .build()

    mapboxNavigation = MapboxNavigation(mapboxNavigationOptions)
    mapboxNavigation.setRerouteController(null)

    navigationView = findViewById(R.id.navigationView)
    navigationView.onCreate(savedInstanceState)
    navigationView.initialize(this, getInitialCameraPosition())

    private val routeProgressObserver = object : RouteProgressObserver {
    override fun onRouteProgressChanged(routeProgress: RouteProgress) {

        try {

            routeProgress.currentState?.let { currentState ->
                val state = currentState
                if (state == RouteProgressState.ROUTE_COMPLETE && routeProgress.distanceRemaining < 10) {
                    finish()
                } else if (state == RouteProgressState.OFF_ROUTE) {
                    Log.e("< <OFF> >", " off route > > > > > > > > > > > > > > > > > > >")
                }
            }

        } catch (e: Exception) {
            Log.e("Nav Err", e.message)
        }
    }
}

override fun onNavigationReady(isRunning: Boolean) {

    if (!isRunning && !::navigationMapboxMap.isInitialized) {

        ifNonNull(navigationView.retrieveNavigationMapboxMap()) { navMapboxMap ->

            this.navigationMapboxMap = navMapboxMap
            this.navigationMapboxMap.updateLocationLayerRenderMode(RenderMode.NORMAL)
            navigationView.retrieveMapboxNavigation()?.let { this.mapboxNavigation = it }

            val optionsBuilder = NavigationViewOptions.builder(this)
            optionsBuilder.navigationListener(this)
            optionsBuilder.directionsRoute(route)
            optionsBuilder.shouldSimulateRoute(false)
            optionsBuilder.bannerInstructionsListener(this)
            optionsBuilder.enableVanishingRouteLine(true)
            optionsBuilder.routeProgressObserver(routeProgressObserver)
            
            navigationView.startNavigation(optionsBuilder.build())

        }
    }

错误日志 -

 java.lang.IndexOutOfBoundsException
            at java.util.AbstractList.subList(AbstractList.java:738)
            at com.mapbox.navigation.core.routeoptions.MapboxRouteOptionsUpdater.update(MapboxRouteOptionsUpdater.kt:103)
            at com.mapbox.navigation.core.reroute.MapboxRerouteController.reroute(MapboxRerouteController.kt:50)
            at com.mapbox.navigation.core.MapboxNavigation.reroute(MapboxNavigation.kt:687)
            at com.mapbox.navigation.core.MapboxNavigation.access$reroute(MapboxNavigation.kt:127)
            at com.mapbox.navigation.core.MapboxNavigation$createInternalOffRouteObserver$1.onOffRouteStateChanged(MapboxNavigation.kt:681)
            at com.mapbox.navigation.core.trip.session.MapboxTripSession.setOffRoute(MapboxTripSession.kt:128)
            at com.mapbox.navigation.core.trip.session.MapboxTripSession.access$setOffRoute$p(MapboxTripSession.kt:49)
            at com.mapbox.navigation.core.trip.session.MapboxTripSession$updateDataFromNavigatorStatus$updateNavigatorStatusDataJob$1.invokeSuspend(MapboxTripSession.kt:461)
            at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
            at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

标签: mapboxmapbox-android

解决方案


您面临的问题似乎源于MapboxNavigation.

这确实不是很明显,而是NavigationView一个打包的导航插件,已经捆绑了MapboxNavigation. 因此,如果您想使用NavigationView而不是在 simple 上进行 Turn-by-Turn 导航MapView,则这些行已过时并且可能导致此类问题:

val mapboxNavigationOptions = MapboxNavigation
        .defaultNavigationOptionsBuilder(this, getString(R.string.mapbox_access_token))
        .build()

    mapboxNavigation = MapboxNavigation(mapboxNavigationOptions)
    mapboxNavigation.setRerouteController(null)

推荐阅读