GPSプロバイダーは、バッテリーのエネルギーを大量に消費することがあり、GPS信号を取得し、ハードウェアをウォームアップしてから位置を取得する必要があります。初めて使用する場合は、時間がかかることがあります。
私がお勧めするのは、必要に応じて位置情報を取得するためにGPSまたはネットワークのいずれかを選択する新しいLocationRequestを使用することです。
onCreateの最初のロケーションリクエストを設定します
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だけでなく、必要に応じてネットワークも使用されます。
次に、最初にリクエストし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を要求します(別のアプリなどによって)。グーグルマップ)そしてそれが失敗した場合、私はちょうど場所の更新を要求し始めます(それは少しかかるかもしれません)