2

如果启用 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();
                }
            });
}
4

0 回答 0