First I have added fusedLocationClient as private member variable:
private lateinit var fusedLocationClient: FusedLocationProviderClientWhere FusedLocationProviderClient is imported from:
implementation 'com.google.android.gms:play-services-location:19.0.1'In onCreate I have initialized fusedLocationClient:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}
I need line like
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())For that I need locationRequest and locationCallback
Both locationRequest and locationCallback I have declared as member variables:
private lateinit var locationCallback: LocationCallback private lateinit var locationRequest: LocationRequestlocationRequest:
locationRequest = LocationRequest.create().apply {
interval = 5000
fastestInterval = 50000
smallestDisplacement = 170f // 170 m = 0.1 mile
priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}
locationCallback:
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
locationResult ?: return
if (locationResult.locations.isNotEmpty()) {
// get latest location
val location =
locationResult.lastLocation
if (location != null) {
println(location.latitude.toString())
println(location.longitude.toString())
}
}
}
}
In app\src\main\AndroidManifest.xml I have added permissions:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />And check for permission:
if (ActivityCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_COARSE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
if (ActivityCompat.shouldShowRequestPermissionRationale(
this as Activity,
Manifest.permission.ACCESS_FINE_LOCATION
)
) {
return
} else {
ActivityCompat.requestPermissions(
this,
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
)
, 99
)
}
}
At the end my MainActivity.kt looks like:
package com.milosev.requestlocationupdates
import android.Manifest
import android.app.Activity
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Looper
import android.view.View
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.*
class MainActivity : AppCompatActivity() {
private lateinit var fusedLocationClient: FusedLocationProviderClient
private lateinit var locationCallback: LocationCallback
private lateinit var locationRequest: LocationRequest
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}
fun requestLocationUpdatesClick(view: View) {
if (ActivityCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_COARSE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
if (ActivityCompat.shouldShowRequestPermissionRationale(
this as Activity,
Manifest.permission.ACCESS_FINE_LOCATION
)
) {
return
} else {
ActivityCompat.requestPermissions(
this,
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
)
, 99
)
}
}
locationRequest = LocationRequest.create().apply {
interval = 5000
fastestInterval = 50000
smallestDisplacement = 170f // 170 m = 0.1 mile
priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
locationResult ?: return
if (locationResult.locations.isNotEmpty()) {
// get latest location
val location =
locationResult.lastLocation
if (location != null) {
println(location.latitude.toString())
println(location.longitude.toString())
}
}
}
}
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback,
Looper.getMainLooper())
}
}