I have an activity that is receiving the user location every X seconds. When the user location is within the radius of 15 meters from a specific point, I want the Location Provider to stop updating the user location and to start a new activity.
I have the following method to stop location updates:
private fun stopLocationUpdates() {
fusedLocationClient.removeLocationUpdates(locationCallback)
}
I call stopLocationUpdates() in both onPause() and onDestroy() methods. I've tried to call it inside the for each location cicle, when the case distance < 15 is verified. None of this seems to work.
I am trying to call finish() to finish the current activity and by using the Logcat I see that the location keeps updating, although the activity is finished.
Plus, the new activity (ExerciseActivity) keeps launching in loop.
Please, let me know how I can stop this. Thank you in advance.
I leave here the major parts of the code of this activity:
class MapActivity : AppCompatActivity() {
private val requestPermissionsRequestCode = 1
private lateinit var fusedLocationClient: FusedLocationProviderClient
private lateinit var locationCallback: LocationCallback
private lateinit var locationRequest: LocationRequest
private var allCheckpoints: List<CheckpointResult> = ArrayList()
private val mAdapterNextCheckpoints = NextCheckpointAdapter()
private var nextCheckpoints: ArrayList<CheckpointResult> = ArrayList()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_map)
requestPermissionsIfNecessary(arrayOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.INTERNET
))
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
fusedLocationClient.lastLocation
.addOnSuccessListener { location: Location? ->
if (location != null) {
mUserMarker.position = GeoPoint(location.latitude, location.longitude)
mUserMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM)
mUserMarker.title = getString(R.string.your_position)
map.overlays.add(mUserMarker)
map.controller.setCenter(mUserMarker.position)
}
}
startLocationUpdates()
}
private fun startLocationUpdates() {
locationRequest = create()
locationRequest.interval = 4000
locationRequest.priority = Priority.PRIORITY_HIGH_ACCURACY
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
for (location in locationResult.locations) {
mUserMarker.position = GeoPoint(location.latitude, location.longitude)
mUserMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM)
mUserMarker.title = getString(R.string.your_position)
map.overlays.add(mUserMarker)
mAdapterNextCheckpoints
if (nextCheckpoints.isNotEmpty()) {
for (checkpoint in nextCheckpoints) {
val results = FloatArray(3)
Location.distanceBetween(checkpoint.latitude,
checkpoint.longitude,
location.latitude,
location.longitude, results)
val distance = results[0]
Log.d("Distance: ", distance.toString())
if (distance <= 15) {
//stopLocationUpdates()
val i = Intent(this@MapActivity, ExerciseActivity::class.java)
i.putExtra("exerciseId", checkpoint.exercise.exerciseId)
startActivity(i)
finish()
}
}
}
}
}
}
fusedLocationClient.requestLocationUpdates(locationRequest,
locationCallback,
Looper.getMainLooper())
}
override fun onResume() {
super.onResume()
startLocationUpdates()
}
override fun onPause() {
super.onPause()
stopLocationUpdates()
}
override fun onDestroy() {
super.onDestroy()
stopLocationUpdates()
}
private fun stopLocationUpdates() {
fusedLocationClient.removeLocationUpdates(locationCallback)
}
}
Try removing
startLocationUpdates()call insideonCreate()and I hope it will get you to work.Explenation: You are calling
startLocationUpdates()method in bothonCreate()andonResume()methods. So it will make two callbacks which you store the latest insidelocationCallback. But you loose the first callback created whenonCreate()is called. So when you callfusedLocationClient .removeLocationUpdates(locationCallback), you just remove one of the callbacks!