Enable Location Dialog
Today we are going to learn about how to show location request settings dialog in our own android applications like Google map, Ola, Uber ect.
First of all, What is location setting dialog ?
The location settings dialog which lets you turn your locations settings ON or OFF directly from here without leaving from your own app to the devices settings. Before that we all navigated the user to the devices location settings to enable GPS. But by using this dialog we can let user turn it on or off within our app. it’s pretty cool, isn’t it? Let’s see how to do this quickly.
Ex : Turn off your device’s GPS and open google map you will see a dialog like this in the very beginning
To achieve this dialog implementation we have to know below things:
Google API Client : GoogleApiClient is used with a variety of static methods. Some of these methods require that GoogleApiClient be connected, some will queue up calls before GoogleApiClient is connected; check the specific API documentation to determine whether you need to be connected.
Location Request : LocationRequest objects are used to request a quality of service for location updates from the FusedLocationProviderApi. Prerequisite: Marshmallow Permissions. Broadcast Receiver.
Alright Let get started!
STEP 1:
Go to the activity where you want to show this dialog and do this
protected GoogleApiClient mGoogleApiClient; protected LocationRequest locationRequest; int REQUEST_CHECK_SETTINGS = 100;
now in the onCreate method initialize the GoogleApiClient and LocationRequest like this:
mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(LocationServices.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this).build(); mGoogleApiClient.connect(); locationRequest = LocationRequest.create(); locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); locationRequest.setInterval(30 * 1000); locationRequest.setFastestInterval(5 * 1000);
STEP 2:
After doing the above part you have to implement the connectionCallBack and OnConnectionFailedListener with your activity class and you will have to implement the unimplemented methods as always. After implementing the both listener and call back you will get these methods
@Override public void onConnected(@Nullable Bundle bundle) { } @Override public void onConnectionSuspended(int i) { } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { }
STEP 3:
now go to the onConnected method and initialize the pending result and locationRequest like this:
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() .addLocationRequest(locationRequest); builder.setAlwaysShow(true); PendingResult result = LocationServices.SettingsApi.checkLocationSettings( mGoogleApiClient, builder.build() ); result.setResultCallback(this);
STEP 4:
Now again you will have to implement resultCallback and add the unimplemented methods to the main activity. So you will get a new overridden method called OnResult, write the following conditions in that OnResult method:
@Override public void onResult(@NonNull LocationSettingsResult locationSettingsResult) { final Status status = locationSettingsResult.getStatus(); switch (status.getStatusCode()) { case LocationSettingsStatusCodes.SUCCESS: // NO need to show the dialog; break; case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: // GPS turned off, Show the user a dialog break; case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: // Location settings are unavailable so not possible to show any dialog now break; } }
STEP 5:
Now in the case of RESOLUTION_REQUIRED show the dialog to turn on GPS:
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: // GPS disabled show the user a dialog to turn it on try { // Show the dialog by calling startResolutionForResult(), and check the result // in onActivityResult(). status.startResolutionForResult(LocSettingsActivity.this, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException e) { //failed to show dialog } break;
STEP 6:
In the onActivityResult method you should have to catch the result and do the rest of the work. I have just showed a Toast to know whether the user turned it on or not by doing the following:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CHECK_SETTINGS) { if (resultCode == RESULT_OK) { Toast.makeText(getApplicationContext(), "GPS enabled", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), "GPS is not enabled", Toast.LENGTH_LONG).show(); } } }
STEP 7:
In the on destroy method of the activity you should disconnect the GoogleApiClient
@Override protected void onDestroy() { super.onDestroy(); if (mGoogleApiClient.isConnected()) { mGoogleApiClient.disconnect(); } }
FINAL CODE:
After doing all the works and before running the application your full class code should look like the following:
package YOUR PACKAGE NAME HERE; import android.content.Intent; import android.content.IntentSender; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.PendingResult; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Status; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationServices; import com.google.android.gms.location.LocationSettingsRequest; import com.google.android.gms.location.LocationSettingsResult; import com.google.android.gms.location.LocationSettingsStatusCodes; public class LocSettingsActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback { protected GoogleApiClient mGoogleApiClient; protected LocationRequest locationRequest; int REQUEST_CHECK_SETTINGS = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_loc_settings); mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(LocationServices.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this).build(); mGoogleApiClient.connect(); locationRequest = LocationRequest.create(); locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); locationRequest.setInterval(30 * 1000); locationRequest.setFastestInterval(5 * 1000); } @Override public void onConnected(@Nullable Bundle bundle) { LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() .addLocationRequest(locationRequest); builder.setAlwaysShow(true); PendingResult result = LocationServices.SettingsApi.checkLocationSettings( mGoogleApiClient, builder.build() ); result.setResultCallback(this); } @Override public void onConnectionSuspended(int i) { } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { } @Override public void onResult(@NonNull LocationSettingsResult locationSettingsResult) { final Status status = locationSettingsResult.getStatus(); switch (status.getStatusCode()) { case LocationSettingsStatusCodes.SUCCESS: // NO need to show the dialog; break; case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: // Location settings are not satisfied. Show the user a dialog try { // Show the dialog by calling startResolutionForResult(), and check the result // in onActivityResult(). status.startResolutionForResult(LocSettingsActivity.this, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException e) { //failed to show } break; case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: // Location settings are unavailable so not possible to show any dialog now break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CHECK_SETTINGS) { if (resultCode == RESULT_OK) { Toast.makeText(getApplicationContext(), "GPS enabled", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), "GPS is not enabled", Toast.LENGTH_LONG).show(); } } }
So now if you run your application and open this activity and if your GPS settings is turned off you should see a dialog Happy coding!