У меня есть активность, которая получает местоположение пользователя каждые X секунд. Когда местоположение пользователя находится в радиусе 15 метров от определенной точки, я хочу, чтобы поставщик местоположения прекратил обновление местоположения пользователя и начал новое действие.
У меня есть следующий способ остановить обновления местоположения:
private fun stopLocationUpdates() {
fusedLocationClient.removeLocationUpdates(locationCallback)
}
Я вызываю stopLocationUpdates()
в методах onPause()
и onDestroy()
. Я пытался вызвать его внутри цикла for each
местоположения, когда дело distance < 15
проверено. Ничего из этого не работает.
Я пытаюсь вызвать finish()
, чтобы завершить текущее действие, и с помощью Logcat я вижу, что местоположение продолжает обновляться, хотя действие завершено.
Кроме того, новая активность (ExerciseActivity
) продолжает запускаться в цикле.
Пожалуйста, дайте мне знать, как я могу остановить это. Заранее спасибо.
Я оставляю здесь основные части кода этого действия:
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)
}
}
Попробуйте убрать startLocationUpdates()
вызов внутри onCreate()
, надеюсь, это поможет вам работать.
Объяснение:
Вы вызываете метод startLocationUpdates()
в методах onCreate()
и onResume()
. Таким образом, он сделает два обратных вызова, последние из которых вы сохраните внутри locationCallback
. Но вы теряете первый обратный вызов, созданный при вызове onCreate()
. Поэтому, когда вы вызываете fusedLocationClient .removeLocationUpdates(locationCallback)
, вы просто удаляете один из обратных вызовов!
Спасибо за ваш ответ. Это сработало, однако для обновления местоположения требуется более 10 секунд, хотя у меня есть locationRequest.interval = 300
и locationRequest.fastestInterval = 100
. Есть идеи, почему?
У меня такая же проблема. Кажется, это начальная задержка, с которой андроид должен найти первое местоположение. Но после этого он будет обновляться с заданным вами интервалом.
Они также могут удалить лишнее удаление в
onDestroy()
.