Getting Current Location on Android Using Kotlin
Have you ever wonder how to get a current location on Android programmatically? Hmm, the answer is so easy. You need to know how to use the fused location provider. Basically, it will give you the last known location which can be used as the current location.
What will the app look like?
The app will look like this after you finish this tutorial:

What will you learn?
- Know how to use the FusedLocationProviderClient to access the last location data.
- Opening the Google Maps app using the current location data.
Note: In this post, I used Android Studio 4.0, make sure you use the latest Android Studio, or if you already install it, be sure to check the latest update. The Kotlin version that I used is Kotlin 1.3.72.
Getting Started – Getting Current Location on Android
Open your Android Studio and choose to Start a new Android Studio Project. Then set the Application Name CurrentLocationApp and select Kotlin as the language. Give the Activity Name MainActivity and wait until the Android Studio finishes preparing your project.
First, set up the app/build.gradle file and add this inside the dependencies block code:
implementation 'com.google.android.gms:play-services-location:17.0.0'
After that, sync the project and proceed to the next step.
Preparing the XML Layout
The first is preparing the XML layout for our app here. Open the activity_main.xml inside the res/layout directory and put the code below:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="30dp"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppCompat.Title" android:text="Current Location:" /> <TextView android:id="@+id/tvLatitude" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:layout_marginTop="20dp" android:text="Latitude: -" /> <TextView android:id="@+id/tvLongitude" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:layout_marginTop="10dp" android:text="Longitude: -" /> <TextView android:id="@+id/tvProvider" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:layout_marginTop="10dp" android:text="Provider: -" /> <Button android:id="@+id/btOpenMap" android:layout_width="150dp" android:layout_height="wrap_content" android:background="@color/colorAccent" android:text="Open Map" android:textColor="@android:color/white" android:layout_marginTop="30dp" android:visibility="gone" /> </LinearLayout> <Button android:id="@+id/btGetLocation" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" android:layout_margin="30dp" android:text="Get Current Location" android:textColor="@android:color/white" android:layout_alignParentBottom="true" /> </RelativeLayout>
This layout only contains TextView to show latitude and longitude data and also Buttons to get the current location and open the Google map application. The app will look like this if you run the app:

Write some codes
Open the MainActivity.kt file and write this code:
package com.thesimplycoder.currentlocationapp import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { private val LOCATION_PERMISSION_REQ_CODE = 1000; private lateinit var fusedLocationClient: FusedLocationProviderClient private var latitude: Double = 0.0 private var longitude: Double = 0.0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // initialize fused location client fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) } }
First, we need to initialize the FusedLocationProviderClient in order to access the current location data on Android. Just write the code adobe and it is very easy.
Next, create a new method getCurrentLocation()
that we will implement the getLastLocation()
function.
private fun getCurrentLocation() { // checking location permission if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // request permission ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), LOCATION_PERMISSION_REQ_CODE); return } fusedLocationClient.lastLocation .addOnSuccessListener { location -> // getting the last known or current location latitude = location.latitude longitude = location.longitude tvLatitude.text = "Latitude: ${location.latitude}" tvLongitude.text = "Longitude: ${location.longitude}" tvProvider.text = "Provider: ${location.provider}" btOpenMap.visibility = View.VISIBLE } .addOnFailureListener { Toast.makeText(this, "Failed on getting current location", Toast.LENGTH_SHORT).show() } }
On Kotlin, you access the location data using the lastLocation
provided by FusedLocationProviderClient and it will return the location data such as latitude, longitude, provider, etc. using the fused location provider requires you to grant the location permission. The permission that will be used is ACCESS_FINE_LOCATION.
Open the AndroidManifest.xml file and add the permission:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
After that, back to MainActivity.kt file and add another method onRequestPermissionsResult()
to handle permission callback and the openMap()
method to implement the open on Google Map app.
override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { when (requestCode) { LOCATION_PERMISSION_REQ_CODE -> { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission granted } else { // permission denied Toast.makeText(this, "You need to grant permission to access location", Toast.LENGTH_SHORT).show() } } } } private fun openMap() { val uri = Uri.parse("geo:${latitude},${longitude}") val mapIntent = Intent(Intent.ACTION_VIEW, uri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent) }
Try to run the app and it will look like this:

Don’t forget to allow the permission request to get the current location.
The final code of the MainActivity.kt will be like this:
package com.thesimplycoder.currentlocationapp import android.Manifest import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.view.View import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationServices import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { private val LOCATION_PERMISSION_REQ_CODE = 1000; private lateinit var fusedLocationClient: FusedLocationProviderClient private var latitude: Double = 0.0 private var longitude: Double = 0.0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // initialize fused location client fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) btGetLocation.setOnClickListener { getCurrentLocation() } btOpenMap.setOnClickListener { openMap() } } private fun getCurrentLocation() { // checking location permission if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // request permission ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), LOCATION_PERMISSION_REQ_CODE); return } fusedLocationClient.lastLocation .addOnSuccessListener { location -> // getting the last known or current location latitude = location.latitude longitude = location.longitude tvLatitude.text = "Latitude: ${location.latitude}" tvLongitude.text = "Longitude: ${location.longitude}" tvProvider.text = "Provider: ${location.provider}" btOpenMap.visibility = View.VISIBLE } .addOnFailureListener { Toast.makeText(this, "Failed on getting current location", Toast.LENGTH_SHORT).show() } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { when (requestCode) { LOCATION_PERMISSION_REQ_CODE -> { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission granted } else { // permission denied Toast.makeText(this, "You need to grant permission to access location", Toast.LENGTH_SHORT).show() } } } } private fun openMap() { val uri = Uri.parse("geo:${latitude},${longitude}") val mapIntent = Intent(Intent.ACTION_VIEW, uri) mapIntent.setPackage("com.google.android.apps.maps") startActivity(mapIntent) } }
Where to go next?
You can download this full code from the link below:
Be sure to check my other cool posts here about:
- Android LinearLayout Basic Layouting
- Android Shared Preferences to Save and Read Data
- Android Intro Slider and Splash Screen Tutorial
- How to Get Data from REST API using Retrofit
- Android Copy to Clipboard Using Kotlin
I hope you like my post, comment, and share it with love!
Thanks