Quick navigation
Contents
The guide takes your through the basic steps needed to create a route and begin navigation.
Before getting started, make sure your project is set up correctly, permissions are granted, and authentication is completed.
Step 1: Set the layout
In this tutorial, we are going to create a dedicated activity for the Navigation UI. As part of this, a NavigationView
view will be added to the layout for rendering and visual purposes. We will just name this activity NavigationSampleActivity
and the layout file ‘activity_navigation_sample’.
Inside of the layout file, add the following view to the xml.
<com.trimblemaps.navigation.ui.NavigationView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/navigation_view" />
This view is where the navigation UI and components will be attached and rendered.
Step 2: Initialize the NavigationView and some Stops
The NavigationView
effectively brings the navigation experience and UI to the screen, attaching to the view we made above. In this example, it’s being set up in the activity’s OnCreate
method.
First, add an instance of NavigationView
as a class instance variable.
private NavigationView navigationView;
private var navigationView: NavigationView? = null
In preparation for the route calculation, create two stops—your origin and destination. (Typically, you would set the user’s current location as the first stop.)
// Create our origin point (most would use the user's current location)
// Points are in longitude, latitude format
Point originPoint = Point.fromLngLat(-74.599677, 40.361341);
// Create our destination
Point destinationPoint = Point.fromLngLat(-74.661750, 40.309824);
// Create our origin point (most would use the user's current location)
// Points are in longitude, latitude format
val originPoint = Point.fromLngLat(-74.599677, 40.361341)
// Create our destination
val destinationPoint = Point.fromLngLat(-74.661750, 40.309824)
Besides adding the coordinates of the stops manually, you can retrieve the coordinates (latitude and longitude) of a location using geocoding. For more information on how to do this, refer to the Geocoding Example.
Next, it’s time to find the NavigationView
from the layout file and do some initialization.
// Grab the NavigationView from the layout and put the instance state into the view's OnCreate()
navigationView = (NavigationView) findViewById(R.id.navigation_view);
navigationView.onCreate(savedInstanceState);
/**
* Initialize the navigation view
* At this point you can also set the initial camera position of the navigation
* In this case, the origin point location can be used for our initial position
* The activity is being used for the onNavigationReadyCallback,
* so this activity needs to implement OnNavigationReadyCallback and the onNavigationReady function
*/
navigationView.initialize(this,
new CameraPosition.Builder()
.target(new LatLng(originPoint.latitude(), originPoint.longitude()))
.zoom(18)
.build());
// Grab the NavigationView from the layout and put the instance state into the view's OnCreate()
navigationView = findViewById<View>(R.id.navigation_view) as NavigationView
navigationView!!.onCreate(savedInstanceState)
/**
* Initialize the navigation view
* At this point you can also set the initial camera position of the navigation
* In this case, the origin point location can be used for our initial position
* The activity is being used for the onNavigationReadyCallback,
* so this activity needs to implement OnNavigationReadyCallback and the onNavigationReady function
*/
navigationView!!.initialize(
this,
CameraPosition.Builder()
.target(LatLng(originPoint.latitude(), originPoint.longitude()))
.zoom(18.0)
.build()
)
If you use the code above, you will likely see an error with passing in this
as the first parameter for navigationView.initialize()
. In Step 3 of this tutorial, we will implement the onNavigationReadyCallback
for this Activity. For the final step of this section, we will use the Point
objects we created before to plan our trip.
/**
* We're going to create the trip, in this case we will build our trip stops using the
* coordinates we set earlier
*/
// Origin
TrimbleMapsTrip trimbleMapsTrip = TrimbleMapsTripProvider.create();
trimbleMapsTrip.addStop(new TripStop(TrimbleMapsLocation.builder()
.coords(originPoint)
.build())
);
// Destination
trimbleMapsTrip.addStop(new TripStop(TrimbleMapsLocation.builder()
.coords(destinationPoint)
.build())
);
trimbleMapsTrip.getOptions().setVoiceUnits(getUnitTypeForLocale(inferDeviceLocale(this)));
/**
* We're going to create the trip, in this case we will build our trip stops using the
* coordinates we set earlier
*/
TrimbleMapsTripProvider.create().apply {
// Origin
addStop(
TripStop(
TrimbleMapsLocation.builder()
.coords(originPoint)
.build()
)
)
// Destination
addStop(
TripStop(
TrimbleMapsLocation.builder()
.coords(destinationPoint)
.build()
)
)
options.apply {
voiceUnits = inferDeviceLocale().getUnitTypeForLocale()
}
}
At this point, the NavigationView
has been set up and you’ve planned your trip. Your code should look something like this:
import static com.trimblemaps.navigation.base.internal.extensions.ContextEx.inferDeviceLocale;
import static com.trimblemaps.navigation.base.internal.extensions.LocaleEx.getUnitTypeForLocale;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import com.trimblemaps.account.LicensedFeature;
import com.trimblemaps.account.TrimbleMapsAccountManager;
import com.trimblemaps.account.models.TrimbleMapsAccount;
import com.trimblemaps.android.core.permissions.PermissionsListener;
import com.trimblemaps.android.core.permissions.PermissionsManager;
import com.trimblemaps.api.geocoding.v1.models.TrimbleMapsLocation;
import com.trimblemaps.geojson.Point;
import com.trimblemaps.mapsdk.TrimbleMaps;
import com.trimblemaps.mapsdk.camera.CameraPosition;
import com.trimblemaps.mapsdk.geometry.LatLng;
import com.trimblemaps.navigation.core.TrimbleMapsNavigationProvider;
import com.trimblemaps.navigation.core.TrimbleMapsTrip;
import com.trimblemaps.navigation.core.TrimbleMapsTripProvider;
import com.trimblemaps.navigation.core.trip.model.TripStop;
import com.trimblemaps.navigation.ui.NavigationView;
import com.trimblemaps.navigation.ui.NavigationViewOptions;
import com.trimblemaps.navigation.ui.OnNavigationReadyCallback;
import com.trimblemaps.navigation.ui.listeners.NavigationListener;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import kotlin.collections.ArraysKt;
import kotlin.jvm.internal.Intrinsics;
public class NavigationSampleActivity extends AppCompatActivity implements OnNavigationReadyCallback, NavigationListener {
private NavigationView navigationView;
private final PermissionsManager permissionsManager = new PermissionsManager(null);
private final PermissionsListener permissionsListener = new PermissionsListener() {
@Override
public void onExplanationNeeded(List<String> permissionsToExplain) {
}
@Override
public void onPermissionResult(boolean granted) {
if (granted && PermissionsManager.isAndroidElevenPlus() && !PermissionsManager.areLocationPermissionsGranted(NavigationSampleActivity.this)) {
permissionsManager.requestBackgroundLocationPermissions(NavigationSampleActivity.this);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TrimbleMapsAccount account = TrimbleMapsAccount.builder()
.apiKey("YOUR-API-KEY-HERE")
.addLicensedFeature(LicensedFeature.NAVIGATION_SDK)
.addLicensedFeature(LicensedFeature.MAPS_SDK)
.companyId("YOUR-COMPANY-ID-HERE")
.assetId("YOUR-ASSET-ID-HERE")
.build();
TrimbleMapsAccountManager.initialize(account);
TrimbleMapsAccountManager.awaitInitialization();
TrimbleMaps.getInstance(this);
if ((!PermissionsManager.isAndroidElevenPlus() ||
ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_BACKGROUND_LOCATION) != 0) &&
ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != 0) {
this.permissionsManager.setListener(permissionsListener);
this.permissionsManager.requestLocationPermissions(this);
} else {
}
setContentView(R.layout.activity_navigation_sample);
// Create our origin point (most would use the user's current location)
// Point's are in longitude, latitude format
Point originPoint = Point.fromLngLat(-74.599677, 40.361341);
// Create our destination
Point destinationPoint = Point.fromLngLat(-74.661750, 40.309824);
// Grab the NavigationView from the layout and put the instance state into the view's OnCreate()
navigationView = (NavigationView) findViewById(R.id.navigation_view);
navigationView.onCreate(savedInstanceState);
/**
* Initialize the navigation view
* At this point you can also set the initial camera position of the navigation
* In this case, the origin point location can be used for our initial position
* The activity is being used for the onNavigationReadyCallback,
* so this activity needs to implement OnNavigationReadyCallback and the onNavigationReady function
*/
navigationView.initialize(this,
new CameraPosition.Builder()
.target(new LatLng(originPoint.latitude(), originPoint.longitude()))
.zoom(18)
.build());
/**
* We're going to create the trip, in this case we will build our trip stops using the
* coordinates we set earlier
*/
// Origin
TrimbleMapsTrip trimbleMapsTrip = TrimbleMapsTripProvider.create();
trimbleMapsTrip.addStop(new TripStop(TrimbleMapsLocation.builder()
.coords(originPoint)
.build())
);
// Destination
trimbleMapsTrip.addStop(new TripStop(TrimbleMapsLocation.builder()
.coords(destinationPoint)
.build())
);
trimbleMapsTrip.getOptions().setVoiceUnits(getUnitTypeForLocale(inferDeviceLocale(this)));
}
public void onRequestPermissionsResult(int requestCode, @NotNull String[] permissions, @NotNull int[] grantResults) {
Intrinsics.checkNotNullParameter(permissions, "permissions");
Intrinsics.checkNotNullParameter(grantResults, "grantResults");
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (PermissionsManager.isAndroidElevenPlus()) {
if (ArraysKt.contains(permissions, android.Manifest.permission.ACCESS_FINE_LOCATION) &&
!PermissionsManager.areLocationPermissionsGranted(this)) {
permissionsManager.requestBackgroundLocationPermissions(this);
}
else if (ArraysKt.contains(permissions, android.Manifest.permission.ACCESS_BACKGROUND_LOCATION)) {
}
} else if (permissions.length != 0 && ArraysKt.contains(permissions, android.Manifest.permission.ACCESS_FINE_LOCATION)) {
}
}
}
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import com.trimblemaps.account.LicensedFeature
import com.trimblemaps.account.TrimbleMapsAccountManager
import com.trimblemaps.account.models.TrimbleMapsAccount
import com.trimblemaps.android.core.permissions.PermissionsListener
import com.trimblemaps.android.core.permissions.PermissionsManager
import com.trimblemaps.api.geocoding.v1.models.TrimbleMapsLocation
import com.trimblemaps.geojson.Point
import com.trimblemaps.mapsdk.TrimbleMaps
import com.trimblemaps.mapsdk.camera.CameraPosition
import com.trimblemaps.mapsdk.geometry.LatLng
import com.trimblemaps.navigation.base.internal.extensions.LocaleEx.getUnitTypeForLocale
import com.trimblemaps.navigation.base.internal.extensions.inferDeviceLocale
import com.trimblemaps.navigation.core.TrimbleMapsNavigationProvider
import com.trimblemaps.navigation.core.TrimbleMapsTripProvider
import com.trimblemaps.navigation.core.trip.model.TripStop
import com.trimblemaps.navigation.ui.NavigationView
import com.trimblemaps.navigation.ui.NavigationViewOptions
import com.trimblemaps.navigation.ui.OnNavigationReadyCallback
import com.trimblemaps.navigation.ui.listeners.NavigationListener
class NavigationSampleActivity : AppCompatActivity(), OnNavigationReadyCallback, NavigationListener {
private var navigationView: NavigationView? = null
private val permissionsManager = PermissionsManager(null)
private val permissionsListener = object: PermissionsListener {
override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) {
}
override fun onPermissionResult(granted: Boolean) {
if(granted && PermissionsManager.isAndroidElevenPlus() &&
!PermissionsManager.areLocationPermissionsGranted(this@NavigationSampleActivity)) {
permissionsManager.requestBackgroundLocationPermissions(this@NavigationSampleActivity)
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val account = TrimbleMapsAccount.builder()
.apiKey("YOUR-API-KEY-HERE")
.addLicensedFeature(LicensedFeature.NAVIGATION_SDK)
.addLicensedFeature(LicensedFeature.MAPS_SDK)
.companyId("YOUR-COMPANY-ID-HERE")
.assetId("YOUR-ASSET-ID-HERE")
.build()
TrimbleMapsAccountManager.initialize(account)
TrimbleMapsAccountManager.awaitInitialization()
TrimbleMaps.getInstance(this)
if ((PermissionsManager.isAndroidElevenPlus() && ContextCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_BACKGROUND_LOCATION
) == 0)
|| ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == 0) {
}
else {
permissionsManager.listener = permissionsListener
permissionsManager.requestLocationPermissions(this)
}
setContentView(R.layout.activity_navigation_sample)
// Create our origin point (most would use the user's current location)
// Point's are in longitude, latitude format
val originPoint = Point.fromLngLat(-74.599677, 40.361341)
// Create our destination
val destinationPoint = Point.fromLngLat(-74.661750, 40.309824)
// Grab the NavigationView from the layout and put the instance state into the view's OnCreate()
navigationView = findViewById<View>(R.id.navigation_view) as NavigationView
navigationView!!.onCreate(savedInstanceState)
/**
* Initialize the navigation view
* At this point you can also set the initial camera position of the navigation
* In this case, the origin point location can be used for our initial position
* The activity is being used for the onNavigationReadyCallback,
* so this activity needs to implement OnNavigationReadyCallback and the onNavigationReady function
*/
navigationView!!.initialize(
this,
CameraPosition.Builder()
.target(LatLng(originPoint.latitude(), originPoint.longitude()))
.zoom(18.0)
.build()
)
/**
* We're going to create the trip, in this case we will build our trip stops using the
* coordinates we set earlier
*/
TrimbleMapsTripProvider.create().apply {
// Origin
addStop(
TripStop(
TrimbleMapsLocation.builder()
.coords(originPoint)
.build()
)
)
// Destination
addStop(
TripStop(
TrimbleMapsLocation.builder()
.coords(destinationPoint)
.build()
)
)
options.apply {
voiceUnits = inferDeviceLocale().getUnitTypeForLocale()
}
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults)
if(PermissionsManager.isAndroidElevenPlus()) {
if(permissions.isNotEmpty() && permissions.contains(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION)) {
}
} else if (permissions.isNotEmpty() && permissions.contains(android.Manifest.permission.ACCESS_FINE_LOCATION)) {
}
}
}
Next, we will need to implement some methods.
Step 3: Implementing onNavigationReadyCallback and NavigationListener
In the previous section, you will have likely received an error in your code when trying to pass this
into navigationView.initialize()
. To resolve this error, you’ll need to implement the OnNavigationReadyCallback
in your activity. In this section, we also want to implement the NavigationListener
for the activity. This will be used later.
public class NavigationSampleActivity extends AppCompatActivity implements OnNavigationReadyCallback, NavigationListener {}
class MainActivity : AppCompatActivity(), OnNavigationReadyCallback, NavigationListener {}
Typically an IDE like Android Studio will help you import the methods you need into your Activity to meet the implemented classes requirements. You can also add the below yourself:
@Override
public void onNavigationReady(boolean isRunning) {}
@Override
public void onCancelNavigation() {}
@Override
public void onNavigationFinished() {}
@Override
public void onNavigationRunning() {}
override fun onNavigationReady(isRunning: Boolean) {}
override fun onCancelNavigation() {}
override fun onNavigationFinished() {}
override fun onNavigationRunning() {}
This is also a good place to implement the Android activity lifecycle methods to ensure the navigation adheres to Android’s lifecycle. See below:
/**
* Activity Overrides
*/
@Override
public void onLowMemory() {
super.onLowMemory();
navigationView.onLowMemory();
}
@Override
public void onStart() {
super.onStart();
navigationView.onStart();
}
@Override
public void onResume() {
super.onResume();
navigationView.onResume();
}
@Override
public void onStop() {
super.onStop();
navigationView.onStop();
}
@Override
public void onPause() {
super.onPause();
navigationView.onPause();
}
@Override
public void onDestroy() {
navigationView.onDestroy();
super.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
navigationView.onSaveInstanceState(outState);
super.onSaveInstanceState(outState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
navigationView.onRestoreInstanceState(savedInstanceState);
}
override fun onLowMemory() {
super.onLowMemory()
navigationView!!.onLowMemory()
}
public override fun onStart() {
super.onStart()
navigationView!!.onStart()
}
public override fun onResume() {
super.onResume()
navigationView!!.onResume()
}
public override fun onStop() {
super.onStop()
navigationView!!.onStop()
}
public override fun onPause() {
super.onPause()
navigationView!!.onPause()
}
public override fun onDestroy() {
navigationView!!.onDestroy()
super.onDestroy()
}
public override fun onSaveInstanceState(outState: Bundle) {
navigationView!!.onSaveInstanceState(outState)
super.onSaveInstanceState(outState)
}
public override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
navigationView!!.onRestoreInstanceState(savedInstanceState)
}
Step 4: Navigate
With the methods implemented, it’s time to actually start navigation. This can be done from within the onNavigationReady
method that was implemented earlier.
@Override
public void onNavigationReady(boolean isRunning) {
/**
* We need to create some navigation view options.
* We can retrieve the trip we made earlier from the trip provider and pass that in
* Additionally, we will use this activity for the navigation listener meaning we will need
* to implement the NavigationListener class and it's required functions
*/
NavigationViewOptions navigationViewOptions = NavigationViewOptions.builder(this)
.trip(TrimbleMapsTripProvider.retrieve())
.navigationListener(this)
.build();
// Start the navigation
navigationView.startNavigation(navigationViewOptions);
}
override fun onNavigationReady(isRunning: Boolean) {
/**
* We need to create some navigation view options.
* We can retrieve the trip we made earlier from the trip provider and pass that in
* Additionally, we will use this activity for the navigation listener meaning we will need
* to implement the NavigationListener class and it's required functions
*/
val navigationViewOptions = NavigationViewOptions.builder(this)
.trip(TrimbleMapsTripProvider.retrieve())
.navigationListener(this)
.shouldSimulateRoute(true)
.build()
// Start the navigation
navigationView!!.startNavigation(navigationViewOptions)
}
The code above creates the options we’ll be passing into the navigation. Most importantly, the trip we created earlier with the provider is retrieved and passed in. We also set the NavigationListener
to this
, which were the other methods implemented previously. Finally, navigation starts.
Before running the code in Simulator, make sure to setup the theme as below in values/themes.xml.
<resources>
<style name="Theme.Example" parent="Theme.AppCompat" />
</resources>

Step 5: Finishing touches
The user is now navigating to their destination, but there’s one other small piece that can be added—controlling what happens when navigation is canceled.
Should the user press the end navigation button , this will trigger the
onCancelNavigation()
method that was implemented earlier. Here, code can be added to stop navigation and kill the current activity.
@Override
public void onCancelNavigation() {
// Fired when navigation is canceled
navigationView.stopNavigation();
TrimbleMapsNavigationProvider.destroy();
finish();
}
override fun onCancelNavigation() {
// Fired when navigation is canceled
navigationView!!.stopNavigation()
TrimbleMapsNavigationProvider.destroy()
finish()
}
Full code for all steps
public class NavigationSampleActivity extends AppCompatActivity implements OnNavigationReadyCallback, NavigationListener {
private NavigationView navigationView;
private final PermissionsManager permissionsManager = new PermissionsManager(null);
private final PermissionsListener permissionsListener = new PermissionsListener() {
@Override
public void onExplanationNeeded(List<String> permissionsToExplain) {
}
@Override
public void onPermissionResult(boolean granted) {
if (granted && PermissionsManager.isAndroidElevenPlus() && !PermissionsManager.areLocationPermissionsGranted(NavigationSampleActivity.this)) {
permissionsManager.requestBackgroundLocationPermissions(NavigationSampleActivity.this);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TrimbleMapsAccount account = TrimbleMapsAccount.builder()
.apiKey("YOUR-API-KEY-HERE")
.addLicensedFeature(LicensedFeature.NAVIGATION_SDK)
.addLicensedFeature(LicensedFeature.MAPS_SDK)
.companyId("YOUR-COMPANY-ID-HERE")
.assetId("YOUR-ASSET-ID-HERE")
.build();
TrimbleMapsAccountManager.initialize(account);
TrimbleMapsAccountManager.awaitInitialization();
TrimbleMaps.getInstance(this);
if ((!PermissionsManager.isAndroidElevenPlus() ||
ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_BACKGROUND_LOCATION) != 0) &&
ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != 0) {
this.permissionsManager.setListener(permissionsListener);
this.permissionsManager.requestLocationPermissions(this);
} else {
}
setContentView(R.layout.activity_navigation_sample);
// Create our origin point (most would use the user's current location)
// Point's are in longitude, latitude format
Point originPoint = Point.fromLngLat(-74.599677, 40.361341);
// Create our destination
Point destinationPoint = Point.fromLngLat(-74.661750, 40.309824);
// Grab the NavigationView from the layout and put the instance state into the view's OnCreate()
navigationView = (NavigationView) findViewById(R.id.navigation_view);
navigationView.onCreate(savedInstanceState);
/**
* Initialize the navigation view
* At this point you can also set the initial camera position of the navigation
* In this case, the origin point location can be used for our initial position
* The activity is being used for the onNavigationReadyCallback,
* so this activity needs to implement OnNavigationReadyCallback and the onNavigationReady function
*/
navigationView.initialize(this,
new CameraPosition.Builder()
.target(new LatLng(originPoint.latitude(), originPoint.longitude()))
.zoom(18)
.build());
/**
* We're going to create the trip, in this case we will build our trip stops using the
* coordinates we set earlier
*/
// Origin
TrimbleMapsTrip trimbleMapsTrip = TrimbleMapsTripProvider.create();
trimbleMapsTrip.addStop(new TripStop(TrimbleMapsLocation.builder()
.coords(originPoint)
.build())
);
// Destination
trimbleMapsTrip.addStop(new TripStop(TrimbleMapsLocation.builder()
.coords(destinationPoint)
.build())
);
trimbleMapsTrip.getOptions().setVoiceUnits(getUnitTypeForLocale(inferDeviceLocale(this)));
}
public void onRequestPermissionsResult(int requestCode, @NotNull String[] permissions, @NotNull int[] grantResults) {
Intrinsics.checkNotNullParameter(permissions, "permissions");
Intrinsics.checkNotNullParameter(grantResults, "grantResults");
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (PermissionsManager.isAndroidElevenPlus()) {
if (ArraysKt.contains(permissions, android.Manifest.permission.ACCESS_FINE_LOCATION) &&
!PermissionsManager.areLocationPermissionsGranted(this)) {
permissionsManager.requestBackgroundLocationPermissions(this);
}
else if (ArraysKt.contains(permissions, android.Manifest.permission.ACCESS_BACKGROUND_LOCATION)) {
}
} else if (permissions.length != 0 && ArraysKt.contains(permissions, android.Manifest.permission.ACCESS_FINE_LOCATION)) {
}
}
/**
* Callbacks and overrides
*/
@Override
public void onNavigationReady(boolean isRunning) {
/**
* We need to create some navigation view options.
* We can retrieve the trip we made earlier from the trip provider and pass that in
* Additionally, we will use this activity for the navigation listener meaning we will need
* to implement the NavigationListener class and it's required functions
*/
NavigationViewOptions navigationViewOptions = NavigationViewOptions.builder(this)
.trip(TrimbleMapsTripProvider.retrieve())
.navigationListener(this)
.shouldSimulateRoute(true)
.build();
// Start the navigation
navigationView.startNavigation(navigationViewOptions);
}
@Override
public void onCancelNavigation() {
// Fired when navigation is canceled
navigationView.stopNavigation();
TrimbleMapsNavigationProvider.destroy();
finish();
}
@Override
public void onNavigationFinished() {
}
@Override
public void onNavigationRunning() {
}
/**
* Activity Overrides
*/
@Override
public void onLowMemory() {
super.onLowMemory();
navigationView.onLowMemory();
}
@Override
public void onStart() {
super.onStart();
navigationView.onStart();
}
@Override
public void onResume() {
super.onResume();
navigationView.onResume();
}
@Override
public void onStop() {
super.onStop();
navigationView.onStop();
}
@Override
public void onPause() {
super.onPause();
navigationView.onPause();
}
@Override
public void onDestroy() {
navigationView.onDestroy();
super.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
navigationView.onSaveInstanceState(outState);
super.onSaveInstanceState(outState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
navigationView.onRestoreInstanceState(savedInstanceState);
}
}
class NavigationSampleActivity : AppCompatActivity(), OnNavigationReadyCallback, NavigationListener {
private var navigationView: NavigationView? = null
private val permissionsManager = PermissionsManager(null)
private val permissionsListener = object: PermissionsListener {
override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) {
}
override fun onPermissionResult(granted: Boolean) {
if(granted && PermissionsManager.isAndroidElevenPlus() &&
!PermissionsManager.areLocationPermissionsGranted(this@NavigationSampleActivity)) {
permissionsManager.requestBackgroundLocationPermissions(this@NavigationSampleActivity)
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val account = TrimbleMapsAccount.builder()
.apiKey("YOUR-API-KEY-HERE")
.addLicensedFeature(LicensedFeature.NAVIGATION_SDK)
.addLicensedFeature(LicensedFeature.MAPS_SDK)
.companyId("YOUR-COMPANY-ID-HERE")
.assetId("YOUR-ASSET-ID-HERE")
.build()
TrimbleMapsAccountManager.initialize(account)
TrimbleMapsAccountManager.awaitInitialization()
TrimbleMaps.getInstance(this)
if ((PermissionsManager.isAndroidElevenPlus() && ContextCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_BACKGROUND_LOCATION
) == 0)
|| ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == 0) {
}
else {
permissionsManager.listener = permissionsListener
permissionsManager.requestLocationPermissions(this)
}
setContentView(R.layout.activity_navigation_sample)
// Create our origin point (most would use the user's current location)
// Point's are in longitude, latitude format
val originPoint = Point.fromLngLat(-74.599677, 40.361341)
// Create our destination
val destinationPoint = Point.fromLngLat(-74.661750, 40.309824)
// Grab the NavigationView from the layout and put the instance state into the view's OnCreate()
navigationView = findViewById<View>(R.id.navigation_view) as NavigationView
navigationView!!.onCreate(savedInstanceState)
/**
* Initialize the navigation view
* At this point you can also set the initial camera position of the navigation
* In this case, the origin point location can be used for our initial position
* The activity is being used for the onNavigationReadyCallback,
* so this activity needs to implement OnNavigationReadyCallback and the onNavigationReady function
*/
navigationView!!.initialize(
this,
CameraPosition.Builder()
.target(LatLng(originPoint.latitude(), originPoint.longitude()))
.zoom(18.0)
.build()
)
/**
* We're going to create the trip, in this case we will build our trip stops using the
* coordinates we set earlier
*/
TrimbleMapsTripProvider.create().apply {
// Origin
addStop(
TripStop(
TrimbleMapsLocation.builder()
.coords(originPoint)
.build()
)
)
// Destination
addStop(
TripStop(
TrimbleMapsLocation.builder()
.coords(destinationPoint)
.build()
)
)
options.apply {
voiceUnits = inferDeviceLocale().getUnitTypeForLocale()
}
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults)
if(PermissionsManager.isAndroidElevenPlus()) {
if(permissions.isNotEmpty() && permissions.contains(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION)) {
}
} else if (permissions.isNotEmpty() && permissions.contains(android.Manifest.permission.ACCESS_FINE_LOCATION)) {
}
}
/**
* Callbacks and overrides
*/
override fun onNavigationReady(isRunning: Boolean) {
/**
* We need to create some navigation view options.
* We can retrieve the trip we made earlier from the trip provider and pass that in
* Additionally, we will use this activity for the navigation listener meaning we will need
* to implement the NavigationListener class and it's required functions
*/
val navigationViewOptions = NavigationViewOptions.builder(this)
.trip(TrimbleMapsTripProvider.retrieve())
.navigationListener(this)
.shouldSimulateRoute(true)
.build()
// Start the navigation
navigationView!!.startNavigation(navigationViewOptions)
}
override fun onCancelNavigation() {
// Fired when navigation is canceled
navigationView!!.stopNavigation()
TrimbleMapsNavigationProvider.destroy()
finish()
}
override fun onNavigationFinished() {}
override fun onNavigationRunning() {}
/**
* Activity Overrides
*/
override fun onLowMemory() {
super.onLowMemory()
navigationView!!.onLowMemory()
}
public override fun onStart() {
super.onStart()
navigationView!!.onStart()
}
public override fun onResume() {
super.onResume()
navigationView!!.onResume()
}
public override fun onStop() {
super.onStop()
navigationView!!.onStop()
}
public override fun onPause() {
super.onPause()
navigationView!!.onPause()
}
public override fun onDestroy() {
navigationView!!.onDestroy()
super.onDestroy()
}
public override fun onSaveInstanceState(outState: Bundle) {
navigationView!!.onSaveInstanceState(outState)
super.onSaveInstanceState(outState)
}
public override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
navigationView!!.onRestoreInstanceState(savedInstanceState)
}
}