如果启用 GPS,我会尝试首先检查最后一个位置,如果未启用,我要求用户转到设置以启用它,当我从设置返回到我的应用程序时,在启用 GPS 位置后,我检查是否 GPS可用,我知道它没有启用,延迟(1-2 秒)后我知道它是。
为什么 fusedLocationProviderClient.getLocationAvailability() 方法会有延迟?我该如何解决?这是代码:
@Inject
FusedLocationProviderClient fusedLocationProviderClient;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
checkAndGetLastLocation();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GPS_ENABLE_REQUEST) {
checkAndGetLastLocation();
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
@SuppressWarnings("MissingPermission")
private void checkAndGetLastLocation() {
fusedLocationProviderClient.getLocationAvailability().addOnCompleteListener(getActivity(), availabilityListener -> {
if (availabilityListener.isSuccessful() && availabilityListener.getResult() != null && availabilityListener.getResult().isLocationAvailable()) {
showProgress();
getLastLocation();
} else {
showGPSDisabledDialog();
}
});
}
public void showGPSDisabledDialog() {
hideProgress();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.gps_disabled_title);
builder.setMessage(R.string.gps_disabled_message);
builder.setPositiveButton(R.string.enable_gps, (dialog, which) -> {
dialog.dismiss();
startActivityForResult(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS), GPS_ENABLE_REQUEST);
}).setNegativeButton(R.string.not_enable_gps, (dialog, which) -> {
switchToManualMode();
});
AlertDialog mGPSDialog = builder.create();
mGPSDialog.setCancelable(false);
mGPSDialog.show();
}
@SuppressWarnings("MissingPermission")
private void getLastLocation() {
locationListLayout.setVisibility(View.VISIBLE);
addLocationButton.setVisibility(View.VISIBLE);
addLocationListLayout.setVisibility(View.GONE);
searchLocationsButton.setVisibility(View.GONE);
fusedLocationProviderClient.getLastLocation()
.addOnCompleteListener(getActivity(), locationListener -> {
if (locationListener.isSuccessful() && locationListener.getResult() != null) {
Location lastLocation = locationListener.getResult();
locationStep1Presenter.getSites(lastLocation);
} else {
Log.d(this.getTag(), "checkAndGetLastLocation:exception", locationListener.getException());
hideProgress();
showNoSitesToShowError();
}
});
}