Android Maneira mais simples de obter a localização do usuário: longitude, latitude e endereço

Tempo de leitura: 4 minutes

Neste tutorial, irei mostrar como obter a localização atual do usuário no Android e no Kotlin. para este projeto, usaremos o serviço de localização fornecido pelo Google.

Adicione as dependências

para este tutorial, precisamos adicionar a biblioteca de localização do google, para isso vá para o arquivo Gradle.app e adicione esta linha dentro dos colchetes de dependências

implementation "com.google.android.gms:play-services-location:17.0.0"

para este tutorial, usei a versão 17.0.0 e é a última versão em 2020, então você pode ter uma versão superior, por isso recomendo que você verifique este link: Dependências do Google

 

Adicione a permissão

agora abra seu arquivo manifest.xml e adicione a permissão do usuário

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

agora vamos começar a codificar nosso aplicativo

Verificando a permissão

em primeiro lugar, precisamos verificar se o usuário nos permitiu obter sua localização ao aceitar a permissão do aplicativo

vamos criar uma função dentro do nosso MainActivity.kt que retorna um booleano do estado de permissão

fun CheckPermission():Boolean{
        // esta função retornará um booleano
        // verdadeiro: se tivermos permissão
        // falso se não
        if(
            ActivityCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED ||
                    ActivityCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                ){
            return true
        }

        return false

    }

 

então, se esta função retornar falso, precisamos solicitar a permissão de nosso usuário, então criaremos outra função que solicitará a permissão do usuário

Pedir permissão (Request Permission)

fun RequestPermission(){
        // esta função permite-nos dizer ao usuário para solicitar a permissão necessária se eles não forem vestidos
        ActivityCompat.requestPermissions(
          this,
            arrayOf(android.Manifest.permission.ACCESS_COARSE_LOCATION,android.Manifest.permission.ACCESS_FINE_LOCATION),
            PERMISSION_ID
        )
    }

como você pode ver, temos um parâmetro chamado PERMISSON_ID, este parâmetro é um número inteiro simples, você pode usar qualquer número inteiro, mas deve ser único se você planeja usar outra permissão

 

verificar se o serviço de localização está ativado

now that we have the permission we still need to check the location services is activated, so let’s create another function

fun isLocationEnabled():Boolean{
        // esta função retornará para nós o estado do serviço de localização
        // se o gps ou o provedor de rede estiverem habilitados, ele retornará verdadeiro, caso contrário, retornará falso
        var locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
        return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
    }

Obtendo a última localização

agora vamos começar obtendo a última localização do nosso usuário para isso, precisamos declarar algumas variáveis ​​antes do método on create

// Declarando as variáveis ​​necessárias
    lateinit var fusedLocationProviderClient: FusedLocationProviderClient
    lateinit var locationRequest: LocationRequest
    val PERMISSION_ID = 1010

 

e vamos iniciar a variável fusedLocationProviderClient dentro de nosso método onCreate

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
        getpos.setOnClickListener {
            Log.d("Debug:",CheckPermission().toString())
            Log.d("Debug:",isLocationEnabled().toString())
            RequestPermission()
           /* fusedLocationProviderClient.lastLocation.addOnSuccessListener{location: Location? ->
                textView.text = location?.latitude.toString() + "," + location?.longitude.toString()
            }*/
            getLastLocation()
        }

    }

 

então, como você pode ver, temos uma função getLastLocation () que devemos declarar, esta função permitirá que você obtenha a localização do último usuário

fun getLastLocation(){
       if(CheckPermission()){
           if(isLocationEnabled()){
               fusedLocationProviderClient.lastLocation.addOnCompleteListener {task->
                   var location:Location? = task.result
                   if(location == null){
                       NewLocationData()
                   }else{
                       Log.d("Debug:" ,"Sua localização:"+ location.longitude)
                       textView.text = "Sua localização atual é : Long: "+ location.longitude + " , Lat: " + location.latitude + "\n" + getCityName(location.latitude,location.longitude)
                   }
               }
           }else{
               Toast.makeText(this,"Ligue a localização do seu dispositivo",Toast.LENGTH_SHORT).show()
           }
       }else{
           RequestPermission()
       }
   }

agora precisamos criar uma função que irá atualizar a localização do usuário, então vamos declarar uma nova função que obterá a nova localização do usuário

fun NewLocationData(){
        var locationRequest =  LocationRequest()
        locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        locationRequest.interval = 0
        locationRequest.fastestInterval = 0
        locationRequest.numUpdates = 1
        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
        fusedLocationProviderClient!!.requestLocationUpdates(
            locationRequest,locationCallback,Looper.myLooper()
        )
    }


    private val locationCallback = object : LocationCallback(){
        override fun onLocationResult(locationResult: LocationResult) {
            var lastLocation: Location = locationResult.lastLocation
            Log.d("Debug:","sua última localização:"+ lastLocation.longitude.toString())
            textView.text = "Sua última localização é: Long: "+ lastLocation.longitude + " , Lat: " + lastLocation.latitude + "\n" + getCityName(lastLocation.latitude,lastLocation.longitude)
        }
    }

 

Agora, se executarmos o aplicativo, obteremos apenas a latitude e a longitude do usuário, mas precisamos obter o endereço completo, para fazer isso, criaremos uma função final que converterá a latitude e a longitude no endereço usando o geocodificador

private fun getCityName(lat: Double,long: Double):String{
        var cityName:String = ""
        var countryName = ""
        var geoCoder = Geocoder(this, Locale.getDefault())
        var Adress = geoCoder.getFromLocation(lat,long,3)

        cityName = Adress.get(0).locality
        countryName = Adress.get(0).countryName
        Log.d("Debug:","Sua cidade: " + cityName + " ; your Country " + countryName)
        return cityName
    }

 

MainActivity.kt

//Adicione as dependências
//implementation "com.google.android.gms:play-services-location:17.0.0"


package br.com.capsistema.json

import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.location.Geocoder
import android.location.Location
import android.location.LocationManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Looper
import android.provider.ContactsContract
import android.provider.Settings
import android.util.Log
import android.widget.Toast
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.*
import kotlinx.android.synthetic.main.activity_main.*
import java.security.Permission
import java.security.Provider
import java.util.*

class MainActivity : AppCompatActivity() {

    // Declarando as variáveis ​​necessárias
    lateinit var fusedLocationProviderClient: FusedLocationProviderClient
    lateinit var locationRequest: LocationRequest
    val PERMISSION_ID = 1010

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
        getpos.setOnClickListener {
            Log.d("Debug:",CheckPermission().toString())
            Log.d("Debug:",isLocationEnabled().toString())
            RequestPermission()
           /* fusedLocationProviderClient.lastLocation.addOnSuccessListener{location: Location? ->
                textView.text = location?.latitude.toString() + "," + location?.longitude.toString()
            }*/
            getLastLocation()
        }

    }

     fun getLastLocation(){
        if(CheckPermission()){
            if(isLocationEnabled()){
                fusedLocationProviderClient.lastLocation.addOnCompleteListener {task->
                    var location:Location? = task.result
                    if(location == null){
                        NewLocationData()
                    }else{
                        Log.d("Debug:" ,"Sua localização:"+ location.longitude)
                        textView.text = "Sua localização atual é: Long: "+ location.longitude + " , Lat: " + location.latitude + "\n" + getCityName(location.latitude,location.longitude)
                    }
                }
            }else{
                Toast.makeText(this,"Ligue a localização do seu dispositivo",Toast.LENGTH_SHORT).show()
            }
        }else{
            RequestPermission()
        }
    }


     fun NewLocationData(){
        var locationRequest =  LocationRequest()
        locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        locationRequest.interval = 0
        locationRequest.fastestInterval = 0
        locationRequest.numUpdates = 1
        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
        fusedLocationProviderClient!!.requestLocationUpdates(
            locationRequest,locationCallback,Looper.myLooper()
        )
    }


    private val locationCallback = object : LocationCallback(){
        override fun onLocationResult(locationResult: LocationResult) {
            var lastLocation: Location = locationResult.lastLocation
            Log.d("Debug:","sua última localização: "+ lastLocation.longitude.toString())
            textView.text = "Seu último local é: Long: "+ lastLocation.longitude + " , Lat: " + lastLocation.latitude + "\n" + getCityName(lastLocation.latitude,lastLocation.longitude)
        }
    }

    private fun CheckPermission():Boolean{
        // esta função retornará um booleano
        // verdadeiro: se tivermos permissão
        // falso se não
        if(
            ActivityCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED ||
                    ActivityCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                ){
            return true
        }

        return false

    }

     fun RequestPermission(){
        // esta função permite-nos dizer ao usuário para solicitar a permissão necessária se eles não forem vestidos
        ActivityCompat.requestPermissions(
          this,
            arrayOf(android.Manifest.permission.ACCESS_COARSE_LOCATION,android.Manifest.permission.ACCESS_FINE_LOCATION),
            PERMISSION_ID
        )
    }

     fun isLocationEnabled():Boolean{
        // esta função retornará para nós o estado do serviço de localização
        // se o gps ou o provedor de rede estiverem habilitados, ele retornará verdadeiro, caso contrário, retornará falso
        var locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
        return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
    }


    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
      if(requestCode == PERMISSION_ID){
          if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED){
              Log.d("Debug:","Você tem a permissão")
          }
      }
    }

    private fun getCityName(lat: Double,long: Double):String{
        var cityName:String = ""
        var countryName = ""
        var geoCoder = Geocoder(this, Locale.getDefault())
        var Adress = geoCoder.getFromLocation(lat,long,3)

        cityName = Adress.get(0).locality
        countryName = Adress.get(0).countryName
        Log.d("Debug:","Sua cidade: " + cityName + " ; your Country " + countryName)
        return cityName
    }

}

 

não se esqueça de adicionar uma visualização de texto dentro do seu arquivo de layout e um botão para realizar o evento.