Я недавно смотрел, чтобы получить проблемы, так как мой FusedLocationProviderClient
не вызывает метод onLocationResult()
LocationCallback
, когда местоположение устройства уже включено, но не имеет проблем с этим, когда я прошу пользователя включить местоположениеСначала сам (сначала отключен).Ниже я публикую свой код (я не показываю, как я заранее получаю разрешение на определение местоположения), который вызывается с onCreate()
:
public void onReady() {
LocationRequest locReq = LocationRequest.create();
LocationSettingsRequest request = new LocationSettingsRequest.Builder()
.addLocationRequest(locReq)
.build();
LocationServices.getSettingsClient(this)
.checkLocationSettings(request)
.addOnCompleteListener(this::handleSettingsResponse);
}
private void handleSettingsResponse(Task<LocationSettingsResponse> task) {
try {
LocationSettingsResponse response = task.getResult(ApiException.class);
if (response != null) {
LocationSettingsStates states = response.getLocationSettingsStates();
if (states.isLocationPresent() && states.isLocationUsable()) {
findLocation();
} else {
failure()
}
}
} catch (ApiException e) {
copeWithFailure(e);
}
}
private void copeWithFailure(Exception e) {
if (e instanceof ResolvableApiException) {
try {
((ResolvableApiException) e).startResolutionForResult(this, REQUEST_RESOLUTION);//I call findLocation() if successful
} catch (IntentSender.SendIntentException e1) {
failure()
}
}
}
private void findLocation() {
FusedLocationProviderClient client =
LocationServices.getFusedLocationProviderClient(this);
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
for (Location location : locationResult.getLocations()) {
startingLatitude = location.getLatitude();
startingLongitude = location.getLongitude();
}}
LocationRequest locaReq = LocationRequest()
.setNumUpdates(1)
.setExpirationDuration(5500)
.setInterval(5000)
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
client.requestLocationUpdates(locaReq,
mLocationCallback, Looper.getMainLooper())
.addOnFailureListener(this, e -> {
});
}
. Раньше это работало без проблем с предварительно включенным расположением.