Начальное разрешение для результата во фрагменте

В моем приложении, если у пользователя не включено местоположение, я запрашиваю диалоговое окно, а затем пытаюсь вернуть этот результат (возможно, неправильно), переопределяя результат действия.

Это внутри фрагмента, поэтому не уверен, как это меняет ситуацию:

Вот как я называю это диалогом с startResolutionForResult:

public void checkDeviceLocationIsOn()
        {
            System.out.println("Test running setting request" );
            LocationRequest locationRequest = LocationRequest.create();
            locationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER);
            LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                    .addLocationRequest(locationRequest);
            builder.setAlwaysShow(true); //this is the key ingredient

            PendingResult<LocationSettingsResult> result =
                    LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
            result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
                @Override
                public void onResult(LocationSettingsResult result) {
                    final Status status = result.getStatus();
                    final LocationSettingsStates state = result.getLocationSettingsStates();
                    switch (status.getStatusCode()) {
                        case LocationSettingsStatusCodes.SUCCESS:
                            // All location settings are satisfied.
                            System.out.println("Test setting all fine starting location request" );
                            getLocation();
                            break;
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            // Location settings are not satisfied. But could be fixed by showing the user
                            // a dialog.
                            try {
                                // Show the dialog by calling startResolutionForResult(),
                                // and check the result in onActivityResult().
                                status.startResolutionForResult(getActivity(), LOCATION_SETTINGS_REQUEST_CODE);
                                System.out.println("Test setting not met starting dialog to prompt user" );
                            } catch (IntentSender.SendIntentException e) {
                                // Ignore the 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;
                    }
                }
            });
        }

И затем я пытаюсь получить результат, подобный этому ниже (это никогда не вызывается):

   @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
        // Check for the integer request code originally supplied to startResolutionForResult().
            case LOCATION_SETTINGS_REQUEST_CODE:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        System.out.println("test user has turned the gps back on");
                        getLocation();
                        break;
                    case Activity.RESULT_CANCELED:

                        System.out.println("test user has denied the gps to be turned on");
                        Toast.makeText(getActivity(), "Location is required to order stations", Toast.LENGTH_SHORT).show();
                        break;
                }
                break;
        }
    }

Заранее спасибо за вашу помощь


person Nicholas Muir    schedule 18.10.2016    source источник
comment
Почему вы используете System.out.println() вместо класса Android Log? developer.android.com/reference/android/util/Log.html   -  person AdamMc331    schedule 18.10.2016
comment
Потому что это для моих собственных целей тестирования   -  person Nicholas Muir    schedule 19.10.2016
comment
у вас есть какое-то решение, я столкнулся с той же проблемой :(   -  person r4jiv007    schedule 17.12.2016
comment
столкнулся с той же проблемой. Я пытался позвонить в Activity. Но все вещи, находящиеся на фрагментах, обнуляются.   -  person arshad shaikh    schedule 10.02.2017
comment
Здесь уже был дан ответ: stackoverflow.com/a/39579124/4514796   -  person Ali Nem    schedule 03.01.2018
comment
@AliNematiHayati не уверен, что вы думаете, но этот вопрос был задан более года назад.   -  person Nicholas Muir    schedule 03.01.2018
comment
Мой resultCode всегда Activity.RESULT_CANCELED (значение 0) в моем обратном вызове onActivityResult. Даже если я нажму кнопку ОК в диалоговом окне :\   -  person Gabriel    schedule 15.10.2019
comment
@NicholasMuir Как вы думаете, помог ли ответ, который я написал. Отметка правильного ответа помогает и другим.   -  person Badhrinath Canessane    schedule 10.03.2020


Ответы (4)


Вызвать метод фрагмент

startIntentSenderForResult(status.getResolution().getIntentSender(), REQUEST_CODE_LOCATION_SETTING, null, 0, 0, 0, null);

вместо

status.startResolutionForResult(...)

person Badhrinath Canessane    schedule 15.05.2018

Чтобы начать разрешение результата в вашем фрагменте, вы должны использовать новый API

сначала создайте ActivityResultLanucher

private val resolutionForResult =
    registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { activityResult ->
        if (activityResult.resultCode == RESULT_OK)
            //startLocationUpdates() or do whatever you want
        else {
            showMessage("we can't determine your location")
        }
    }

затем используйте это так

val intentSenderRequest = IntentSenderRequest.Builder(exception.resolution).build()
resolutionForResult.launch(intentSenderRequest)
person Amr    schedule 02.05.2021

Возможно, простым решением является использование двух действий и отображение одного из них в виде диалога с использованием любой темы диалога в манифесте.

<activity
        android:name=".LocationDialogActivity"
        android:theme="@style/DialogStyle"></activity>

они просто используют onActivityResult, как вы использовали его всегда.

ДиалогАктивность

 private void setLocation() {
    Intent intentResult = new Intent();
    intentResult.putExtra("latitude", "valueLat");
    intentResult.putExtra("longitude", "valueLon");
    setResult(RESULT_OK, intentResult);
    finish();
}

Основная деятельность

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK) {
            /*Take your data*/
            latitude = data.getExtras().getString("latitude");
            longitude = data.getExtras().getString("longitude");
        }
}
person Firestone Seven    schedule 18.10.2016

в Super Activity Выполните этот метод...

в MainActivity

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    final int REQUEST_CHECK_SETTINGS = 100;//check GPS setting
    Log.d("onActivityResult()", Integer.toString(resultCode));

    //final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
    switch (requestCode)
    {
        case REQUEST_CHECK_SETTINGS:
            switch (resultCode)
            {
                case Activity.RESULT_OK:
                {
                    // All required changes were successfully made
                    Toast.makeText(this, "Location enabled by user!", Toast.LENGTH_LONG).show();
                    ContactFragment.isGPSEnabled=true;
                    ContactFragment.click();
                    break;
                }
                case Activity.RESULT_CANCELED:
                {
                    // The user was asked to change settings, but chose not to
                    Toast.makeText(this, "Location not enabled, user cancelled.", Toast.LENGTH_LONG).show();
                    ContactFragment.isGPSEnabled=false;
                    break;
                }
                default:
                {
                    break;
                }
            }
            break;
    }

}

внутри ContactFragment

@Override
public void onConnected(@Nullable Bundle bundle) {

    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(30 * 1000);
    mLocationRequest.setFastestInterval(5 * 1000);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest);
    builder.setAlwaysShow(true);

    result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
    result.setResultCallback(this);
}
  @Override
public void onResult(LocationSettingsResult result) {
    final Status status = result.getStatus();
    //final LocationSettingsStates state = result.getLocationSettingsStates();
    switch (status.getStatusCode()) {
        case LocationSettingsStatusCodes.SUCCESS:
            // All location settings are satisfied. The client can initialize location
            // requests here.
            //...
            break;
        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
            // Location settings are not satisfied. But could be fixed by showing the user
            // a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                status.startResolutionForResult(
                        getActivity(),
                        REQUEST_CHECK_SETTINGS);
            } catch (IntentSender.SendIntentException e) {
                // Ignore the 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;
    }
}
person aj dodiya    schedule 19.04.2017