GPS 供应商有时需要电池电量,还需要检索 GPS 信号、预热硬件然后获取位置,如果是第一次使用它可能需要一些时间。
我建议使用新的 LocationRequest ,如果需要,它将在 GPS 或 NETWORK 之间进行选择以获取位置。
在 onCreate 中,我设置了我的 locationRequest
private fun setupLocationRequest(){
locationCallback = LocationCallback()
locationRequest = LocationRequest.create()
locationRequest.interval = 10000
locationRequest.fastestInterval = 2000
locationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}
正如您在此处看到的,PRIORITY_BALANCED_POWER_ACCURACY
将为我提供一个最大纬度和经度的距离块,并且不仅会使用 GPS,而且会在需要时使用 NETWORK。
然后,我先请求lastKnowLocation
,如果没有检索到这个位置,你可以请求位置更新
fusedLocationClient.lastLocation.addOnSuccessListener { lastLocation ->
if(lastLocation != null){
calculateDistanceAndNavigate(lat,lng,lastLocation.latitude,lastLocation.longitude,radio)
}else{
startLocationUpdates()
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
locationResult ?: return
for (location in locationResult.locations) {
calculateDistanceAndNavigate(lat,lng,location.latitude,location.longitude,radio)
}
}
}
}
}
private fun startLocationUpdates() {
fusedLocationClient.requestLocationUpdates(
locationRequest,
locationCallback,
Looper.getMainLooper()
)
}
对我来说,这是获取位置的最有效方法,首先我不只使用 GPS,而是节省电池并在需要时使用 NETWORK 或 WIFI,然后我请求 lastKnownLocation 如果它被保存(可能通过另一个应用程序,例如:谷歌地图),然后如果失败,我就开始请求位置更新(这可能需要一点时间)