Android Maneira mais simples de obter a localização do usuário: longitude, latitude e endereço
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.
Conteudo
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.