LocationSettingRequest не может изменить GPS на PRIORITY_HIGH_ACCURACY - PullRequest
0 голосов
/ 23 апреля 2020

Мое приложение отлично работает при включении местоположения и установке параметра Приоритет на ВЫСОКИЙ, когда настройка местоположения выключена, но оно вылетает, когда местоположение установлено как GPS LocationRequest.PRIORITY_LOW_POWER вместо отображения диалогового окна для изменения на LocationRequest.PRIORITY_HIGH_ACCURACY

Вот метод, который обращается к SettingClient

 public void locationSettingRequest() {
        LocationRequest mLocationRequestHighAccuracy = new LocationRequest().setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        LocationRequest mLocationRequestBalancedPowerAccuracy = new LocationRequest().setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(mLocationRequestHighAccuracy)
                .addLocationRequest(mLocationRequestBalancedPowerAccuracy);

        Task<LocationSettingsResponse> result =
                LocationServices.getSettingsClient(this).checkLocationSettings(builder.build());

        result.addOnCompleteListener(task -> {
            try {
                LocationSettingsResponse response = task.getResult(ApiException.class);
                // All location settings are satisfied. The client can initialize location
                // requests here.
                getLoc();

            } catch (ApiException exception) {
                switch (exception.getStatusCode()) {
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        // Location settings are not satisfied. But could be fixed by showing the
                        // user a dialog.
                        try {
                            // Cast to a resolvable exception.
                            ResolvableApiException resolvable = (ResolvableApiException) exception;
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            resolvable.startResolutionForResult(
                                    SignUpActivity.this,
                                    REQUEST_CHECK_SETTINGS);
                        } catch (IntentSender.SendIntentException e) {
                            // Ignore the error.
                        } catch (ClassCastException e) {
                            // Ignore, should be an impossible error.
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        // Location settings are not satisfied. However, we have no way to fix the
                        // settings so we won't show the dialog.
                        break;
                }
            }
        });
    }

, и я получил ответ в OnActivityResult

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

//        final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
        if (requestCode == REQUEST_CHECK_SETTINGS) {
            switch (resultCode) {
                case Activity.RESULT_OK:
                    // All required changes were successfully made
                    getLoc();
                    break;
                case Activity.RESULT_CANCELED:
                    finish();
                    break;
                default:
                    break;
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

Как мне изменить местоположение с LocationRequest.PRIORITY_LOW_POWER на HIGH_ACCURACY * * 1013

1 Ответ

0 голосов
/ 24 апреля 2020

Вот как я это решил, я проверил, включен ли LocationManager.NETWORK_PROVIDER. Если это не так, я отображаю сообщение с предложением изменить режим местоположения на HIGH_ACCURACY. Затем я звоню settingRequest, если NETWORK_PROVIDER включено. Не уверен, что это правильный путь, но это сработало.

public void checkLocationMode() {
        LocationManager loc = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        if (!loc.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            Toast.makeText(this, "Turn location mode to High Accuracy.", Toast.LENGTH_LONG).show();
            Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(myIntent);
        } else {
            settingRequest();
        }
    }
...