Coder Social home page Coder Social logo

mapbox / mapbox-events-android Goto Github PK

View Code? Open in Web Editor NEW
59.0 104.0 48.0 1.8 MB

Mapbox telemetry and core libraries for Android.

Home Page: https://docs.mapbox.com/android/core/overview

License: MIT License

Makefile 0.22% Java 98.53% Shell 0.52% JavaScript 0.73%

mapbox-events-android's Introduction

CircleCI codecov

Mapbox Mobile Events

This repository houses the Mapbox Telemetry and Core Libraries for Android.

About libtelemetry

The Mapbox Telemetry Library for Android is used to collect anonymous and aggregated information about Mapbox usage. We use telemetry from all Mapbox SDKs to improve our map, directions, travel times, and search. We collect anonymous data about how users interact with the map to help developers build better location based applications.

Visit https://www.mapbox.com/telemetry for higher-level information about telemetry and data security at Mapbox

About libcore

The Mapbox Core Library for Android is a set of utilities that help you with permissions, device location, and connectivity within your Android project. You can:

  • Check for, request, and respond to any number of Android system permissions such as device location or camera.
  • Check for and respond to a change in the device's internet connectivity status.
  • Retrieve a device's real-time location.

Getting Started

If you are looking to include the Core Library inside of your project, please take a look at the detailed instructions found in our docs. If you are interested in building from source, read the contributing guide inside of this project.

The snippet to add to your app-level build.gradle file to use is the following:

// Mapbox Core Library for Android

implementation 'com.mapbox.mapboxsdk:mapbox-android-core:0.2.1'

To run the sample code on a device or emulator, include your developer access token in developer-config.xml found in the project.

Documentation

You'll find all of the documentation for the Core Library on our Mapbox Core page. This includes information on installation, using the API, and links to the API reference.

Getting Help

  • Need help with your code?: Look for previous questions on the #mapbox tag — or ask a new question.
  • Have a bug to report? Open an issue. If possible, include the version of Mapbox Core that you're using, a full log, and a project that shows the issue.
  • Have a feature request? Open an issue. Tell us what the feature should do and why you want the feature.

Using Snapshots

If you want to test recent bug fixes or features that have not been packaged in an official release yet, you can use a -SNAPSHOT release of the current development version of the Mapbox Core Library via Gradle, available on Sonatype.

repositories {
    mavenCentral()
    maven { url "http://oss.sonatype.org/content/repositories/snapshots/" }
}

dependencies {
    implementation 'com.mapbox.mapboxsdk:mapbox-android-core:X.X.X-SNAPSHOT'
}

This repo's test app can help you get started with the Core library and to inspire you.

Contributing

We welcome feedback, translations, and code contributions! Please see CONTRIBUTING.md for details.

mapbox-events-android's People

Contributors

andrlee avatar bhavika avatar danesfeder avatar electrostat avatar ferdicus avatar guardiola31337 avatar harvsu avatar kmadsen avatar korshaknn avatar langsmith avatar lukaspaczos avatar mr1sunshine avatar nagineni avatar nkukday avatar osana avatar springmeyer avatar tatiana-yan avatar tobrun avatar yunikkk avatar zach2good avatar zugaldia avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mapbox-events-android's Issues

Optional location provider results in logging warnings

due to making location provider optional, we are receiving warnings as:

I/art: Rejecting re-init on previously-failed class java.lang.Class<com.mapbox.mapboxsdk.location.LocationSource>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/mapzen/android/lost/api/LostApiClient$ConnectionCallbacks;

Could we look into suppressing these warnings or finding a way that they don't occur?

refs mapbox/mapbox-gl-native#11285

cc @Guardiola31337

Current Location Cannot be found,shows wrong location near Nigeria.

Current location cannot be found as per given examples in github,i tried to implement this piece of code,but not successful.
I used code example given here.

	package com.app.mapboxdemo;
	// classes needed to initialize map

	import com.mapbox.api.geocoding.v5.MapboxGeocoding;
	import com.mapbox.mapboxsdk.Mapbox;
	import com.mapbox.mapboxsdk.maps.MapView;

	// classes needed to add location layer
	import com.mapbox.geojson.Point;
	import com.mapbox.mapboxsdk.maps.MapboxMap;
	import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;

	import android.location.Location;

	import com.mapbox.mapboxsdk.geometry.LatLng;

	import android.os.Bundle;
	import android.support.annotation.NonNull;

	import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
	import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerPlugin;
	import com.mapbox.mapboxsdk.plugins.locationlayer.modes.CameraMode;
	import com.mapbox.mapboxsdk.plugins.locationlayer.modes.RenderMode;
	import com.mapbox.services.android.navigation.ui.v5.NavigationLauncherOptions;
	import com.mapbox.android.core.location.LocationEngine;
	import com.mapbox.android.core.location.LocationEngineListener;
	import com.mapbox.android.core.location.LocationEnginePriority;
	import com.mapbox.android.core.location.LocationEngineProvider;
	import com.mapbox.android.core.permissions.PermissionsListener;
	import com.mapbox.android.core.permissions.PermissionsManager;

	// classes needed to add a marker
	import com.mapbox.mapboxsdk.annotations.Marker;
	import com.mapbox.mapboxsdk.annotations.MarkerOptions;

	// classes to calculate a route
	import com.mapbox.services.android.navigation.ui.v5.route.NavigationMapRoute;
	import com.mapbox.services.android.navigation.v5.navigation.NavigationRoute;
	import com.mapbox.api.directions.v5.models.DirectionsResponse;
	import com.mapbox.api.directions.v5.models.DirectionsRoute;

	import retrofit2.Call;
	import retrofit2.Callback;
	import retrofit2.Response;

	import android.support.v7.app.AppCompatActivity;
	import android.util.Log;

	// classes needed to launch navigation UI
	import android.view.View;
	import android.widget.Button;

	import com.mapbox.services.android.navigation.ui.v5.NavigationLauncher;


	// classes needed to add location layer
	import com.mapbox.geojson.Point;
	import com.mapbox.mapboxsdk.maps.MapboxMap;
	import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;

	import android.location.Location;

	import com.mapbox.mapboxsdk.geometry.LatLng;

	import android.support.annotation.NonNull;

	import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
	import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerPlugin;
	import com.mapbox.mapboxsdk.plugins.locationlayer.modes.RenderMode;
	import com.mapbox.services.android.navigation.ui.v5.NavigationLauncherOptions;
	import com.mapbox.android.core.location.LocationEngine;
	import com.mapbox.android.core.location.LocationEngineListener;
	import com.mapbox.android.core.location.LocationEnginePriority;
	import com.mapbox.android.core.location.LocationEngineProvider;
	import com.mapbox.android.core.permissions.PermissionsListener;
	import com.mapbox.android.core.permissions.PermissionsManager;


	// classes needed to add a marker
	import com.mapbox.mapboxsdk.annotations.Marker;
	import com.mapbox.mapboxsdk.annotations.MarkerOptions;


	// classes to calculate a route
	import com.mapbox.services.android.navigation.ui.v5.route.NavigationMapRoute;
	import com.mapbox.services.android.navigation.v5.navigation.NavigationRoute;
	import com.mapbox.api.directions.v5.models.DirectionsResponse;
	import com.mapbox.api.directions.v5.models.DirectionsRoute;

	import retrofit2.Call;
	import retrofit2.Callback;
	import retrofit2.Response;

	import android.util.Log;


	// classes needed to launch navigation UI
	import android.view.View;
	import android.widget.Button;
	import android.widget.EditText;
	import android.widget.Toast;

	import com.mapbox.services.android.navigation.ui.v5.NavigationLauncher;

	import java.util.List;


	public class NavigationActivity extends AppCompatActivity implements LocationEngineListener, PermissionsListener {


		private MapView mapView;


		// variables for adding location layer
		private static MapboxMap map;
		private PermissionsManager permissionsManager;
		private LocationLayerPlugin locationPlugin;
		private LocationEngine locationEngine;
		private Location originLocation;


		// variables for adding a marker
		private Marker destinationMarker;
		private LatLng originCoord;
		private LatLng destinationCoord;


		// variables for calculating and drawing a route
		private Point originPosition;
		private Point destinationPosition;
		private DirectionsRoute currentRoute;
		private static final String TAG = "DirectionsActivity";
		private NavigationMapRoute navigationMapRoute;

		EditText edtLatitude, edtLongitude;


		private Button button, buttonGetLocation;


		@Override
		protected void onCreate(Bundle savedInstanceState) {
			super.onCreate(savedInstanceState);
			Mapbox.getInstance(this, getString(R.string.access_token));
			setContentView(R.layout.activity_draw_navigation);
			mapView = (MapView) findViewById(R.id.mapView);
			mapView.onCreate(savedInstanceState);


			mapView.getMapAsync(new OnMapReadyCallback() {
				@Override
				public void onMapReady(final MapboxMap mapboxMap) {


					map = mapboxMap;
					enableLocationPlugin();


					originCoord = new LatLng(originLocation.getLatitude(), originLocation.getLongitude());
					/*mapboxMap.addOnMapClickListener(new MapboxMap.OnMapClickListener() {
						@Override
						public void onMapClick(@NonNull LatLng point) {
							if (destinationMarker != null) {
								mapboxMap.removeMarker(destinationMarker);
							}
							destinationCoord = point;
							destinationMarker = mapboxMap.addMarker(new MarkerOptions()
								.position(destinationCoord)
							);

							destinationPosition = Point.fromLngLat(destinationCoord.getLongitude(), destinationCoord.getLatitude());
							originPosition = Point.fromLngLat(originCoord.getLongitude(), originCoord.getLatitude());
							getRoute(originPosition, destinationPosition);


							button.setEnabled(true);
							button.setBackgroundResource(R.color.mapboxBlue);


						}

					});*/


					button = findViewById(R.id.startButton);
					buttonGetLocation = findViewById(R.id.buttonGetLocation);
					edtLatitude = findViewById(R.id.edtLatitude);
					edtLongitude = findViewById(R.id.edtLongitude);

					buttonGetLocation.setOnClickListener(new View.OnClickListener() {
						@Override
						public void onClick(View v) {
							checkLatLong(mapboxMap);
						}
					});
					button.setOnClickListener(new View.OnClickListener() {
						public void onClick(View v) {
							Point origin = originPosition;
							Point destination = destinationPosition;

							boolean simulateRoute = true;
							NavigationLauncherOptions options = NavigationLauncherOptions.builder()
								.origin(origin)
								.destination(destination)
								.shouldSimulateRoute(simulateRoute)
								.build();
							Log.e(TAG, "onClick: Start Button" );
							// Call this method with Context from within an Activity
							NavigationLauncher.startNavigation(NavigationActivity.this, options);
						}
					});


				}
			});


		}


		private void getRoute(Point origin, Point destination) {
			NavigationRoute.builder()
				.accessToken(Mapbox.getAccessToken())
				.origin(origin)
				.destination(destination)
				.build()
				.getRoute(new Callback<DirectionsResponse>() {
					@Override
					public void onResponse(Call<DirectionsResponse> call, Response<DirectionsResponse> response) {
						// You can get the generic HTTP info about the response
						Log.d(TAG, "Response code: " + response.code());
						if (response.body() == null) {
							Log.e(TAG, "No routes found, make sure you set the right user and access token.");
							return;
						} else if (response.body().routes().size() < 1) {
							Log.e(TAG, "No routes found");
							return;
						}

						currentRoute = response.body().routes().get(0);

						// Draw the route on the map
						if (navigationMapRoute != null) {
							navigationMapRoute.removeRoute();
						} else {
							navigationMapRoute = new NavigationMapRoute(null, mapView, map, R.style.NavigationMapRoute);
						}
						navigationMapRoute.addRoute(currentRoute);
					}

					@Override
					public void onFailure(Call<DirectionsResponse> call, Throwable throwable) {
						Log.e(TAG, "Error: " + throwable.getMessage());
					}
				});
		}


		@SuppressWarnings({"MissingPermission"})
		private void enableLocationPlugin() {
			// Check if permissions are enabled and if not request
			if (PermissionsManager.areLocationPermissionsGranted(this)) {
				// Create an instance of LOST location engine

				initializeLocationEngine();

				locationPlugin = new LocationLayerPlugin(mapView, map, locationEngine);
				locationPlugin.setLocationLayerEnabled(true);
				locationPlugin.setCameraMode(CameraMode.TRACKING);
				locationPlugin.setRenderMode(RenderMode.COMPASS);
				getLifecycle().addObserver(locationPlugin);
			} else {
				permissionsManager = new PermissionsManager(this);
				permissionsManager.requestLocationPermissions(this);
			}
		}

		@SuppressWarnings({"MissingPermission"})
		private void initializeLocationEngine() {
			LocationEngineProvider locationEngineProvider = new LocationEngineProvider(this);
			locationEngine = locationEngineProvider.obtainBestLocationEngineAvailable();
			locationEngine.setPriority(LocationEnginePriority.HIGH_ACCURACY);
			locationEngine.requestLocationUpdates();
			locationEngine.activate();


			Location lastLocation = locationEngine.getLastLocation();
	//        Log.e(TAG, "initializeLocationEngine: Latitude is"+lastLocation.getLatitude()+" Longitude is "+lastLocation.getLongitude() );
			if (lastLocation != null) {
				originLocation = lastLocation;
				setCameraPosition(lastLocation);
			} else {
				locationEngine.addLocationEngineListener(this);
			}
		}

		private void setCameraPosition(Location location) {
			map.animateCamera(CameraUpdateFactory.newLatLngZoom(
				new LatLng(location.getLatitude(), location.getLongitude()), 13));
		}

		@Override
		public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
			permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults);
		}

		@Override
		public void onExplanationNeeded(List<String> permissionsToExplain) {

		}

		@Override
		public void onPermissionResult(boolean granted) {
			if (granted) {
				enableLocationPlugin();
			} else {
				finish();
			}
		}

		@Override
		@SuppressWarnings({"MissingPermission"})
		public void onConnected() {
			locationEngine.requestLocationUpdates();
		}

		@Override
		public void onLocationChanged(Location location) {
			if (location != null) {
				originLocation = location;
				setCameraPosition(location);
				locationEngine.removeLocationEngineListener(this);
			}
		}

		@Override
		@SuppressWarnings({"MissingPermission"})
		protected void onStart() {
			super.onStart();
			if (locationEngine != null) {
				locationEngine.requestLocationUpdates();
			}
			if (locationPlugin != null) {
				locationPlugin.onStart();
			}
			mapView.onStart();
		}

		@Override
		protected void onStop() {
			super.onStop();
			if (locationEngine != null) {
				locationEngine.removeLocationUpdates();
			}
			if (locationPlugin != null) {
				locationPlugin.onStop();
			}
			mapView.onStop();
		}

		@Override
		protected void onDestroy() {
			super.onDestroy();
			mapView.onDestroy();
			if (locationEngine != null) {
				locationEngine.deactivate();
			}
		}

		@Override
		public void onLowMemory() {
			super.onLowMemory();
			mapView.onLowMemory();
		}

		@Override
		protected void onResume() {
			super.onResume();
			mapView.onResume();
		}

		@Override
		protected void onPause() {
			super.onPause();
			mapView.onPause();
		}

		@Override
		protected void onSaveInstanceState(Bundle outState) {
			super.onSaveInstanceState(outState);
			mapView.onSaveInstanceState(outState);
		}


		public void checkLatLong( MapboxMap mapboxMap)
		{
			if ((edtLatitude.getText()==null &&edtLatitude.getText().length()==0)&&(edtLongitude.getText()==null &&edtLongitude.getText().length()==0))
			{
				Toast.makeText(getApplicationContext(),"Enter Proper Longitude and Latitude.",Toast.LENGTH_LONG).show();
			}else
			{
				if (destinationMarker != null) {
					map.removeMarker(destinationMarker);
				}
				destinationCoord = new LatLng(Double.parseDouble(edtLatitude.getText().toString()), Double.parseDouble(edtLongitude.getText().toString()));
				destinationMarker = map.addMarker(new MarkerOptions()
					.position(destinationCoord)
				);

				destinationPosition = Point.fromLngLat(destinationCoord.getLongitude(), destinationCoord.getLatitude());
				originPosition = Point.fromLngLat(originCoord.getLongitude(), originCoord.getLatitude());
				getRoute(originPosition, destinationPosition);
				setCameraPosition(originLocation);
				button.setEnabled(true);
				button.setBackgroundResource(R.color.mapboxBlue);
			}
		}

	}

Permissions I used are:

   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
   <uses-permission android:name="android.permission.WAKE_LOCK"/>
   <uses-feature android:name="android.hardware.location.gps"/>

Gradle Details are here:

    compileSdkVersion 27

    minSdkVersion 15
    targetSdkVersion 27
    multiDexEnabled true


     implementation ('com.mapbox.mapboxsdk:mapbox-android-sdk:6.1.1@aar') {
     transitive=true
     }
     implementation 'com.mapbox.mapboxsdk:mapbox-android-plugin-locationlayer:0.5.3'
     implementation 'com.mapbox.mapboxsdk:mapbox-android-navigation:0.13.0'
     implementation ('com.mapbox.mapboxsdk:mapbox-android-navigation-ui:0.13.0') {
     transitive = true
     }

Please Help me.Thanking in Advance.

locationEngine's getLastLocation() method returning Null location. Using locationEngineProvider's obtainBestLocationEngineAvailable() method to get location provider.

Hello Team,
I have implemented one demo using MapBox navigation sdk by following below tutorial:
https://www.mapbox.com/help/android-navigation-sdk/

It gives me current location of user and I can even get route of destination selected by user and can start navigation towards destination.
Issue is demo works successfully on some devices like Moto however it's not working on Samsung and Xiomi devices. On Samsung and Xiomi devices, when I debug app, I am getting Null location from locationEngine's getLastLocation() method and I am using locationEngineProvider's obtainBestLocationEngineAvailable() method to get location provider. This is default implementation provided in above tutorial.

If I add google play services dependency to get location of user, then I am getting user's current location on map on Samsung and Xiomi devices also.
gradle dependency: implementation 'com.google.android.gms:play-services-location:15.0.1'
But further I am not able to pick destination for user and eventually unable to get route also.

Can you please help me with this issue?

Build.gradle file:

apply plugin: 'com.android.application'

android {
compileSdkVersion 27
defaultConfig {
applicationId "com.example.neosoft.mapboxnew"
minSdkVersion 15
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

implementation('com.mapbox.mapboxsdk:mapbox-android-sdk:6.1.3@aar') {
    transitive = true
}
implementation 'com.mapbox.mapboxsdk:mapbox-android-navigation:0.14.0'
implementation('com.mapbox.mapboxsdk:mapbox-android-navigation-ui:0.14.0') {
    transitive = true
}

implementation 'com.mapbox.mapboxsdk:mapbox-android-plugin-locationlayer:0.5.3'

}


Below is code of NavigationActivity:
import java.util.List;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

// classes needed to initialize map
import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.maps.MapView;

// classes needed to add location layer
import com.mapbox.geojson.Point;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;

import android.location.Location;

import com.mapbox.mapboxsdk.geometry.LatLng;

import android.support.annotation.NonNull;

import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerPlugin;
import com.mapbox.mapboxsdk.plugins.locationlayer.modes.RenderMode;
import com.mapbox.services.android.navigation.ui.v5.NavigationLauncherOptions;
import com.mapbox.android.core.location.LocationEngine;
import com.mapbox.android.core.location.LocationEngineListener;
import com.mapbox.android.core.location.LocationEnginePriority;
import com.mapbox.android.core.location.LocationEngineProvider;
import com.mapbox.android.core.permissions.PermissionsListener;
import com.mapbox.android.core.permissions.PermissionsManager;

// classes needed to add a marker
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.annotations.MarkerOptions;

// classes to calculate a route
import com.mapbox.services.android.navigation.ui.v5.route.NavigationMapRoute;
import com.mapbox.services.android.navigation.v5.navigation.NavigationRoute;
import com.mapbox.api.directions.v5.models.DirectionsResponse;
import com.mapbox.api.directions.v5.models.DirectionsRoute;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

import android.util.Log;

// classes needed to launch navigation UI
import android.view.View;
import android.widget.Button;

import com.mapbox.services.android.navigation.ui.v5.NavigationLauncher;

// classes needed to add location layer
import com.mapbox.geojson.Point;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;

import android.location.Location;

import com.mapbox.mapboxsdk.geometry.LatLng;

import android.support.annotation.NonNull;

import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerPlugin;
import com.mapbox.mapboxsdk.plugins.locationlayer.modes.RenderMode;
import com.mapbox.services.android.navigation.ui.v5.NavigationLauncherOptions;
import com.mapbox.android.core.location.LocationEngine;
import com.mapbox.android.core.location.LocationEngineListener;
import com.mapbox.android.core.location.LocationEnginePriority;
import com.mapbox.android.core.location.LocationEngineProvider;
import com.mapbox.android.core.permissions.PermissionsListener;
import com.mapbox.android.core.permissions.PermissionsManager;

// classes needed to add a marker
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.annotations.MarkerOptions;

// classes to calculate a route
import com.mapbox.services.android.navigation.ui.v5.route.NavigationMapRoute;
import com.mapbox.services.android.navigation.v5.navigation.NavigationRoute;
import com.mapbox.api.directions.v5.models.DirectionsResponse;
import com.mapbox.api.directions.v5.models.DirectionsRoute;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

import android.util.Log;

// classes needed to launch navigation UI
import android.view.View;
import android.widget.Button;

import com.mapbox.services.android.navigation.ui.v5.NavigationLauncher;

public class NavigationActivity extends AppCompatActivity implements LocationEngineListener, PermissionsListener {

private MapView mapView;


// variables for adding location layer
private MapboxMap map;
private PermissionsManager permissionsManager;
private LocationLayerPlugin locationPlugin;
private LocationEngine locationEngine;
private Location originLocation;


// variables for adding a marker
private Marker destinationMarker;
private LatLng originCoord;
private LatLng destinationCoord;


// variables for calculating and drawing a route
private Point originPosition;
private Point destinationPosition;
private DirectionsRoute currentRoute;
private static final String TAG = "DirectionsActivity";
private NavigationMapRoute navigationMapRoute;


private Button button;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Mapbox.getInstance(this, getString(R.string.access_token));
    setContentView(R.layout.activity_draw_navigation);
    mapView = findViewById(R.id.mapView);
    mapView.onCreate(savedInstanceState);


    mapView.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(final MapboxMap mapboxMap) {


            map = mapboxMap;
            enableLocationPlugin();


            originCoord = new LatLng(originLocation.getLatitude(), originLocation.getLongitude());
            mapboxMap.addOnMapClickListener(new MapboxMap.OnMapClickListener() {
                @Override
                public void onMapClick(@NonNull LatLng point) {
                    if (destinationMarker != null) {
                        mapboxMap.removeMarker(destinationMarker);
                    }
                    destinationCoord = point;
                    destinationMarker = mapboxMap.addMarker(new MarkerOptions()
                            .position(destinationCoord)
                    );


                    destinationPosition = Point.fromLngLat(destinationCoord.getLongitude(), destinationCoord.getLatitude());
                    originPosition = Point.fromLngLat(originCoord.getLongitude(), originCoord.getLatitude());
                    getRoute(originPosition, destinationPosition);
                    button.setEnabled(true);
                    button.setBackgroundResource(R.color.mapboxBlue);
                } ;
            });
            button = findViewById(R.id.startButton);
            button.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    boolean simulateRoute = true;
                    NavigationLauncherOptions options = NavigationLauncherOptions.builder()
                            .directionsRoute(currentRoute)
                            .shouldSimulateRoute(simulateRoute)
                            .build();

                    // Call this method with Context from within an Activity
                    NavigationLauncher.startNavigation(NavigationActivity.this, options);
                }
            });
        } ;
    });
}

private void getRoute(Point origin, Point destination) {
    NavigationRoute.builder(this)
            .accessToken(Mapbox.getAccessToken())
            .origin(origin)
            .destination(destination)
            .build()
            .getRoute(new Callback<DirectionsResponse>() {
                @Override
                public void onResponse(Call<DirectionsResponse> call, Response<DirectionsResponse> response) {
                    // You can get the generic HTTP info about the response
                    Log.d(TAG, "Response code: " + response.code());
                    if (response.body() == null) {
                        Log.e(TAG, "No routes found, make sure you set the right user and access token.");
                        return;
                    } else if (response.body().routes().size() < 1) {
                        Log.e(TAG, "No routes found");
                        return;
                    }

                    currentRoute = response.body().routes().get(0);

                    // Draw the route on the map
                    if (navigationMapRoute != null) {
                        navigationMapRoute.removeRoute();
                    } else {
                        navigationMapRoute = new NavigationMapRoute(null, mapView, map, R.style.NavigationMapRoute);
                    }
                    navigationMapRoute.addRoute(currentRoute);
                }

                @Override
                public void onFailure(Call<DirectionsResponse> call, Throwable throwable) {
                    Log.e(TAG, "Error: " + throwable.getMessage());
                }
            });
}


@SuppressWarnings({"MissingPermission"})
private void enableLocationPlugin() {
    // Check if permissions are enabled and if not request
    if (PermissionsManager.areLocationPermissionsGranted(this)) {
        // Create an instance of LOST location engine
        initializeLocationEngine();

        locationPlugin = new LocationLayerPlugin(mapView, map, locationEngine);
        locationPlugin.setRenderMode(RenderMode.COMPASS);
    } else {
        permissionsManager = new PermissionsManager(this);
        permissionsManager.requestLocationPermissions(this);
    }
}

@SuppressWarnings({"MissingPermission"})
private void initializeLocationEngine() {
    LocationEngineProvider locationEngineProvider = new LocationEngineProvider(this);
    locationEngine = locationEngineProvider.obtainBestLocationEngineAvailable();
    locationEngine.setPriority(LocationEnginePriority.HIGH_ACCURACY);
    locationEngine.activate();

    Location lastLocation = locationEngine.getLastLocation();
    if (lastLocation != null) {
        originLocation = lastLocation;
        setCameraPosition(lastLocation);
    } else {
        locationEngine.addLocationEngineListener(this);
    }
}

private void setCameraPosition(Location location) {
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(
            new LatLng(location.getLatitude(), location.getLongitude()), 13));
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

@Override
public void onExplanationNeeded(List<String> permissionsToExplain) {
}

@Override
public void onPermissionResult(boolean granted) {
    if (granted) {
        enableLocationPlugin();
    } else {
        finish();
    }
}

@Override
@SuppressWarnings({"MissingPermission"})
public void onConnected() {
    locationEngine.requestLocationUpdates();
}

@Override
public void onLocationChanged(Location location) {
    if (location != null) {
        originLocation = location;
        setCameraPosition(location);
        locationEngine.removeLocationEngineListener(this);
    }
}

@Override
@SuppressWarnings({"MissingPermission"})
protected void onStart() {
    super.onStart();
    if (locationEngine != null) {
        locationEngine.requestLocationUpdates();
    }
    if (locationPlugin != null) {
        locationPlugin.onStart();
    }
    mapView.onStart();
}

@Override
protected void onStop() {
    super.onStop();
    if (locationEngine != null) {
        locationEngine.removeLocationUpdates();
    }
    if (locationPlugin != null) {
        locationPlugin.onStop();
    }
    mapView.onStop();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mapView.onDestroy();
    if (locationEngine != null) {
        locationEngine.deactivate();
    }
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
}

@Override
protected void onResume() {
    super.onResume();
    mapView.onResume();
}

@Override
protected void onPause() {
    super.onPause();
    mapView.onPause();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mapView.onSaveInstanceState(outState);
}

}

Change useragent in Maps SDK for Android traffic to `mapbox-maps-android`

Please change the useragent string for the Maps SDK for Android to mapbox-maps-android from MapboxEventsAndroid.

I did a quick spot check yesterday:

  • iOS Maps SDK traffic has mapbox-maps-ios in the useragent
  • Navigation uses mapbox-navigation-android or mapbox-navigation-ios

Changing the Android Maps SDK to mapbox-maps-android will bring it in line with our other mobile traffic.

Thanks!

3.0.2 Release

Release checklist

  • Change version name to 3.0.2 in gradle.properties
  • change version name of Android Core: 0.2.0 in gradle.properties
  • Publish 3.0.2 artifact to Maven Central
  • Change version name back to 4.0.0-SNAPSHOT for telemetry
  • Change version name back to 0.3.0-SNAPSHOT for core
  • Update CHANGELOG.md
  • Tag v3.0.2 in GitHub

Post release

  • Add release javadocs to appropriate spot in /android-docs api folder @langsmith
  • If stable core version, bump version number in this repo's README @langsmith
  • If stable core version, bump version number in /android-docs repo's constants.js file @langsmith
    /cc: @zugaldia @lilykaiser

3.1.1 Telemetry Release

Release checklist

  • Change version name of Android Telemetry to 3.1.1 in gradle.properties
  • change version name of Android Core to 0.2.0 in gradle.properties
  • toggle off core release
  • Publish 3.1.1 artifact to Maven Central
  • Change version name back to 3.2.0-SNAPSHOT for telemetry
  • Change version name back to 0.3.0-SNAPSHOT for core
  • toggle Core release back on
  • Update CHANGELOG.md
  • Tag v3.1.1 in GitHub

Post release

  • Add release javadocs to appropriate spot in /android-docs api folder @langsmith

/cc: @zugaldia @lilykaiser

NullPointerException in TelemetryUtils.obtainApplicationState()

Platform: Android 7 and 8
Mapbox SDK version: 6.1.0

We have quite a few of the following crash reports:

Stacktrace

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
    at com.mapbox.android.telemetry.TelemetryUtils.obtainApplicationState(TelemetryUtils.java:100)
    at com.mapbox.android.telemetry.LocationEvent.<init>(LocationEvent.java:44)
    at com.mapbox.android.telemetry.LocationMapper.createLocationEvent(LocationMapper.java:32)
    at com.mapbox.android.telemetry.LocationMapper.from(LocationMapper.java:18)
    at com.mapbox.android.telemetry.LocationReceiver.sendEvent(LocationReceiver.java:47)
    at com.mapbox.android.telemetry.LocationReceiver.onReceive(LocationReceiver.java:26)
    at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:311)
    at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:47)
    at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:120)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6111)
    at java.lang.reflect.Method.invoke(Method.java:-2)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

Limit used `com.android.support` dependencies on android-core

When printing the dependency graph on mapbox-gl-native, I'm noticing that android-core uses appcompat-v7 as a dependency. This as a result pulls in a bunch of other dependencies. I would like to suggest reviewing which ones are necessary for the library to work

+--- com.mapbox.mapboxsdk:mapbox-android-telemetry:3.1.0
|    +--- com.mapbox.mapboxsdk:mapbox-android-core:0.2.0
|    |    \--- com.android.support:appcompat-v7:25.4.0
|    |         +--- com.android.support:support-annotations:25.4.0 -> 27.1.1
|    |         +--- com.android.support:support-v4:25.4.0
|    |         |    +--- com.android.support:support-compat:25.4.0 -> 27.1.1
|    |         |    |    +--- com.android.support:support-annotations:27.1.1
|    |         |    |    \--- android.arch.lifecycle:runtime:1.1.0
|    |         |    |         +--- android.arch.lifecycle:common:1.1.0
|    |         |    |         \--- android.arch.core:common:1.1.0
|    |         |    +--- com.android.support:support-media-compat:25.4.0
|    |         |    |    +--- com.android.support:support-annotations:25.4.0 -> 27.1.1
|    |         |    |    \--- com.android.support:support-compat:25.4.0 -> 27.1.1 (*)
|    |         |    +--- com.android.support:support-core-utils:25.4.0 -> 27.1.1
|    |         |    |    +--- com.android.support:support-annotations:27.1.1
|    |         |    |    \--- com.android.support:support-compat:27.1.1 (*)
|    |         |    +--- com.android.support:support-core-ui:25.4.0 -> 27.1.1
|    |         |    |    +--- com.android.support:support-annotations:27.1.1
|    |         |    |    +--- com.android.support:support-compat:27.1.1 (*)
|    |         |    |    \--- com.android.support:support-core-utils:27.1.1 (*)
|    |         |    \--- com.android.support:support-fragment:25.4.0 -> 27.1.1
|    |         |         +--- com.android.support:support-compat:27.1.1 (*)
|    |         |         +--- com.android.support:support-core-ui:27.1.1 (*)
|    |         |         +--- com.android.support:support-core-utils:27.1.1 (*)
|    |         |         +--- com.android.support:support-annotations:27.1.1
|    |         |         +--- android.arch.lifecycle:livedata-core:1.1.0
|    |         |         |    +--- android.arch.lifecycle:common:1.1.0
|    |         |         |    +--- android.arch.core:common:1.1.0
|    |         |         |    \--- android.arch.core:runtime:1.1.0
|    |         |         |         \--- android.arch.core:common:1.1.0
|    |         |         \--- android.arch.lifecycle:viewmodel:1.1.0
|    |         +--- com.android.support:support-vector-drawable:25.4.0
|    |         |    +--- com.android.support:support-annotations:25.4.0 -> 27.1.1
|    |         |    \--- com.android.support:support-compat:25.4.0 -> 27.1.1 (*)
|    |         \--- com.android.support:animated-vector-drawable:25.4.0
|    |              +--- com.android.support:support-vector-drawable:25.4.0 (*)
|    |              \--- com.android.support:support-core-ui:25.4.0 -> 27.1.1 (*)
|    +--- com.squareup.okhttp3:okhttp:3.10.0
|    |    \--- com.squareup.okio:okio:1.14.0
|    +--- com.google.code.gson:gson:2.8.2
|    \--- com.android.support:appcompat-v7:25.4.0 

@electrostat @zugaldia

3.1.3 Telemetry Release

Release checklist

  • Change version name of Android Telemetry to 3.1.3 in gradle.properties
  • change version name of Android Core to 0.2.0 in gradle.properties
  • toggle off core release
  • Publish 3.1.3 artifact to Maven Central
  • Change version name back to 3.2.0-SNAPSHOT for telemetry
  • Change version name back to 0.3.0-SNAPSHOT for core
  • toggle Core release back on
  • Update CHANGELOG.md
  • Tag v3.1.3 in GitHub
  • Make GitHub Release

Post release

  • Add release javadocs to appropriate spot in /android-docs api folder @langsmith

/cc: @zugaldia @lilykaiser

3.1.0 Release

Release checklist

  • Change version name of Android Telemetry to 3.1.0 in gradle.properties
  • change version name of Android Core to 0.2.0 in gradle.properties
  • toggle off core release
  • Publish 3.1.0 artifact to Maven Central
  • Change version name back to 4.0.0-SNAPSHOT for telemetry
  • Change version name back to 0.3.0-SNAPSHOT for core
  • toggle Core release back on
  • Update CHANGELOG.md
  • Tag v3.1.0 in GitHub

Post release

  • Add release javadocs to appropriate spot in /android-docs api folder @langsmith

/cc: @zugaldia @lilykaiser

3.0.0 Release

Release checklist

  • Change version name to 3.0.0 in gradle.properties
  • change version name of Android Core: 0.2.0 in gradle.properties
  • Publish 3.0.0 artifact to Maven Central
  • Change version name back to 4.0.0-SNAPSHOT for telemetry
  • Change version name back to 0.3.0-SNAPSHOT for core
  • Update CHANGELOG.md
  • Tag v3.0.0 in GitHub

Post release

  • Add core and telemetry release javadocs to appropriate spot in /android-docs api folder @langsmith
  • If stable version release, update libcore version # in this repo's README @langsmith

/cc: @zugaldia @lilykaiser

Problem with ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission

Reposting this from mapbox/mapbox-gl-native#12424:


Steps to reproduce

  1. Add:
public class MyApplication extends MultiDexApplication {

   @Override
    public void onCreate() {
        super.onCreate();
      
        try {
            Mapbox.getInstance(this, getString(R.string.def_mapbox_key));
        } catch (Exception e) {
            e.printStackTrace();
        }

Somewhere in your main activity add method and call them

public void callPermissionRequest() {
        if (Build.VERSION.SDK_INT >= 23)
            this.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_ID);

    }
  1. Allow to use Location
  2. When application is running and you already allowed to using location go to app settings in android and disable location permission for your app
  3. Go back to your app. You should see again dialog with question about allowing access to location. Don't do anything - just wait.
  4. After few seconds I have
Process: com.tripbucket.utah, PID: 27361
    java.lang.SecurityException: Client must have ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to perform any location operations.
        at android.os.Parcel.readException(Parcel.java:1943)
        at android.os.Parcel.readException(Parcel.java:1889)
        at com.google.android.gms.internal.location.zza.transactAndReadExceptionReturnVoid(Unknown Source:10)
        at com.google.android.gms.internal.location.zzap.zza(Unknown Source:9)
        at com.google.android.gms.internal.location.zzas.zza(Unknown Source:44)
        at com.google.android.gms.internal.location.zzaz.zza(Unknown Source:5)
        at com.google.android.gms.internal.location.zzr.doExecute(Unknown Source:25)
        at com.google.android.gms.common.api.internal.BaseImplementation$ApiMethodImpl.run(Unknown Source:10)
        at com.google.android.gms.common.api.internal.zzag.execute(Unknown Source:71)
        at com.google.android.gms.common.api.internal.zzbd.execute(Unknown Source:5)
        at com.google.android.gms.common.api.internal.zzav.execute(Unknown Source:138)
        at com.google.android.gms.internal.location.zzq.requestLocationUpdates(Unknown Source:14)
        at com.mapbox.android.core.location.GoogleLocationEngine.requestLocationUpdates(GoogleLocationEngine.java:133)
        at com.mapbox.android.telemetry.TelemetryService.onConnected(TelemetryService.java:94)
        at com.mapbox.android.core.location.GoogleLocationEngine.onConnected(GoogleLocationEngine.java:93)
        at com.google.android.gms.common.internal.GmsClientEventManager.onConnectionSuccess(Unknown Source:109)
        at com.google.android.gms.common.api.internal.zzav.zzb(Unknown Source:22)
        at com.google.android.gms.common.api.internal.zzaj.zzat(Unknown Source:92)
        at com.google.android.gms.common.api.internal.zzaj.onConnected(Unknown Source:21)
        at com.google.android.gms.common.api.internal.zzbd.onConnected(Unknown Source:7)
        at com.google.android.gms.common.api.internal.zzp.onConnected(Unknown Source:5)
        at com.google.android.gms.common.internal.zzf.onConnected(Unknown Source:2)
        at com.google.android.gms.common.internal.BaseGmsClient$PostInitCallback.handleServiceSuccess(Unknown Source:131)
        at com.google.android.gms.common.internal.BaseGmsClient$zza.deliverCallback(Unknown Source:62)
        at com.google.android.gms.common.internal.BaseGmsClient$zza.deliverCallback(Unknown Source:2)
        at com.google.android.gms.common.internal.BaseGmsClient$CallbackProxy.deliverCallback(Unknown Source:51)
        at com.google.android.gms.common.internal.BaseGmsClient$zzb.handleMessage(Unknown Source:270)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6592)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)

I'm using mapbox only on one fragment which is not opened before crash(actually, for now is not opening at all). And I'm preaty sure this is problem with mapbox because if I remove this code from step one i don't have crash. I'm using in app google map and mapbox(google maps works fine).

Configuration

Android versions: 8.0
Device models: Motoroal g6 plus
Mapbox SDK versions: 6.2.1

Change naming in libcore/libtelemetry javadoc.gradle ?

https://github.com/mapbox/mapbox-events-android/blob/5f8c4986d9d190875383c4f1ce23dcc6e5c7ea90/libcore/javadoc.gradle

https://github.com/mapbox/mapbox-events-android/blob/5f8c4986d9d190875383c4f1ce23dcc6e5c7ea90/libtelemetry/javadoc.gradle

The javadoc.gradle files in this repo ( 👆) still have mention of Mapbox Android Services.

@electrostat , @cammace , @zugaldia , any thoughts on whether this should be changed to a title like Mapbox Android Core or something ? Kept as is?

3.0.0 Beta 1 Release

Release checklist

  • Change version name to 3.0.0-beta.1 in gradle.properties
  • change version name of Android Core: 0.2.0-beta.1 in gradle.properties
  • Publish 3.0.0-beta.1 artifact to Maven Central
  • Change version name back to 4.0.0-SNAPSHOT for telemetry
  • Change version name back to 0.3.0-SNAPSHOT for core
  • Update CHANGELOG.md
  • Tag v3.0.0-beta.1 in GitHub

/cc: @Guardiola31337 @boundsj @zugaldia @lilykaiser

java.lang.NullPointerException in com.mapbox.android.telemetry.TelemetryUtils.obtainSharedPreferences on Android 8.1

Seeing this crash in Google Play Console crash reports since I upgraded to the latest version.
8 crash reports so far, all on Android 8.1, using mapbox-events-android:3.1.4, being called from within Unity.

java.lang.RuntimeException: 
  at android.app.ActivityThread.handleStopService (ActivityThread.java:3666)
  at android.app.ActivityThread.-wrap26 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1796)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6753)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:482)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:807)
Caused by: java.lang.NullPointerException: 
  at com.mapbox.android.telemetry.TelemetryUtils.obtainSharedPreferences (TelemetryUtils.java:191)
  at com.mapbox.android.telemetry.TelemetryLocationEnabler.updateLocationPreferences (TelemetryLocationEnabler.java:61)
  at com.mapbox.android.telemetry.TelemetryLocationEnabler.updateTelemetryLocationState (TelemetryLocationEnabler.java:40)
  at com.mapbox.android.telemetry.TelemetryService.disableTelemetryLocationState (TelemetryService.java:243)
  at com.mapbox.android.telemetry.TelemetryService.onDestroy (TelemetryService.java:65)
  at android.app.ActivityThread.handleStopService (ActivityThread.java:3648)

Decouple Core and Telem Release Process

Decouple the release process for Telemetry and Core libraries. This allows them to be released independently and prevent any conflicts within the release process.

Bring back the Mock location engine type

TelemetryLocationEnabler.updateTelemetryLocationState NPE issue

Copying from @kingfisherphuoc mapbox/mapbox-gl-native#11929

Platform:
Mapbox SDK version:

Steps to trigger behavior

  1. open map
  2. Using it while GPS is moving (Using Lockito or some mocklocation app)
  3. Get error as below:
Caused by java.lang.NullPointerException
Attempt to invoke virtual method 'com.mapbox.android.telemetry.TelemetryLocationEnabler$LocationState com.mapbox.android.telemetry.TelemetryLocationEnabler.updateTelemetryLocationState(com.mapbox.android.telemetry.TelemetryLocationEnabler$LocationState)' on a null object reference
arrow_right
com.mapbox.android.telemetry.TelemetryService.disableTelemetryLocationState (TelemetryService.java:240)
com.mapbox.android.telemetry.TelemetryService.onDestroy (TelemetryService.java:64)
android.app.ActivityThread.handleStopService (ActivityThread.java:3771)
android.app.ActivityThread.-wrap30 (ActivityThread.java)
android.app.ActivityThread$H.handleMessage (ActivityThread.java:1752)
android.os.Handler.dispatchMessage (Handler.java:102)
android.os.Looper.loop (Looper.java:154)
android.app.ActivityThread.main (ActivityThread.java:6776)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1518)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1408)

Expected behavior

We should not get this issue.

Actual behavior

App crashed.

LocationEngineProvider crash when obtainBestLocationEngineAvailable()

Hi guys,

I follow your example to get location but app crash.

Device :
Samsung Galaxy S8+
Android : 8.0.0

My code :

locationEngine = new LocationEngineProvider(context).obtainBestLocationEngineAvailable();
// Same crash if I do locationEngine = new LocationEngineProvider(context).obtainLocationEngineBy(LocationEngine.Type.GOOGLE_PLAY_SERVICES);
locationEngine.activate();
locationEngine.addLocationEngineListener(this);

There is my gradle :

implementation('com.mapbox.mapboxsdk:mapbox-android-sdk:6.0.1') {
        transitive=true
    }
implementation 'com.mapbox.mapboxsdk:mapbox-android-core:0.2.0'
implementation 'com.mapbox.mapboxsdk:mapbox-android-navigation:0.13.0-SNAPSHOT'
implementation('com.mapbox.mapboxsdk:mapbox-android-navigation-ui:0.13.0-SNAPSHOT') {
        transitive = true
    }
implementation 'com.mapbox.mapboxsdk:mapbox-android-plugin-locationlayer:0.5.0'
implementation 'com.google.android.gms:play-services-base:15.0.1'
implementation 'com.google.android.gms:play-services-location:15.0.1'
implementation 'com.mapzen.android:lost:3.0.4'

And the crash :

05-03 12:24:49.612 25048-25048/com.app E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.app, PID: 25048
    java.lang.NullPointerException: Attempt to invoke interface method 'void com.mapbox.android.core.location.UpdateGoogleRequestPriority.update(com.google.android.gms.location.LocationRequest)' on a null object reference
        at com.mapbox.android.core.location.GoogleLocationEngine.updateRequestPriority(GoogleLocationEngine.java:167)
        at com.mapbox.android.core.location.GoogleLocationEngine.requestLocationUpdates(GoogleLocationEngine.java:129)
        at com.app.positionning.PositionningMapbox.onConnected(PositionningMapbox.java:147)
        at com.mapbox.android.core.location.GoogleLocationEngine.onConnected(GoogleLocationEngine.java:93)
        at com.google.android.gms.common.internal.GmsClientEventManager.onConnectionSuccess(Unknown Source:109)
        at com.google.android.gms.common.api.internal.zzav.zzb(Unknown Source:22)
        at com.google.android.gms.common.api.internal.zzaj.zzat(Unknown Source:92)
        at com.google.android.gms.common.api.internal.zzaj.onConnected(Unknown Source:21)
        at com.google.android.gms.common.api.internal.zzbd.onConnected(Unknown Source:7)
        at com.google.android.gms.common.api.internal.zzp.onConnected(Unknown Source:5)
        at com.google.android.gms.common.internal.zzf.onConnected(Unknown Source:2)
        at com.google.android.gms.common.internal.BaseGmsClient$PostInitCallback.handleServiceSuccess(Unknown Source:131)
        at com.google.android.gms.common.internal.BaseGmsClient$zza.deliverCallback(Unknown Source:62)
        at com.google.android.gms.common.internal.BaseGmsClient$zza.deliverCallback(Unknown Source:2)
        at com.google.android.gms.common.internal.BaseGmsClient$CallbackProxy.deliverCallback(Unknown Source:52)
        at com.google.android.gms.common.internal.BaseGmsClient$zzb.handleMessage(Unknown Source:270)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6938)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

Any ideas ?

Location cannot be found with LocationLayer Plugin 5.0 examples

This issue was originally ticketed in the Plugins Repo but actually belongs here.


@AlexeyIke
Hello,
I've use Mapbox SDK v6.0.1 and LocationLayer plugin v 0.5.0
I've add location init as described on LocationLayer plugin v 0.5.0 examples:
create locationEngine = new LocationEngineProvider(this).obtainBestLocationEngineAvailable()
and set locationEngine.setPriority(LocationEnginePriority.HIGH_ACCURACY);
Location work till GSP available, after GPS off by lost signal or turned off by device settings - no any location found.
I've try to set another priority : locationEngine.setPriority(LocationEnginePriority.BALANCED_POWER_ACCURACY);

  • and it found location if cellular/WiFI location on, and Not found location if only GPS location enable on device. Absolutely different behaviour.
    So:
  • does HIGH_ACCURACY mean only GPS location will be used?
  • How to get ALL (GPS+ Cellular/WiFi) location used anyway? Like LostEngine on previous mapbox sdk uses?
  • Maybe some way to use LocationEngine.Type.GOOGLE_PLAY_SERVICES engine type? i'vetry to turn it on but no engine return - fails on locationEngineSupplier.hasDependencyOnClasspath() in initAvailableLocationEngines method.

@cammace
Could you clarify what Location provider you are using in your app? Sounds like the Google Play Services one which is oftentimes, the most accurate. The LocationEngine is just an abstraction of these Location providers making it easier to switch one out for the other. For Priority settings, I'd recommend reading Google's official documentation on how this works since we change nothing when it comes to this behavior. I can say that both LOST and Google Play Services both use Fused Location information to acquire the best location information. In other words, it will combine, Cellular, WIFI, GPS, and other sensors to try and obtain the most accurate location available.

cc: @electrostat


@AlexeyIke
You mean i should add 'com.google.android.gms:play-services-location' provider manually into my app? Ok, I thought it supported by location plugin automatically.
Therefore, new LocationEngineProvider(this).obtainBestLocationEngineAvailable(). return only ANDROID location engine available.


@electrostat
@AlexeyIke When using our AndroidLocationEngine, HIGH_ACCURACY does mean that only GPS is used and it will be hard to get a location fix indoors, not near a window. LOW_POWER and BALANCED_POWER_ACCURACY use various degrees of aggression on network (wifi/cell) calls, while NO_POWER is just a passive listener.

The GoogleLocationEngine we offer works similarly, with the added benefit of having wifi integrated into their HIGH_ACCURACY mode.

If you have google play services location enabled within your app we will use the google location engine.

Would you be interested in a non-Google method to get this feature set? We had to drop LOST due to lack of support from their team. If there is enough interest for this kind of feature, we could look into providing that in the future.


@sstolz

Hi !

Got same kind of issue since I'm using SDK 6.x version (6.1.1) and new com.mapbox.android.core.location.LocationEngine.

I can not manage to get a location when Android system is configured with "Hardware only". I manage to got one when I'm switching to "High precision" (hardware + wifi networks + BT) but the active position on location plugin goes from blue to grey after few seconds.

My Manifest file contains only that permission :
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Gradle info : compileSdkVersion 26, minSdkVersion 18

Device info : Android 6.0.1

onConnected method is well fired but it seems that requestLocationUpdates() method on location engine does not give any results.

@electrostat, I understand that mapbox SDK have kind of HIGH_ACCURACY that use networks and not only GPS hardware. Is it possible that the "hardware only" system parameter can not work with the "new" HIGH_ACCURACY behaviour ? How to make the location engine working in my app if a user select GPS hardware on his system ? I tried NO_POWER but it does not change a thing. JFYI, I was using LOST before and I didn't have this issue.

Regards


@electrostat
@sstolz Hi, as stated above, we no longer support LOST due to a lack of support on their end.

With a Hardware toggle as you are talking about and a device is indoors, then no our AndroidLocationEngine in HIGH_ACCURACY will not return a location point. It also sounds like that would be the case for the lower levels as well, since the native Android apis rely on software to figure out your location through wifi and network calls. The only way around this would be to utilize Google-Play-Services within your project and use our GoogleLocationEngine. It sounds like you have a unique case though and are looking to avoid this scenario.

Sounds like there is demand for a LOST replacement, so I will look into implementing that and making it an offering within our pipeline.

If you could give me more info on your circumstances and what your app is looking to do, I could make some recommendations to get the desired result you are looking for.


@sstolz
@electrostat thanks for your answer. My goal is to do geofencing during a mapbox turn-by-turn car navigation session because I need to know when I'm approaching a waypoint on a custom route. I was trying to use LOST geofencing but with the new SDK I switched to Google geofencing. Right now I'm testing geofencing on a mapbox mapview. I will make some tests with the GoogleLocationEngine but I'm not sure to understand what you mean by "your" GoogleLocationEngine. How to know what is the underlying engine used ? Right now I'm already including play-services-location in my project. Do you have any documentation on mapbox location engine ? I didn't find anything on current (v6.1.1) android SDK documentation.

Use IntentService with PendingIntent to receive background location updates

Capturing from LocationRequest documentation:

This method is suited for the background use cases, more specifically for receiving location updates, even when the app has been killed by the system. In order to do so, use a PendingIntent for a started service. For foreground use cases, the LocationCallback version of the method is recommended, see requestLocationUpdates(LocationRequest, LocationCallback, Looper).

We currently rely on using the other method above which should be used for foreground use-cases.

Job Service Context Crash

While testing the Oreo update, came across a crash that intermittently occurs when creating a LocationEvent. Looks to be related to the siloing that occurs with the job service. Context seems to be missing for MapboxTelemetry. Need to work on better solution to prevent issue from happening.

Investigate and Fix possible Doze bug

A single report of a crash regarding binding our TelemetryService in Nougat hints that there are other circumstances that this #157 bug happens under. My suspicion is a likely relation to Doze or possible Samsung app over-management.

Will investigate further and come up with a solution for pre-Oreo builds.

cc: @zugaldia

Release 3.0.3

Release checklist

  • Change version name to 3.0.3 in gradle.properties
  • change version name of Android Core: 0.2.0 in gradle.properties
  • Publish 3.0.3 artifact to Maven Central
  • Change version name back to 4.0.0-SNAPSHOT for telemetry
  • Change version name back to 0.3.0-SNAPSHOT for core
  • Update CHANGELOG.md
  • Tag v3.0.3 in GitHub

Post release

Update MAS to 3.2.0

Current used version of MAS is 2.2.6, see here. Please update to the most recent version. Additionally do not pull in the full library if you only need a subset of the API.

cc @electrostat @zugaldia

3.1.2 Telemetry Release

Release checklist

  • Change version name of Android Telemetry to 3.1.2 in gradle.properties
  • change version name of Android Core to 0.2.0 in gradle.properties
  • toggle off core release
  • Publish 3.1.2 artifact to Maven Central
  • Change version name back to 3.2.0-SNAPSHOT for telemetry
  • Change version name back to 0.3.0-SNAPSHOT for core
  • toggle Core release back on
  • Update CHANGELOG.md
  • Tag v3.1.2 in GitHub

Post release

  • Add release javadocs to appropriate spot in /android-docs api folder @langsmith

/cc: @zugaldia @lilykaiser

3.0.0 Beta 3 Release

Release checklist

  • Change version name to 3.0.0-beta.3 in gradle.properties
  • change version name of Android Core: 0.2.0-beta.3 in gradle.properties
  • Publish 3.0.0-beta.3 artifact to Maven Central
  • Change version name back to 4.0.0-SNAPSHOT for telemetry
  • Change version name back to 0.3.0-SNAPSHOT for core
  • Update CHANGELOG.md
  • Tag v3.0.0-beta.3 in GitHub

Post release

  • Add release javadocs to appropriate spot in /android-docs api folder @langsmith

/cc: @zugaldia @lilykaiser

IllegalStateException: Not allowed to start service Intent (Android O)

Refs. mapbox/mapbox-navigation-android#901

 Process: ro.ascendnet.android.startaxi.taximetrist, PID: 4001
                                                                                         java.lang.ExceptionInInitializerError
                                                                                             at com.mapbox.mapboxsdk.maps.Telemetry$TelemetryHolder.access$000(Telemetry.java:41)
                                                                                             at com.mapbox.mapboxsdk.maps.Telemetry.obtainTelemetry(Telemetry.java:46)
                                                                                             at com.mapbox.mapboxsdk.maps.Telemetry.initialize(Telemetry.java:30)
                                                                                             at com.mapbox.mapboxsdk.Mapbox.getInstance(Mapbox.java:49)
                                                                                             at ro.ascendnet.android.startaxi.taximetrist.core.Driver.onCreate(Driver.java:34)
                                                                                             at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1120)
                                                                                             at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5747)
                                                                                             at android.app.ActivityThread.-wrap1(Unknown Source:0)
                                                                                             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
                                                                                             at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                             at android.os.Looper.loop(Looper.java:164)
                                                                                             at android.app.ActivityThread.main(ActivityThread.java:6501)
                                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                                             at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
                                                                                          Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=ro.ascendnet.android.startaxi.taximetrist/com.mapbox.android.telemetry.TelemetryService }: app is in background uid UidRecord{4f69d22 u0a197 SVC  idle change:idle|uncached procs:1 seq(0,0,0)}
                                                                                             at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1521)
                                                                                             at android.app.ContextImpl.startService(ContextImpl.java:1477)
                                                                                             at android.content.ContextWrapper.startService(ContextWrapper.java:650)
                                                                                             at com.mapbox.android.telemetry.MapboxTelemetry.startLocation(MapboxTelemetry.java:490)
                                                                                             at com.mapbox.android.telemetry.MapboxTelemetry.startTelemetryService(MapboxTelemetry.java:226)
                                                                                             at com.mapbox.android.telemetry.MapboxTelemetry.optLocationIn(MapboxTelemetry.java:197)
                                                                                             at com.mapbox.android.telemetry.MapboxTelemetry.startTelemetry(MapboxTelemetry.java:461)
                                                                                             at com.mapbox.android.telemetry.MapboxTelemetry.enable(MapboxTelemetry.java:136)
                                                                                             at com.mapbox.mapboxsdk.maps.Telemetry.<init>(Telemetry.java:25)
                                                                                             at com.mapbox.mapboxsdk.maps.Telemetry.<init>(Telemetry.java:10)
                                                                                             at com.mapbox.mapboxsdk.maps.Telemetry$TelemetryHolder.<clinit>(Telemetry.java:42)
                                                                                             at com.mapbox.mapboxsdk.maps.Telemetry$TelemetryHolder.access$000(Telemetry.java:41) 
                                                                                             at com.mapbox.mapboxsdk.maps.Telemetry.obtainTelemetry(Telemetry.java:46) 
                                                                                             at com.mapbox.mapboxsdk.maps.Telemetry.initialize(Telemetry.java:30) 
                                                                                             at com.mapbox.mapboxsdk.Mapbox.getInstance(Mapbox.java:49) 
                                                                                             at ro.ascendnet.android.startaxi.taximetrist.core.Driver.onCreate(Driver.java:34) 
                                                                                             at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1120) 
                                                                                             at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5747) 
                                                                                             at android.app.ActivityThread.-wrap1(Unknown Source:0) 
                                                                                             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656) 
                                                                                             at android.os.Handler.dispatchMessage(Handler.java:106) 
                                                                                             at android.os.Looper.loop(Looper.java:164) 
                                                                                             at android.app.ActivityThread.main(ActivityThread.java:6501) 
                                                                                             at java.lang.reflect.Method.invoke(Native Method) 
                                                                                             at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
                                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

That's because the new Android O background execution limits on API 26+ 👀

https://developer.android.com/about/versions/oreo/android-8.0-changes#back-all

More in depth reference 👉 https://developer.android.com/about/versions/oreo/background.html

@vladgheorghe we're working on bringing the changes needed in #70 in the meantime, I guess a workaround would be to target/compile with API 25 instead. BTW, do you have some more information on used device and Android version?

cc @electrostat @zugaldia

Root Cause of Missing Context

Investigate missing MapboxTelemetry.applicationContext when generating a location event.

  • possible causes could be a race condition or odd background state
  • solution may be to just drop events when context is not set

Reference Ticket: #144

cc: @zugaldia

3.0.1 Release

Release checklist

  • Change version name to 3.0.1 in gradle.properties
  • change version name of Android Core: 0.2.0 in gradle.properties
  • Publish 3.0.1 artifact to Maven Central
  • Change version name back to 4.0.0-SNAPSHOT for telemetry
  • Change version name back to 0.3.0-SNAPSHOT for core
  • Update CHANGELOG.md
  • Tag v3.0.1 in GitHub

Post release

  • Add release javadocs to appropriate spot in /android-docs api folder @langsmith
  • If stable core version, bump version number in this repo's README @langsmith
  • If stable core version, bump version number in /android-docs repo's constants.js file @langsmith
    /cc: @zugaldia @lilykaiser

3.1.4 Telemetry Release

Release checklist

  • Change version name of Android Telemetry to 3.1.4 in gradle.properties
  • change version name of Android Core to 0.2.0 in gradle.properties
  • toggle off core release
  • Publish 3.1.4 artifact to Maven Central
  • Change version name back to 3.2.0-SNAPSHOT for telemetry
  • Change version name back to 0.3.0-SNAPSHOT for core
  • toggle Core release back on
  • Update CHANGELOG.md
  • Tag v3.1.4 in GitHub
  • Make GitHub Release

Post release

  • Add release javadocs to appropriate spot in /android-docs api folder @langsmith

/cc: @zugaldia @lilykaiser

3.0.0 Beta 2 Release

Release checklist

  • Change version name to 3.0.0-beta.2 in gradle.properties
  • change version name of Android Core: 0.2.0-beta.2 in gradle.properties
  • Publish 3.0.0-beta.2 artifact to Maven Central
  • Change version name back to 4.0.0-SNAPSHOT for telemetry
  • Change version name back to 0.3.0-SNAPSHOT for core
  • Update CHANGELOG.md
  • Tag v3.0.0-beta.2 in GitHub

Post release

  • Add release javadocs to appropriate spot in /android-docs api folder @langsmith

/cc: @zugaldia @lilykaiser

Telemetry crash on stop service

Hello,
i've use mapbox sdk v 6.0.1 + telemetry 3.0.2 + location layer plugin 0.5.0
Has very rare crash on fabric stat:
xiaomi, oneplus, android 6.0.1, 100% App In Background

Fatal Exception: java.lang.RuntimeException: Unable to stop service com.mapbox.android.telemetry.TelemetryService@eba3f54: java.lang.NullPointerException: Attempt to invoke virtual method 'com.mapbox.android.telemetry.TelemetryLocationEnabler$LocationState com.mapbox.android.telemetry.TelemetryLocationEnabler.updateTelemetryLocationState(com.mapbox.android.telemetry.TelemetryLocationEnabler$LocationState)' on a null object reference
at android.app.ActivityThread.handleStopService(ActivityThread.java:3105)
at android.app.ActivityThread.access$2400(ActivityThread.java:154)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1484)
at android.os.Handler.dispatchMessage(Handler.java:102)
+
Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'com.mapbox.android.telemetry.TelemetryLocationEnabler$LocationState com.mapbox.android.telemetry.TelemetryLocationEnabler.updateTelemetryLocationState(com.mapbox.android.telemetry.TelemetryLocationEnabler$LocationState)' on a null object reference
at com.mapbox.android.telemetry.TelemetryService.disableTelemetryLocationState(TelemetryService.java:240)
at com.mapbox.android.telemetry.TelemetryService.onDestroy(TelemetryService.java:64)
at android.app.ActivityThread.handleStopService(ActivityThread.java:3082)
at android.app.ActivityThread.access$2400(ActivityThread.java:154)

New SDK 6.1.1 + telemetry 3.1.0 + locationLayer 0.5.2 can fix this issue?

Batch location events

To optimize background location update. It's advised to use batching of location updates.

If your app is running in the background, the location system service computes a new location for your app only a few times each hour. This is the case even when your app is requesting more frequent location updates. By using the batched version of FLP, however, you have access to more time-frequent location history after your app receives a batch update

See related javadoc here.

Refs #159

cc @electrostat @zugaldia

3.0.0 Beta 4 Release

Release checklist

  • Change version name to 3.0.0-beta.4 in gradle.properties
  • change version name of Android Core: 0.2.0-beta.4 in gradle.properties
  • Publish 3.0.0-beta.4 artifact to Maven Central
  • Change version name back to 4.0.0-SNAPSHOT for telemetry
  • Change version name back to 0.3.0-SNAPSHOT for core
  • Update CHANGELOG.md
  • Tag v3.0.0-beta.4 in GitHub

Post release

  • Add release javadocs to appropriate spot in /android-docs api folder @langsmith

/cc: @zugaldia @lilykaiser

Issues when requesting Location with Engine

Calling requestLocationUpdates() makes the app crash.

dependencies:
implementation "com.mapbox.mapboxsdk:mapbox-android-sdk:6.1.3"
implementation "com.mapbox.mapboxsdk:mapbox-android-core:0.2.0"
implementation 'com.mapbox.mapboxsdk:mapbox-android-plugin-locationlayer:0.5.0'
implementation 'com.google.android.gms:play-services-base:15.0.1'
implementation('com.google.android.gms:play-services-location:15.0.1')

The code:
//calling it in a fragment
private val locationEngine: LocationEngine by lazy { LocationEngineProvider(context).obtainBestLocationEngineAvailable() }

override fun onStart() {
        requestPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) {
            locationEngine.apply {
                if (it) { //has permission
                    activate()
                    addLocationEngineListener(object : LocationEngineListener {
                        override fun onLocationChanged(location: Location) {
                            Log.i("New Position", "${location.latitude} ${location.longitude}")
                        }

                        @SuppressLint("MissingPermission")
                        override fun onConnected() {
                            requestLocationUpdates() //crashes here
                        }

                    })

                }
            }
        }
        super.onStart()
    }

crash log:

2018-06-19 12:09:09.530 4351-4351/com.m2f.tagn.debug E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.m2f.tagn.debug, PID: 4351
    java.lang.NullPointerException: Attempt to invoke interface method 'void com.mapbox.android.core.location.UpdateGoogleRequestPriority.update(com.google.android.gms.location.LocationRequest)' on a null object reference
        at com.mapbox.android.core.location.GoogleLocationEngine.updateRequestPriority(GoogleLocationEngine.java:167)
        at com.mapbox.android.core.location.GoogleLocationEngine.requestLocationUpdates(GoogleLocationEngine.java:129)
        at com.m2f.tagn.map.MapFragment$onStart$1$1$1.onConnected(MapFragment.kt:115)
        at com.mapbox.android.core.location.GoogleLocationEngine.onConnected(GoogleLocationEngine.java:93)
        at com.google.android.gms.common.internal.GmsClientEventManager.onConnectionSuccess(Unknown Source:109)
        at com.google.android.gms.common.api.internal.zzav.zzb(Unknown Source:22)
        at com.google.android.gms.common.api.internal.zzaj.zzat(Unknown Source:92)
        at com.google.android.gms.common.api.internal.zzaj.onConnected(Unknown Source:21)
        at com.google.android.gms.common.api.internal.zzbd.onConnected(Unknown Source:7)
        at com.google.android.gms.common.api.internal.zzp.onConnected(Unknown Source:5)
        at com.google.android.gms.common.internal.zzf.onConnected(Unknown Source:2)
        at com.google.android.gms.common.internal.BaseGmsClient$PostInitCallback.handleServiceSuccess(Unknown Source:130)
        at com.google.android.gms.common.internal.BaseGmsClient$zza.deliverCallback(Unknown Source:62)
        at com.google.android.gms.common.internal.BaseGmsClient$zza.deliverCallback(Unknown Source:2)
        at com.google.android.gms.common.internal.BaseGmsClient$CallbackProxy.deliverCallback(Unknown Source:51)
        at com.google.android.gms.common.internal.BaseGmsClient$zzb.handleMessage(Unknown Source:270)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
2018-06-19 12:09:09.532 4351-4351/com.m2f.tagn.debug E/UncaughtException: java.lang.NullPointerException: Attempt to invoke interface method 'void com.mapbox.android.core.location.UpdateGoogleRequestPriority.update(com.google.android.gms.location.LocationRequest)' on a null object reference
        at com.mapbox.android.core.location.GoogleLocationEngine.updateRequestPriority(GoogleLocationEngine.java:167)
        at com.mapbox.android.core.location.GoogleLocationEngine.requestLocationUpdates(GoogleLocationEngine.java:129)
        at com.m2f.tagn.map.MapFragment$onStart$1$1$1.onConnected(MapFragment.kt:115)
        at com.mapbox.android.core.location.GoogleLocationEngine.onConnected(GoogleLocationEngine.java:93)
        at com.google.android.gms.common.internal.GmsClientEventManager.onConnectionSuccess(Unknown Source:109)
        at com.google.android.gms.common.api.internal.zzav.zzb(Unknown Source:22)
        at com.google.android.gms.common.api.internal.zzaj.zzat(Unknown Source:92)
        at com.google.android.gms.common.api.internal.zzaj.onConnected(Unknown Source:21)
        at com.google.android.gms.common.api.internal.zzbd.onConnected(Unknown Source:7)
        at com.google.android.gms.common.api.internal.zzp.onConnected(Unknown Source:5)
        at com.google.android.gms.common.internal.zzf.onConnected(Unknown Source:2)
        at com.google.android.gms.common.internal.BaseGmsClient$PostInitCallback.handleServiceSuccess(Unknown Source:130)
        at com.google.android.gms.common.internal.BaseGmsClient$zza.deliverCallback(Unknown Source:62)
        at com.google.android.gms.common.internal.BaseGmsClient$zza.deliverCallback(Unknown Source:2)
        at com.google.android.gms.common.internal.BaseGmsClient$CallbackProxy.deliverCallback(Unknown Source:51)
        at com.google.android.gms.common.internal.BaseGmsClient$zzb.handleMessage(Unknown Source:270)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

device:
Emulator Nexus 5X API 26 with Play Store, Target Ansdroid 8.0 (Google Play)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.