In this tutorial, I'm Going to show you how to get user Current Location in Android And Kotlin. for this project, we will use the location service provided by Google.
Add the dependencies
for this tutorial we need to add the google location library, for this go to your Gradle.app file and add this line inside the dependencies brackets
implementation "com.google.android.gms:play-services-location:17.0.0"
for this tutorial, I used the 17.0.0 version and it's the latest version in 2020 so you may have an upper version that's why I recommend you to check this link: Google dependecies
Add the permission
now open your manifest.xml file and add the user permission
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
now let's start coding our app
Checking the Permission
first of all, we need to check that the user allowed us to get his location by accepting the app permission
we will create a function inside our MainActivity.kt that returns a boolean of the permission state
fun CheckPermission():Boolean{
//this function will return a boolean
//true: if we have permission
//false if not
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
}
so if this function returns false, we need then to request the permission from our user so we will create another function that will request the permission fro the user
Request permission
fun RequestPermission(){
//this function will allows us to tell the user to requesut the necessary permsiion if they are not garented
ActivityCompat.requestPermissions(
this,
arrayOf(android.Manifest.permission.ACCESS_COARSE_LOCATION,android.Manifest.permission.ACCESS_FINE_LOCATION),
PERMISSION_ID
)
}
as you can see we have a parameter called PERMISSON_ID, this parameter is a simple integer, you can use any integer but it must be unique if you plan to use other permission
checking the location service is enabled
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{
//this function will return to us the state of the location service
//if the gps or the network provider is enabled then it will return true otherwise it will return false
var locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
}
Getting the Last Location
now let's start by getting the last location of our user
for this, we need to declare some variables before the on create method
//Declaring the needed Variables
lateinit var fusedLocationProviderClient: FusedLocationProviderClient
lateinit var locationRequest: LocationRequest
val PERMISSION_ID = 1010
and let's initiate the fusedLocationProviderClient Variable inside our onCreate method
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()
}
}
so as you can see we have a getLastLocation() function that we have to declare, this function will allow you to get the last user location
fun getLastLocation(){
if(CheckPermission()){
if(isLocationEnabled()){
fusedLocationProviderClient.lastLocation.addOnCompleteListener {task->
var location:Location? = task.result
if(location == null){
NewLocationData()
}else{
Log.d("Debug:" ,"Your Location:"+ location.longitude)
textView.text = "You Current Location is : Long: "+ location.longitude + " , Lat: " + location.latitude + "\n" + getCityName(location.latitude,location.longitude)
}
}
}else{
Toast.makeText(this,"Please Turn on Your device Location",Toast.LENGTH_SHORT).show()
}
}else{
RequestPermission()
}
}
now we need to create a function that will update the user location, so let's declared a new function that will get the new location of the user
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:","your last last location: "+ lastLocation.longitude.toString())
textView.text = "You Last Location is : Long: "+ lastLocation.longitude + " , Lat: " + lastLocation.latitude + "\n" + getCityName(lastLocation.latitude,lastLocation.longitude)
}
}
Now if we run the app we will only get the latitude and the longitude of the user but we need to get the full address, to do this we will create a final function that will convert the latitude and the longitude into the address using Geocoder
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:","Your City: " + cityName + " ; your Country " + countryName)
return cityName
}
MainActivity.kt
//Add the dependencies
implementation "com.google.android.gms:play-services-location:17.0.0"
package tn.doctorcode.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() {
//Declaring the needed Variables
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:" ,"Your Location:"+ location.longitude)
textView.text = "You Current Location is : Long: "+ location.longitude + " , Lat: " + location.latitude + "\n" + getCityName(location.latitude,location.longitude)
}
}
}else{
Toast.makeText(this,"Please Turn on Your device Location",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:","your last last location: "+ lastLocation.longitude.toString())
textView.text = "You Last Location is : Long: "+ lastLocation.longitude + " , Lat: " + lastLocation.latitude + "\n" + getCityName(lastLocation.latitude,lastLocation.longitude)
}
}
private fun CheckPermission():Boolean{
//this function will return a boolean
//true: if we have permission
//false if not
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(){
//this function will allows us to tell the user to requesut the necessary permsiion if they are not garented
ActivityCompat.requestPermissions(
this,
arrayOf(android.Manifest.permission.ACCESS_COARSE_LOCATION,android.Manifest.permission.ACCESS_FINE_LOCATION),
PERMISSION_ID
)
}
fun isLocationEnabled():Boolean{
//this function will return to us the state of the location service
//if the gps or the network provider is enabled then it will return true otherwise it will return false
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:","You have the Permission")
}
}
}
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:","Your City: " + cityName + " ; your Country " + countryName)
return cityName
}
}
don't forget to add a text view inside your layout file and a button to perform the event.
Android Simplest way to get user Location : Longitude, Lattitude and Adress
Reviewed by Medics
on
May 16, 2020
Rating:
Sir I am getting issue please see sir https://github.com/Sukarnascience/Cloud_Info/issues/1
ReplyDeletei'm getting "getpos" as unresolved referrence
ReplyDelete