Locator.kt 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import android.Manifest
  2. import android.annotation.SuppressLint
  3. import android.content.pm.PackageManager
  4. import android.os.Bundle
  5. import android.os.Looper
  6. import android.view.View
  7. import android.widget.Toast
  8. import androidx.appcompat.app.AppCompatActivity
  9. import androidx.core.app.ActivityCompat
  10. import androidx.core.content.ContextCompat
  11. import com.google.android.gms.location.*
  12. /*
  13. В манифест добавить разрешеня на геолокацию
  14. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  15. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  16. */
  17. class MainActivity : AppCompatActivity() {
  18. private lateinit var fusedLocationClient: FusedLocationProviderClient
  19. private lateinit var mLocationRequest: LocationRequest
  20. override fun onCreate(savedInstanceState: Bundle?) {
  21. super.onCreate(savedInstanceState)
  22. setContentView(R.layout.activity_main)
  23. fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
  24. checkPermission()
  25. }
  26. private fun checkPermission(){
  27. if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
  28. ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
  29. {
  30. // нет разрешений
  31. val permissions = arrayOf(
  32. Manifest.permission.ACCESS_FINE_LOCATION,
  33. Manifest.permission.ACCESS_COARSE_LOCATION
  34. )
  35. ActivityCompat.requestPermissions(this, permissions, 0)
  36. } else {
  37. mLocationRequest = LocationRequest()
  38. mLocationRequest.interval = 10000
  39. mLocationRequest.fastestInterval = 1000
  40. mLocationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
  41. fusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper())
  42. }
  43. }
  44. override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>,
  45. grantResults: IntArray) {
  46. when (requestCode) {
  47. 1 -> {
  48. if (!grantResults.isEmpty() && grantResults[0] ==
  49. PackageManager.PERMISSION_GRANTED)
  50. {
  51. if ((ContextCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_FINE_LOCATION) === PackageManager.PERMISSION_GRANTED))
  52. {
  53. // получили разрешение - снова запускаем запрос разрешений, чтобы попасть в цикл опроса геолокации
  54. checkPermission()
  55. }
  56. } else {
  57. Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show()
  58. }
  59. return
  60. }
  61. }
  62. }
  63. private var mLocationCallback: LocationCallback = object : LocationCallback() {
  64. override fun onLocationResult(locationResult: LocationResult) {
  65. if (!locationResult.locations.isEmpty()) {
  66. val locIndex = locationResult.locations.size - 1
  67. val lon = locationResult.locations[locIndex].longitude
  68. val lat = locationResult.locations[locIndex].latitude
  69. onGetCoordinates(lat, lon)
  70. }
  71. }
  72. }
  73. fun onGetCoordinates(lat: Double, lon: Double){
  74. // завершаем цикл опроса
  75. fusedLocationClient.removeLocationUpdates(mLocationCallback)
  76. // тут делаем что хотели с координатами
  77. Toast.makeText(this, "${lat}, ${lon}", Toast.LENGTH_LONG).show()
  78. }
  79. }