You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:14:51