How to get location using "fusedLocationClient.getCurrentLocation" method in Kotlin?

13.5k Views Asked by At

To request the last known location of the user's device, we can use the fused location provider to retrieve the device's last known location using getLastLocation(), but using getCurrentLocation() gets a refresher, and more accurate location.

so, how to use the fusedLocationClient.getCurrentLocation() in Kotlin as there is no example illustrated in the documentation?

3

There are 3 best solutions below

5
On BEST ANSWER

According to the documentation, the getCurrentLocation() takes two parameters.

The 1st parameter it takes is the priority (e.g. PRIORITY_HIGH_ACCURACY) to request the most accurate locations available, or any other priority that can be found here.

The 2nd parameter it takes is a cancellation token that can be used to cancel the current location request.

From the Google play services reference, a CancellationToken can only be created by creating a new instance of CancellationTokenSource.

so here is the code you need to use when using getCurrentLocation()

class YourActivity : AppCompatActivity() {

    private lateinit var fusedLocationClient: FusedLocationProviderClient

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

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

        fusedLocationClient.getCurrentLocation(LocationRequest.PRIORITY_HIGH_ACCURACY, object : CancellationToken() {
                override fun onCanceledRequested(p0: OnTokenCanceledListener) = CancellationTokenSource().token

                override fun isCancellationRequested() = false
            })
            .addOnSuccessListener { location: Location? ->
                if (location == null)
                    Toast.makeText(this, "Cannot get location.", Toast.LENGTH_SHORT).show()
                else {
                    val lat = location.latitude
                    val lon = location.longitude
                }

            }

    }
}
0
On
fusedLocationClient.getCurrentLocation(Priority.PRIORITY_HIGH_ACCURACY, object : CancellationToken() {
    override fun onCanceledRequested(listener: OnTokenCanceledListener) = CancellationTokenSource().token

    override fun isCancellationRequested() = false
})
.addOnSuccessListener {
    if (it == null)
        Toast.makeText(this, "Cannot get location.", Toast.LENGTH_SHORT).show()
    else {
        val lat = it.latitude
        val lon = it.longitude
    }

}
2
On

I know the question is about Kotlin but I want to add for those searching for Java, based on this example in the documentation:

CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
fusedLocationClient.getCurrentLocation(Priority.PRIORITY_HIGH_ACCURACY, cancellationTokenSource.getToken())
.addOnSuccessListener(MyActivity.this, new OnSuccessListener<Location>() {
    @Override
    public void onSuccess(Location location) {
        // Got last known location. In some rare situations this can be null.
        if (location != null) {
            //do your thing
        }
        Log.w(TAG, "No current location could be found");
    }
});