2016-11-07 1 views
0

У меня есть ситуация, когда я показываю диалог «Включение местоположения», если пользователь отказывается от него один раз, я не могу снова показать диалог, хотя я неоднократно вызывающий метод startResolutionForResult()Android, как показать диалог включения местоположения еще раз, если пользователь отказал его один раз

PS: Я не показываю возможность выбора never в диалоговом окне, поэтому он должен показывать диалог каждый раз.

Любая помощь будет оценена по достоинству.

+0

мой код работает нормально до сих пор .. он показывает диалоговое окно enable location, но как только пользователь отрицает это и снова, если я пытаюсь показать местоположение с использованием того же кода. Диалог не появляется. Его же универсальный код. Я не думаю, что здесь нужен тот же код. – DisplayName

ответ

0

Я использую следующую процедуру для запроса диалога настроек местоположения, и он работает как ожидалось, что означает, что пользователь отрицает это (нажав Not Now), он снова появляется по запросу.

protected void createLocationRequest() { 
    mLocationRequest = new LocationRequest(); 

    mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); 

    mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); 

    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 


    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); 
    builder.addLocationRequest(mLocationRequest); 
    mLocationSettingsRequest = builder.build(); 

    PendingResult<LocationSettingsResult> result = 
      LocationServices.SettingsApi.checkLocationSettings(
        mGoogleApiClient, 
        mLocationSettingsRequest); 
    result.setResultCallback(this); 
} 
@Override 
public void onResult(@NonNull LocationSettingsResult locationSettingsResult) { 
    final Status status = locationSettingsResult.getStatus(); 
    switch (status.getStatusCode()) { 
     case LocationSettingsStatusCodes.SUCCESS: 
      Log.i(TAG, "All location settings are satisfied."); 
      startLocationUpdates(); 
      break; 
     case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
      Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to" + 
        "upgrade location settings "); 
      try { 
       status.startResolutionForResult(HostActivity.this, REQUEST_CHECK_SETTINGS); 
      } catch (IntentSender.SendIntentException e) { 
       Log.i(TAG, "PendingIntent unable to execute request."); 
      } 
      break; 
     case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
      Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog " + 
        "not created."); 
      break; 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
     case REQUEST_CHECK_SETTINGS: 
      switch (resultCode) { 
       case Activity.RESULT_OK: 
        Log.i(TAG, "User agreed to make required location settings changes."); 
        Util.toast(HostActivity.this, R.string.requesting_location_data); 
        startLocationUpdates(); 
        break; 
       case Activity.RESULT_CANCELED: 
        Log.i(TAG, "User chose not to make required location settings changes."); 
        break; 
      } 
      break; 
     default: 
      super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

Используя этот код, я считаю, что вы можете достичь того же.

Имейте в виду, что ваш Activity или Fragment должен реализовать ResultCallback<LocationSettingsResult>.

+0

работает ли он на Android Marshmallow? – DisplayName

+0

@DisplayName Да, я тестировал его, и он работает. –

Смежные вопросы