Невозможно остановить провайдера Fused Location с помощью removeLocationUpdates()

У меня есть активность, которая получает местоположение пользователя каждые 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)
}
}
0
0
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте убрать startLocationUpdates() вызов внутри onCreate(), надеюсь, это поможет вам работать.

Объяснение: Вы вызываете метод startLocationUpdates() в методах onCreate() и onResume(). Таким образом, он сделает два обратных вызова, последние из которых вы сохраните внутри locationCallback. Но вы теряете первый обратный вызов, созданный при вызове onCreate(). Поэтому, когда вы вызываете fusedLocationClient .removeLocationUpdates(locationCallback), вы просто удаляете один из обратных вызовов!

Они также могут удалить лишнее удаление в onDestroy().

Tenfour04 25.10.2022 15:49

Спасибо за ваш ответ. Это сработало, однако для обновления местоположения требуется более 10 секунд, хотя у меня есть locationRequest.interval = 300 и locationRequest.fastestInterval = 100 . Есть идеи, почему?

jpsf 04.11.2022 12:55

У меня такая же проблема. Кажется, это начальная задержка, с которой андроид должен найти первое местоположение. Но после этого он будет обновляться с заданным вами интервалом.

mohammad fakhraee 05.11.2022 09:42

Другие вопросы по теме