Получайте обновления местоположения на основе временного интервала или минимального расстояния в Android (в зависимости Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Получайте обновления местоположения на основе временного интервала или минимального расстояния в Android (в зависимости

Сообщение Anonymous »

Я работаю над приложением для Android в Jetpack Compose, которое отслеживает текущее местоположение пользователя и позволяет членам группы отслеживать/проверять текущее местоположение и маршруты путешествий друг друга.
В настоящее время согласно Согласно коду, обновления местоположения поступают с интервалом каждые 10 секунд, но это потенциально может разрядить батарею пользователя. Поэтому мне нужно решение, позволяющее получать обновления местоположения с интервалом в 1 минуту или при обновлении расстояния в 10 метров, что наступит раньше!
Current LocationRequest строитель:

Код: Выделить всё

private const val LOCATION_UPDATE_INTERVAL = 10000L

private fun createRequest(): LocationRequest =
LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, LOCATION_UPDATE_INTERVAL)
.apply {
setGranularity(Granularity.GRANULARITY_PERMISSION_LEVEL)
setMinUpdateIntervalMillis(LOCATION_UPDATE_INTERVAL)
setWaitForAccurateLocation(true)
}.build()
Я попробовал применить setMinUpdateDistanceMeters(10f) в LocationRequest.Builder(), но он учитывает только временной интервал, когда пользователь движется, а не обновление расстояния — состояние пользователя меняется.
Вот общий код класса LocationManager.kt:

Код: Выделить всё

private const val LOCATION_UPDATE_INTERVAL = 10000L

@Singleton
class LocationManager @Inject constructor(@ApplicationContext private val context: Context) {

private var request: LocationRequest
private var locationClient: FusedLocationProviderClient =
LocationServices.getFusedLocationProviderClient(context)

init {
request = createRequest()
}

suspend fun getLastLocation(): Location? {
if (!context.hasCoarseLocationPermission) return null
return locationClient.lastLocation.await()
}

private val locationUpdatePendingIntent: PendingIntent by lazy {
val intent = Intent(context, LocationUpdateReceiver::class.java)
intent.action = ACTION_LOCATION_UPDATE
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
PendingIntent.getBroadcast(
context,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
)
} else {
PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}
}

private fun createRequest(): LocationRequest =
LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, LOCATION_UPDATE_INTERVAL)
.apply {
setGranularity(Granularity.GRANULARITY_PERMISSION_LEVEL)
setMinUpdateIntervalMillis(LOCATION_UPDATE_INTERVAL)
setWaitForAccurateLocation(true)
}.build()

internal fun startLocationTracking() {
if (context.hasFineLocationPermission) {
locationClient.requestLocationUpdates(request, locationUpdatePendingIntent)
}
}

internal fun stopLocationTracking() {
if (!context.isBackgroundLocationPermissionGranted) {
locationClient.flushLocations()
locationClient.removeLocationUpdates(locationUpdatePendingIntent)
}
}

fun startService() {
context.startService(Intent(context, BackgroundLocationService::class.java))
}

fun stopService() {
context.stopService(Intent(context, BackgroundLocationService::class.java))
}
}
Проект имеет открытый исходный код, поэтому, если вам потребуется какая-либо другая ссылка, вы, ребята, можете проверить репозиторий: GroupTrack

Подробнее здесь: https://stackoverflow.com/questions/790 ... dwhichever
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»