/*
В манифест добавить разрешеня на геолокацию
Пример использования класса
// в классе главного окна объявляете переменную
private lateinit val locationClass: LocationClass
// в конструкторе основного класса создайте экземпляр этого класса
locationClass = LocationClass(this) { lat, lon ->
if(lat != null && lon != null) {
Toast.makeText(this, "$lat/$lon", Toast.LENGTH_SHORT).show()
}
}
// в классе главного окна реализуйте метод
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array,
grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
locationClass.onRequestPermissionsResult(requestCode, grantResults)
}
*/
// package тут не забыть установить свой пакет
import android.Manifest
import android.app.Activity
import android.content.pm.PackageManager
import android.os.Looper
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.google.android.gms.location.*
typealias MyLocationCallback = (Double?, Double?) -> Unit
@Suppress("DEPRECATION", "DEPRECATED_IDENTITY_EQUALS")
class LocationClass(
private val activity: Activity,
private val callback: MyLocationCallback
){
private var fusedLocationClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(activity)
private lateinit var mLocationRequest: LocationRequest
private var mLocationCallback: LocationCallback
init {
mLocationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
if (locationResult.locations.isNotEmpty()) {
val locIndex = locationResult.locations.size - 1
val lon = locationResult.locations[locIndex].longitude
val lat = locationResult.locations[locIndex].latitude
onGetCoordinates(lat, lon)
}
}
}
checkPermission()
}
fun onRequestPermissionsResult(
requestCode: Int,
grantResults: IntArray)
{
when (requestCode) {
1 -> {
if (grantResults.isNotEmpty() && grantResults[0] ==
PackageManager.PERMISSION_GRANTED) {
if ((ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) === PackageManager.PERMISSION_GRANTED))
{
checkPermission()
}
} else {
callback.invoke(null, null)
}
return
}
}
}
private fun checkPermission(){
if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
{
// нет разрешений - запрашиваем
val permissions = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
ActivityCompat.requestPermissions(activity, permissions, 1)
} else {
// есть разрешения - запускаем периодический опрос геолокации
mLocationRequest = LocationRequest()
mLocationRequest.interval = 10000
mLocationRequest.fastestInterval = 1000
mLocationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
fusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper())
}
}
fun onGetCoordinates(lat: Double, lon: Double) {
fusedLocationClient.removeLocationUpdates(mLocationCallback)
callback.invoke(lat, lon)
}
}