Google Navigation SDK Android多目的地导航在首个途经点终止求助
多途经点导航到达首个点后终止的问题解决
问题背景
我编写的代码预期引导用户依次前往所有途经点后结束导航,但实际在到达首个途经点时就终止了。演示中导航在到达首个途经点后立即结束。我尝试过GPT、网络搜索及查阅官方文档,但未找到解决方案。
原代码
private fun navigateWithWaypoints(waypoints: List<Local>) { if (waypoints.isEmpty()) { showToast("Nenhum waypoint disponível para navegação") return } val waypointObjects = waypoints.mapNotNull { local -> try { // Criar um Waypoint usando as coordenadas do Local val (latitude, longitude) = local.coordinates.split(",").map { it.trim().toDouble() } Waypoint.builder().setLatLng(latitude, longitude).build() } catch (e: Exception) { Log.e("NavViewActivity", "Erro ao criar waypoint para ${local.name}: ${e.message}") null // Ignorar waypoints inválidos } } if (waypointObjects.isEmpty()) { showToast("Nenhum waypoint válido encontrado") return } // Usar o Navigator para configurar os waypoints e iniciar a navegação withNavigatorAsync { val pendingRoute: ListenableResultFuture<RouteStatus> = navigator.setDestinations(waypointObjects); pendingRoute.setOnResultListener { code -> when (code) { RouteStatus.OK -> { actionBar?.hide() // Ocultar barra de ações navigator.setAudioGuidance(Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE) // Simular navegação (para testes/debug) if (BuildConfig.DEBUG) { navigator.simulator.simulateLocationsAlongExistingRoute( SimulationOptions().speedMultiplier(5f) ) } // Iniciar a navegação navigator.startGuidance() } RouteStatus.ROUTE_CANCELED -> showToast("Navegação cancelada") RouteStatus.NO_ROUTE_FOUND, RouteStatus.NETWORK_ERROR -> showToast("Erro ao determinar rota: $code") else -> showToast("Erro iniciando navegação: $code") } } } }
问题原因
Google Maps Navigation Android SDK默认行为是到达单个目的地后立即终止导航,不会自动继续到下一个途经点。原代码未处理到达后的导航续接逻辑,导致首个途经点到达后导航直接结束。
解决方案
添加Navigator.NavigationCallback监听到达事件,在onArrival回调中检查是否存在下一个目的地,主动触发下一段导航:
修改后的代码
private fun navigateWithWaypoints(waypoints: List<Local>) { if (waypoints.isEmpty()) { showToast("Nenhum waypoint disponível para navegação") return } val waypointObjects = waypoints.mapNotNull { local -> try { val (latitude, longitude) = local.coordinates.split(",").map { it.trim().toDouble() } Waypoint.builder().setLatLng(latitude, longitude).build() } catch (e: Exception) { Log.e("NavViewActivity", "Erro ao criar waypoint para ${local.name}: ${e.message}") null } } if (waypointObjects.isEmpty()) { showToast("Nenhum waypoint válido encontrado") return } withNavigatorAsync { // 设置导航回调,处理到达后的续接逻辑 navigator.setNavigationCallback(object : Navigator.NavigationCallback { override fun onArrival() { // 检查是否还有未到达的目的地 if (navigator.hasNextDestination()) { // 继续导航到下一个途经点/终点 navigator.navigateToNextDestination() } else { // 所有目的地完成,执行收尾操作 showToast("Navegação concluída") actionBar?.show() } } // 实现其他必填回调方法(可根据需求添加逻辑) override fun onNavigationCanceled() {} override fun onNavigationFinished() {} override fun onNavigationStarted() {} override fun onRouteChanged(route: Route?) {} override fun onGuidanceUpdated(guidance: Guidance?) {} }) val pendingRoute: ListenableResultFuture<RouteStatus> = navigator.setDestinations(waypointObjects); pendingRoute.setOnResultListener { code -> when (code) { RouteStatus.OK -> { actionBar?.hide() navigator.setAudioGuidance(Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE) if (BuildConfig.DEBUG) { navigator.simulator.simulateLocationsAlongExistingRoute( SimulationOptions().speedMultiplier(5f) ) } navigator.startGuidance() } RouteStatus.ROUTE_CANCELED -> showToast("Navegação cancelada") RouteStatus.NO_ROUTE_FOUND, RouteStatus.NETWORK_ERROR -> showToast("Erro ao determinar rota: $code") else -> showToast("Erro iniciando navegação: $code") } } } }
关键说明
navigator.hasNextDestination():判断当前是否还有未到达的目的地;navigator.navigateToNextDestination():触发导航切换到下一个途经点或终点;- 必须实现
NavigationCallback的所有抽象方法,否则会编译失败,可根据业务需求在空实现中添加自定义逻辑。
内容的提问来源于stack exchange,提问作者Paulo
相关产品推荐
相关产品推荐

