LocationClass.kt 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. Пример использования класса
  3. // в классе главного окна объявляете переменную
  4. private lateinit val locationClass: LocationClass
  5. // в конструкторе основного класса создайте экземпляр этого класса
  6. locationClass = LocationClass(this) { lat, lon ->
  7. if(lat != null && lon != null) {
  8. Toast.makeText(this, "$lat/$lon", Toast.LENGTH_SHORT).show()
  9. }
  10. }
  11. // в классе главного окна реализуйте метод
  12. override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>,
  13. grantResults: IntArray) {
  14. super.onRequestPermissionsResult(requestCode, permissions, grantResults)
  15. locationClass.onRequestPermissionsResult(requestCode, grantResults)
  16. }
  17. */
  18. package ru.yotc.location
  19. import android.Manifest
  20. import android.app.Activity
  21. import android.content.pm.PackageManager
  22. import android.os.Looper
  23. import androidx.core.app.ActivityCompat
  24. import androidx.core.content.ContextCompat
  25. import com.google.android.gms.location.*
  26. typealias MyLocationCallback = (Double?, Double?) -> Unit
  27. @Suppress("DEPRECATION", "DEPRECATED_IDENTITY_EQUALS")
  28. class LocationClass(
  29. private val activity: Activity,
  30. private val callback: MyLocationCallback
  31. ){
  32. private var fusedLocationClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(activity)
  33. private lateinit var mLocationRequest: LocationRequest
  34. private var mLocationCallback: LocationCallback
  35. init {
  36. mLocationCallback = object : LocationCallback() {
  37. override fun onLocationResult(locationResult: LocationResult) {
  38. if (locationResult.locations.isNotEmpty()) {
  39. val locIndex = locationResult.locations.size - 1
  40. val lon = locationResult.locations[locIndex].longitude
  41. val lat = locationResult.locations[locIndex].latitude
  42. onGetCoordinates(lat, lon)
  43. }
  44. }
  45. }
  46. checkPermission()
  47. }
  48. fun onRequestPermissionsResult(
  49. requestCode: Int,
  50. grantResults: IntArray)
  51. {
  52. when (requestCode) {
  53. 1 -> {
  54. if (grantResults.isNotEmpty() && grantResults[0] ==
  55. PackageManager.PERMISSION_GRANTED) {
  56. if ((ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) === PackageManager.PERMISSION_GRANTED))
  57. {
  58. checkPermission()
  59. }
  60. } else {
  61. callback.invoke(null, null)
  62. }
  63. return
  64. }
  65. }
  66. }
  67. private fun checkPermission(){
  68. if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
  69. ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
  70. {
  71. // нет разрешений - запрашиваем
  72. val permissions = arrayOf(
  73. Manifest.permission.ACCESS_FINE_LOCATION,
  74. Manifest.permission.ACCESS_COARSE_LOCATION
  75. )
  76. ActivityCompat.requestPermissions(activity, permissions, 1)
  77. } else {
  78. // есть разрешения - запускаем периодический опрос геолокации
  79. mLocationRequest = LocationRequest()
  80. mLocationRequest.interval = 10000
  81. mLocationRequest.fastestInterval = 1000
  82. mLocationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
  83. fusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper())
  84. }
  85. }
  86. fun onGetCoordinates(lat: Double, lon: Double) {
  87. fusedLocationClient.removeLocationUpdates(mLocationCallback)
  88. callback.invoke(lat, lon)
  89. }
  90. }