title: Android Location return null after Enabling GPS in dialog
body: <p>When I enter a screen, I check for if GPS is turned on, if not, the dialog to enable GPS is shown. When user clicks Yes, onActivityResult -> GPS is turned on and I try to get the location but this always returns null</p>
  
  <p>When I enter the screen with GPS already on, location is retrieved properly. I have been struggling with this for few days now and can't seem to find any resources.</p>
  
  <p>UserLocationUtilities.java</p>
  
  <pre><code>public class UserLocationUtilities implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener{
  
      GoogleApiClient googleApiClient;
      Activity activity;
      protected static final int REQUEST_CHECK_SETTINGS = 0x1;
  
      boolean isGPSEnabled = false;
      // flag for network status
      boolean isNetworkEnabled = false;
      // flag for GPS status
      boolean canGetLocation = false;
  
      protected LocationManager locationManager;
      protected LocationListener locationListener;
      protected Location location;
      protected double latitude,longitude;
      protected boolean gps_enabled,network_enabled;
  
      // The minimum distance to change Updates in meters
      private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
      // The minimum time between updates in milliseconds
      private static final long MIN_TIME_BW_UPDATES = 1 * 1000 * 60; // 1 minute
  
      public UserLocationUtilities(Activity activity){
          this.activity = activity;
      }
  
      public void settingsRequest()
      {
          if(googleApiClient == null){
              googleApiClient = new GoogleApiClient.Builder(activity)
                      .addApi(LocationServices.API)
                      .addConnectionCallbacks(this)
                      .addOnConnectionFailedListener(this).build();
              googleApiClient.connect();
          }
  
          LocationRequest locationRequest = LocationRequest.create();
          locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
          locationRequest.setInterval(30 * 1000);
          locationRequest.setFastestInterval(5 * 1000);
          LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                  .addLocationRequest(locationRequest);
          builder.setAlwaysShow(true); //this is the key ingredient
  
          PendingResult&lt;LocationSettingsResult&gt; result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
          result.setResultCallback(new ResultCallback&lt;LocationSettingsResult&gt;() {
              @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(activity, 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;
                  }
              }
          });
      }
  
      public Location getLocation() {
          if (ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
              try {
                  locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
  
                  isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                  isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
  
                  if (!isGPSEnabled &amp;&amp; !isNetworkEnabled) {
                      // no network provider is enabled
                  } else {
                      this.canGetLocation = true;
                      if (isNetworkEnabled) {
                          locationManager.requestLocationUpdates(
                                  LocationManager.NETWORK_PROVIDER,
                                  MIN_TIME_BW_UPDATES,
                                  MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                          Log.d("Network", "Network");
                          if (locationManager != null) {
                              location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                              if (location != null) {
                                  latitude = location.getLatitude();
                                  longitude = location.getLongitude();
                              }
                          }
                      }
                      // if GPS Enabled get lat/long using GPS Services
                      if (isGPSEnabled) {
                          if (location == null) {
                              locationManager.requestLocationUpdates(
                                      LocationManager.GPS_PROVIDER,
                                      MIN_TIME_BW_UPDATES,
                                      MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                              Log.d("GPS Enabled", "GPS Enabled");
                              if (locationManager != null) {
                                  location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                                  if (location != null) {
                                      latitude = location.getLatitude();
                                      longitude = location.getLongitude();
                                  }
                              }
                          }
                      }
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
  
          return location;
      }
  
      public boolean isLocationEnabled() {
          int locationMode = 0;
          String locationProviders;
  
          if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.KITKAT){
              try {
                  locationMode = Settings.Secure.getInt(activity.getApplicationContext().getContentResolver(), Settings.Secure.LOCATION_MODE);
  
              } catch (Settings.SettingNotFoundException e) {
                  e.printStackTrace();
              }
  
              return locationMode != Settings.Secure.LOCATION_MODE_OFF;
  
          }else{
              locationProviders = Settings.Secure.getString(activity.getApplicationContext().getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
              return !TextUtils.isEmpty(locationProviders);
          }
  
  
      }
  
      @Override
      public void onConnected(Bundle bundle) {
  
  
      }
  
      @Override
      public void onConnectionSuspended(int i) {
  
      }
  
      @Override
      public void onConnectionFailed(ConnectionResult connectionResult) {
  
      }
  
      @Override
      public void onLocationChanged(Location location) {
  
      }
  
      @Override
      public void onStatusChanged(String provider, int status, Bundle extras) {
  
      }
  
      @Override
      public void onProviderEnabled(String provider) {
  
      }
  
      @Override
      public void onProviderDisabled(String provider) {
  
      }
  }
  </code></pre>
  
  <p>After user selects Yes in Settings Dialog, onActivityResult, I do location = userlocationutilities.getLocation(); and always returns null. If switch screens and come back, location is retrieved.</p>
  
  <pre><code>@Override
      public void onActivityResult(int requestCode, int resultCode, Intent data) {
          switch (requestCode) {
  // Check for the integer request code originally supplied to startResolutionForResult().
              case REQUEST_CHECK_SETTINGS:
                  switch (resultCode) {
                      case Activity.RESULT_OK: //location settings dialog, user selected YES to enabling location
  
                          location = userLocationUtilities.getLocation();
                          if(location != null){
                              //location of user FOUND
                              Toast.makeText(getActivity(), "Lat: "+location.getLatitude()+" Long: "+location.getLongitude(), Toast.LENGTH_LONG).show();
                              getRingsNearMeCall();
  
                          }else{
                              //location of user NOT FOUND
                              Toast.makeText(getActivity(), "null location", Toast.LENGTH_LONG).show();
  
                          }
  
                          break;
                      case Activity.RESULT_CANCELED: //location settings dialog, user selected NO to enabling location
                          userLocationUtilities.settingsRequest(); //ask user again with Location Settings Dialog
                          break;
                  }
                  break;
          }
      }
  </code></pre>
  
  <p>Editted: I make the requestPermission in the fragment, the permission is granted</p>
  
  <pre><code>if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
              ActivityCompat.requestPermissions(getActivity(), new String[] { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION },
                      PERMISSION_ACCESS_FINE_LOCATION);
          }else{
              checkLocationSettingsGetRings();
          }
  </code></pre>