title: How to request permission to make GPS ON in android
body: <p>I get user's location by FusedLocationProviderClient.getLastLocation() but only when user has already turn on location.
  like:
  <a href="https://i.stack.imgur.com/paQKO.png" rel="nofollow noreferrer">https://i.stack.imgur.com/paQKO.png</a></p>
  
  <p>If location is off,I get null.</p>
  
  <p>In app settings it shows that location permission is granted!!</p>
  
  <p>Help to get <strong>not null</strong> current location.</p>
  
  <pre><code>
  public class SelectGroup extends AppCompatActivity
          implements
          GoogleApiClient.ConnectionCallbacks,
          GoogleApiClient.OnConnectionFailedListener{
  
      private static final String FINE_LOCATION = android.Manifest.permission.ACCESS_FINE_LOCATION;
      private static final String COARSE_LOCATION = android.Manifest.permission.ACCESS_COARSE_LOCATION;
      private static final int LOCATION_PERMISSION_REQUEST_CODE = 1234;
      protected static final int REQUEST_CHECK_SETTINGS = 0x1;
      private GoogleApiClient mGoogleApiClient;
  
      private Boolean mLocationPermissionGranted = false;
      private FusedLocationProviderClient mFusedLocationProviderClient;
  
      private static final String TAG = "SelectGroup";
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          Log.d(TAG, "onCreate: starts");
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_select_group);
  
          mGoogleApiClient = new GoogleApiClient.Builder(this)
                  .addConnectionCallbacks(this)
                  .addOnConnectionFailedListener(this)
                  .addApi(LocationServices.API)
                  .build();
  
          getLocationPermission();
      }
  
      //calling getDeviceLocation()
      private void init(){
          Log.d(TAG, "init: starts");
          if (mLocationPermissionGranted) {
              Log.d(TAG, "init: calling getDeviceLocation");
  
              if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                      != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission
                      (this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                  Log.d(TAG, "init: returning");
                  return;
              }
              getDeviceLocation();
          }
      }
  
      private void getDeviceLocation() {
          Log.d(TAG, "getDeviceLocation: getting devices current location");
  
          mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
          try {
              if (mLocationPermissionGranted) {
  
                  Task location = mFusedLocationProviderClient.getLastLocation();
                  location.addOnCompleteListener(new OnCompleteListener() {
                      @Override
                      public void onComplete(@NonNull Task task) {
                          if (task.isSuccessful()) {
                              Log.d(TAG, "onComplete: found location");
                              Location currentLocation = (Location) task.getResult();
                              //LatLng latLng = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());
                              Log.d(TAG, "onComplete: currentlocation is " + currentLocation);
  
                              if(currentLocation !=null) {
                                  double lat = currentLocation.getLatitude();
                                  double lon = currentLocation.getLongitude();
  
                                  SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
                                  SharedPreferences.Editor editor = pref.edit();
                                  editor.putString("lat", lat + "");
                                  editor.putString("lon", lon + "");
                                  editor.apply();
                                  Log.d(TAG, "onComplete: lat,lon : " + lat + "," + lon);
                              }
                              else {
                                  Log.d(TAG, "onComplete: inside else where currentlocation is null");
                                  settingsrequest();
                                  Log.d(TAG, "onComplete: after settingsrequest");
                                  double lat = currentLocation.getLatitude();
                                  double lon = currentLocation.getLongitude();
  
                                  SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
                                  SharedPreferences.Editor editor = pref.edit();
                                  editor.putString("lat", lat + "");
                                  editor.putString("lon", lon + "");
                                  editor.apply();
                              }
                          }
                      }
                  });
              }
  
          } catch (SecurityException e) {
              Log.e(TAG, "getDeviceLocation: SecurityException " + e.getMessage());
          }
      }
  
      //calling init() after complete
      private void getLocationPermission(){
          String permissions[] = {android.Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};
  
          Log.d(TAG, "getLocationPermission: before if condition");
          if(ContextCompat.checkSelfPermission(this.getApplicationContext(),
                  FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
              if(ContextCompat.checkSelfPermission(this.getApplicationContext(),
                      COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED){
                  mLocationPermissionGranted = true;
                  Log.d(TAG, "getLocationPermission: calling init");
                  init();
              }else {
                  ActivityCompat.requestPermissions(this,
                          permissions,
                          LOCATION_PERMISSION_REQUEST_CODE);
              }
          }else {
              ActivityCompat.requestPermissions(this,
                      permissions,
                      LOCATION_PERMISSION_REQUEST_CODE);
          }
      }
  
      //calling init() after complete
      @Override
      public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
          mLocationPermissionGranted = false;
  
          switch (requestCode){
              case LOCATION_PERMISSION_REQUEST_CODE:{
                  if(grantResults.length > 0){
                      for(int i=0; i&lt;grantResults.length;i++){
                          if(grantResults[i] != PackageManager.PERMISSION_GRANTED){
                              mLocationPermissionGranted = false;
                              return;
                          }
                      }
                      mLocationPermissionGranted = true;
                      Toast.makeText(this, "Permission Granted : OnRequest", Toast.LENGTH_SHORT).show();
                      Log.d(TAG, "onRequestPermissionsResult: calling init");
                      init();
                  }
              }
          }
      }
  
      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          switch (requestCode) {
  // Check for the integer request code originally supplied to startResolutionForResult().
              case REQUEST_CHECK_SETTINGS:
                  switch (resultCode) {
                      case Activity.RESULT_OK:
                          //startLocationUpdates();
                          Log.d(TAG, "onActivityResult: Result Ok");
                          Toast.makeText(this, "Request : Result Ok", Toast.LENGTH_SHORT).show();
                          break;
                      case Activity.RESULT_CANCELED:
                          //settingsrequest();//keep asking if imp or do whatever
                          Log.d(TAG, "onActivityResult: Result cancelled");
                          Toast.makeText(this, "Request : Result cancelled", Toast.LENGTH_SHORT).show();
                          break;
                  }
                  break;
          }
      }
  
      @Override
      protected void onStart() {
          super.onStart();
          settingsrequest();
      }
  
      public void settingsrequest()
      {
          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(mGoogleApiClient, 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(SelectGroup.this, REQUEST_CHECK_SETTINGS);
                          } catch (IntentSender.SendIntentException e) {
                              // Ignore the error.
                              Toast.makeText(SelectGroup.this, "Error Occured", Toast.LENGTH_SHORT).show();
                          }
                          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 onConnected(@Nullable Bundle bundle) {
          Log.d(TAG, "onConnected: called");
      }
  
      @Override
      public void onConnectionSuspended(int i) {
          Log.d(TAG, "onConnectionSuspended: called");
      }
  
      @Override
      public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
          Log.d(TAG, "onConnectionFailed: called");
      }
  }
  
  </code></pre>
  
  <p>I tried <a href="https://stackoverflow.com/a/38264716/8018480">https://stackoverflow.com/a/38264716/8018480</a> but don't understand how to make it possible!</p>