LocationClass.kt 4.3 KB

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