我正在尝试将骑行配置文件应用到导航中,我是这样做的:
private fun requestRoutes(origin: Point, destination: Point) {
MapboxNavigationApp.current()!!.requestRoutes(
routeOptions = RouteOptions
.builder()
.applyDefaultNavigationOptions()
.applyLanguageAndVoiceUnitOptions(this)
.coordinatesList(listOf(origin, destination))
.alternatives(true)
.profile(DirectionsCriteria.PROFILE_CYCLING)
.build(),
callback = object : NavigationRouterCallback {
override fun onCanceled(routeOptions: RouteOptions, routerOrigin: RouterOrigin) {
// no impl
}
override fun onFailure(reasons: List<RouterFailure>, routeOptions: RouteOptions) {
// no impl
}
override fun onRoutesReady(routes: List<NavigationRoute>, routerOrigin: RouterOrigin) {
binding.navigationView.api.startActiveGuidance(routes)
// binding.navigationView.api.routeReplayEnabled(true) simulate movement
}
}
)
}
这是我的 onCreate 函数:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// set the layout
binding = MapboxActivityNavigationViewBinding.inflate(layoutInflater)
setContentView(binding.root)
// get the arg of the js
val routes = intent.getSerializableExtra("routes") as String
val arrayList = JSONArray(routes);
val originCoord = arrayList.getJSONObject(0)
val destinationCoord = arrayList.getJSONObject(1)
MapboxNavigationApp.current()?.registerLocationObserver(locationObserver)
val origin = Point.fromLngLat(originCoord.getDouble("longitude"), originCoord.getDouble("latitude"))
val destination = Point.fromLngLat(destinationCoord.getDouble("longitude"), destinationCoord.getDouble("latitude"))
origing = origin
destinationg = destination
// set the custom view binder
val navigationActivity = this
findViewById<NavigationView>(R.id.navigationView).customizeViewBinders {
infoPanelEndNavigationButtonBinder = MyinfoPanelEndNavigationButtonBinder(navigationActivity)
}
// launch the active guidance
requestRoutes(origin, destination)
}
不幸的是,当将配置文件设置为骑行时,导航不会启动,并且保持自由驾驶模式,在其他配置文件(驾驶、步行)中一切正常,这是 sdk 的错误还是我做错了什么?
我在文档或互联网上找不到任何帮助
我想通了,伙计们,在我的
requestRoutes
功能中,我有这些路线选项。
routeOptions = RouteOptions
.builder()
.applyDefaultNavigationOptions()
.applyLanguageAndVoiceUnitOptions(this)
.coordinatesList(listOf(origin, destination))
.alternatives(true)
.profile(DirectionsCriteria.PROFILE_CYCLING)
.build(),
原来
applyDefaultNavigationOptions()
是这样实现的:
fun RouteOptions.Builder.applyDefaultNavigationOptions(
@DirectionsCriteria.ProfileCriteria profile: String =
DirectionsCriteria.PROFILE_DRIVING_TRAFFIC
): RouteOptions.Builder = apply {
val defaultAnnotations = listOf(
DirectionsCriteria.ANNOTATION_SPEED,
DirectionsCriteria.ANNOTATION_DURATION,
DirectionsCriteria.ANNOTATION_DISTANCE,
)
when (profile) {
DirectionsCriteria.PROFILE_DRIVING_TRAFFIC -> {
annotationsList(
mutableListOf(
DirectionsCriteria.ANNOTATION_CONGESTION_NUMERIC,
DirectionsCriteria.ANNOTATION_MAXSPEED,
DirectionsCriteria.ANNOTATION_CLOSURE,
).apply { addAll(defaultAnnotations) }
)
continueStraight(true)
enableRefresh(true)
}
DirectionsCriteria.PROFILE_DRIVING -> {
annotationsList(
mutableListOf(
DirectionsCriteria.ANNOTATION_MAXSPEED,
).apply { addAll(defaultAnnotations) }
)
continueStraight(true)
enableRefresh(false)
}
DirectionsCriteria.PROFILE_CYCLING,
DirectionsCriteria.PROFILE_WALKING -> {
annotationsList(defaultAnnotations)
continueStraight(false)
enableRefresh(false)
}
else -> throw IllegalArgumentException(
"Unknown profile [$profile]. It must be one [DirectionsCriteria.ProfileCriteria]"
)
}
所以我覆盖了配置文件,因为它已经在此函数中设置了。不知道为什么覆盖配置文件对于步行和驾驶配置文件不是问题,但对于骑行配置文件不是问题,但您可以通过在
applyDefaultNavigationOptions()
函数中传递配置文件来解决此问题,如下所示:
routeOptions = RouteOptions
.builder()
.applyDefaultNavigationOptions(DirectionsCriteria.PROFILE_CYCLING)
.applyLanguageAndVoiceUnitOptions(this)
.coordinatesList(listOf(origin, destination))
.alternatives(true)
.build(),