Driving with a route
Request accessDriving with a route
The GuidanceManager provides navigation guidance during active trips. It delivers turn-by-turn instructions and lane guidance to help drivers navigate their routes.
Starting navigation
Before observing guidance information, start navigation on a planned trip:
import android.util.Logimport com.tomtom.automotive.integration.client.api.trip.TripManagerimport com.tomtom.automotive.integration.client.api.trip.startnavigation.StartNavigationCallbackimport com.tomtom.automotive.integration.client.api.trip.startnavigation.StartNavigationFailureimport com.tomtom.automotive.integration.client.api.trip.startnavigation.StartNavigationParametersimport com.tomtom.automotive.integration.client.api.trip.startnavigation.StartNavigationResponseimport com.tomtom.automotive.integration.client.common.Callbackimport com.tomtom.automotive.integration.client.common.Resultimport com.tomtom.automotive.integration.client.common.SdkReleasable
private const val TAG = "Navigation"
fun startNavigation(tripManager: TripManager, tripId: String) { tripManager.startNavigation( StartNavigationParameters(tripId), object : StartNavigationCallback { override fun onNavigatedTrip(response: Result<StartNavigationResponse, StartNavigationFailure>) { when (response) { is Result.Success -> { val trip = response.value.navigatedTrip Log.d(TAG, "Navigation started for trip: ${trip.id}") } is Result.Failure -> { Log.e(TAG, "Failed to start navigation: ${response.failure}") } } }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Navigation unavailable: ${reason.devMessage}") } } )}Observing next instruction
Subscribe to receive updates about the next maneuver:
import android.util.Logimport com.tomtom.automotive.integration.client.api.guidance.GuidanceManagerimport com.tomtom.automotive.integration.client.api.guidance.observenextinstruction.InstructionInfoimport com.tomtom.automotive.integration.client.api.guidance.observenextinstruction.NextInstructionListenerimport com.tomtom.automotive.integration.client.api.model.guidance.InstructionInformationimport com.tomtom.automotive.integration.client.common.Callbackimport com.tomtom.automotive.integration.client.common.SdkReleasable
private const val TAG = "Guidance"private var observeNextInstructionReleasable: SdkReleasable? = null
fun observeNextInstruction(guidanceManager: GuidanceManager) { observeNextInstructionReleasable = guidanceManager.observeNextInstruction( object : NextInstructionListener { override fun onNextInstructionChange(instructionInfo: InstructionInfo) { val instruction = instructionInfo.instruction if (instruction != null) { val distance = instruction.distanceToNextInstruction val info = instruction.instruction Log.d(TAG, "Next instruction in ${distance.meters}m: ${getInstructionDescription(info)}")
// Get road shields if available info.getRoadShields()?.forEach { shield -> Log.d(TAG, "Road shield: ${shield.roadNumber}") } } }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Instruction updates unavailable: ${reason.devMessage}") } } )}
private fun getInstructionDescription(info: InstructionInformation): String { return when (info) { is InstructionInformation.TurnInstruction -> "Turn ${info.direction}" is InstructionInformation.ForkInstruction -> "Fork ${info.direction}" is InstructionInformation.RoundaboutInstruction -> "Roundabout exit ${info.roundabout.exitNumber}" is InstructionInformation.ExitHighwayInstruction -> "Exit highway ${info.direction}" is InstructionInformation.DestinationArrivalInstruction -> "Arrive at destination" else -> info.toString() }}
fun unObserveNextInstruction() { observeNextInstructionReleasable?.release() observeNextInstructionReleasable = null}Instruction types
The InstructionInformation sealed interface has the following implementations:
TurnInstruction- Turn at a road junctionRoundaboutInstruction- Enter and navigate a roundaboutExitRoundaboutInstruction- Exit a roundaboutForkInstruction- Fork in a bifurcationFollowRoadInstruction- Continue following the current roadMergeInstruction- Merge onto highway/expresswayExitHighwayInstruction- Take a highway exitSwitchHighwayInstruction- Switch highways via exit rampTollgateInstruction- Approaching toll booth or ETC terminalDestinationArrivalInstruction- Arrival at destinationWaypointArrivalInstruction- Arrival at waypointDepartureInstruction- Starting point of tripBorderCrossingInstruction- Crossing international borderEntryAutoTransportInstruction- Enter vehicle transport (ferry, car train)ExitAutoTransportInstruction- Exit vehicle transportEnterCarpoolLaneInstruction- Enter carpool/HOV laneExitCarpoolLaneInstruction- Exit carpool/HOV lane
Fetching road shield assets
Road shields can be displayed as drawable resources:
import android.util.Logimport com.tomtom.automotive.integration.client.api.asset.AssetManagerimport com.tomtom.automotive.integration.client.api.asset.getdrawable.GetDrawableCallbackimport com.tomtom.automotive.integration.client.api.asset.getdrawable.GetDrawableFailureimport com.tomtom.automotive.integration.client.api.asset.getdrawable.GetDrawableParametersimport com.tomtom.automotive.integration.client.api.asset.getdrawable.GetDrawableResponseimport com.tomtom.automotive.integration.client.api.model.drawable.Densityimport com.tomtom.automotive.integration.client.api.model.guidance.RoadShieldimport com.tomtom.automotive.integration.client.common.Callbackimport com.tomtom.automotive.integration.client.common.Result
private const val TAG = "Guidance"
fun fetchRoadShieldAsset(assetManager: AssetManager, roadShield: RoadShield) { val drawableHandle = roadShield.getDrawableHandle(Density(2f))
assetManager.getDrawable( GetDrawableParameters(drawableHandle), object : GetDrawableCallback { override fun onResult(result: Result<GetDrawableResponse, GetDrawableFailure>) { when (result) { is Result.Success -> { val drawableResource = result.value.drawable Log.d(TAG, "Road shield fetched: $drawableResource") } is Result.Failure -> { Log.e(TAG, "Failed to fetch road shield: ${result.failure}") } } }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Asset manager unavailable: ${reason.devMessage}") } } )}Audio announcements
The Instruction object includes an audioAnnouncementPhase field that indicates the timing phase of the audio guidance:
import android.util.Logimport com.tomtom.automotive.integration.client.api.guidance.GuidanceManagerimport com.tomtom.automotive.integration.client.api.guidance.observenextinstruction.InstructionInfoimport com.tomtom.automotive.integration.client.api.guidance.observenextinstruction.NextInstructionListenerimport com.tomtom.automotive.integration.client.api.model.guidance.AudioAnnouncementPhaseimport com.tomtom.automotive.integration.client.common.Callbackimport com.tomtom.automotive.integration.client.common.SdkReleasable
private const val TAG = "Guidance"private var observeAudioReleasable: SdkReleasable? = null
fun observeAudioAnnouncements(guidanceManager: GuidanceManager) { observeAudioReleasable = guidanceManager.observeNextInstruction( object : NextInstructionListener { override fun onNextInstructionChange(instructionInfo: InstructionInfo) { val instruction = instructionInfo.instruction if (instruction != null) { val phase = instruction.audioAnnouncementPhase when (phase) { AudioAnnouncementPhase.FOLLOW -> { Log.d(TAG, "Audio: Follow instruction") // Play follow announcement } AudioAnnouncementPhase.FAR_AWAY -> { Log.d(TAG, "Audio: Far away announcement") // Play far away announcement } AudioAnnouncementPhase.EARLY -> { Log.d(TAG, "Audio: Early announcement") // Play early announcement } AudioAnnouncementPhase.MAIN -> { Log.d(TAG, "Audio: Main announcement") // Play main announcement } AudioAnnouncementPhase.CONFIRMATION -> { Log.d(TAG, "Audio: Confirmation announcement") // Play confirmation announcement } AudioAnnouncementPhase.UNHANDLED, null -> { Log.d(TAG, "Audio: No announcement phase") } } } }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Audio announcements unavailable: ${reason.devMessage}") } } )}
fun unObserveAudioAnnouncements() { observeAudioReleasable?.release() observeAudioReleasable = null}Audio announcement phases
The AudioAnnouncementPhase enum represents different timing phases for audio guidance:
FOLLOW- Announcement at any distance beyond far awayFAR_AWAY- Earliest announcement about upcoming maneuverEARLY- Prepare for upcoming maneuverMAIN- Short time before the maneuverCONFIRMATION- At the time of the maneuver itself
Lane guidance
Lane guidance helps drivers choose the correct lane for upcoming maneuvers:
import android.util.Logimport com.tomtom.automotive.integration.client.api.guidance.GuidanceManagerimport com.tomtom.automotive.integration.client.api.guidance.observenextlaneguidance.LaneGuidanceInfoimport com.tomtom.automotive.integration.client.api.guidance.observenextlaneguidance.NextLaneGuidanceListenerimport com.tomtom.automotive.integration.client.common.Callbackimport com.tomtom.automotive.integration.client.common.SdkReleasable
private const val TAG = "Guidance"private var observeNextLaneGuidanceReleasable: SdkReleasable? = null
fun observeNextLaneGuidance(guidanceManager: GuidanceManager) { observeNextLaneGuidanceReleasable = guidanceManager.observeNextLaneGuidance( object : NextLaneGuidanceListener { override fun onNextLaneGuidanceChange(laneGuidanceInfo: LaneGuidanceInfo) { val lanes = laneGuidanceInfo.lanes Log.d(TAG, "Lane guidance: ${lanes.size} lanes")
lanes.forEachIndexed { index, lane -> lane.laneDirections.forEach { direction -> val marking = direction.laneMarking val shouldFollow = direction.hasToBeFollowed Log.d(TAG, "Lane $index: $marking (follow: $shouldFollow)") } } }
override fun onFunctionalityUnavailable(reason: Callback.Reason) { Log.e(TAG, "Lane guidance unavailable: ${reason.devMessage}") } } )}
fun unObserveNextLaneGuidance() { observeNextLaneGuidanceReleasable?.release() observeNextLaneGuidanceReleasable = null}Lane marking types
The LaneMarking enum represents the direction arrow or marking for each lane:
STRAIGHTSLIGHT_RIGHTRIGHTSHARP_RIGHTRIGHT_U_TURNSLIGHT_LEFTLEFTSHARP_LEFTLEFT_U_TURN