feat: add FusedLocationProvider for GPS location acquisition

This commit is contained in:
fiatcode 2026-04-30 10:58:27 +07:00
parent 1d6aad599c
commit 0f969afbd5
No known key found for this signature in database

View file

@ -0,0 +1,69 @@
package com.traccar.traccar_client.location
import android.annotation.SuppressLint
import android.content.Context
import android.location.Location
import android.os.Looper
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationRequest
import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationServices
import com.google.android.gms.location.Priority
class FusedLocationProvider(context: Context) {
private val fusedLocationClient: FusedLocationProviderClient =
LocationServices.getFusedLocationProviderClient(context)
private var locationCallback: LocationCallback? = null
@SuppressLint("MissingPermission")
fun startLocationUpdates(
interval: Long,
fastestInterval: Long,
accuracy: Int,
callback: (Location) -> Unit
) {
val locationRequest = LocationRequest.Builder(interval)
.setMinUpdateIntervalMillis(fastestInterval)
.setPriority(mapAccuracy(accuracy))
.build()
locationCallback = object : LocationCallback() {
override fun onLocationResult(result: LocationResult) {
result.lastLocation?.let { callback(it) }
}
}
fusedLocationClient.requestLocationUpdates(
locationRequest,
locationCallback!!,
Looper.getMainLooper()
)
}
fun stopLocationUpdates() {
locationCallback?.let {
fusedLocationClient.removeLocationUpdates(it)
locationCallback = null
}
}
@SuppressLint("MissingPermission")
fun getLastLocation(callback: (Location?) -> Unit) {
fusedLocationClient.lastLocation
.addOnSuccessListener { location -> callback(location) }
.addOnFailureListener { callback(null) }
}
private fun mapAccuracy(accuracy: Int): Int {
return when (accuracy) {
0 -> Priority.PRIORITY_HIGH_ACCURACY
1 -> Priority.PRIORITY_HIGH_ACCURACY
2 -> Priority.PRIORITY_BALANCED_POWER_ACCURACY
3 -> Priority.PRIORITY_LOW_POWER
else -> Priority.PRIORITY_BALANCED_POWER_ACCURACY
}
}
}