2

I am trying to enable GPS settings using dialog box with the user confirmation.

here is the code

    public void turnGPSOn() {
            LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
            boolean enabled = service
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);
            if (!enabled) {
                      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                        this);
                      alertDialogBuilder
                        .setMessage("GPS is disabled in your device. Enable it?")
                        .setCancelable(false)
                        .setPositiveButton("Enable GPS",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog,
                                                        int id) {
/** Here it's leading to GPS setting options*/
                                        Intent callGPSSettingIntent = new Intent(
                                                android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                                        startActivity(callGPSSettingIntent);
                                    }
                                });
                alertDialogBuilder.setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });
                AlertDialog alert = alertDialogBuilder.create();
                alert.show();
            }
        }

Above code will lead the user to gps setting options.But i have seen in many apps(recent apps) where after confirmation gps setting will be enabled to High-Accuracy automatically.

My Question is i need to enable GPS setting to Battery Saving mode(or any other) after user confirmation(Dialog 'yes') without going to GPS settings.

MinSDK:9
TargetSDK:23
BuildToolVer:23.0.1

Regards.

1

1 Answer 1

4

You can use GoogleApiClient for that.

  private static GoogleApiClient client;
  private  Location mLastLocation;

Also implement necessary interfaces.

GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener

I have implemented these above interfaces

initialize GoogleApiClient in OnCreate like this. Add necessary Apis.

  if (client == null) {
        client = new GoogleApiClient.Builder(mContext)
                .enableAutoManage(context, 0, this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
    }

You can set accuracy by setting priority in the location Request.

These are different priorities.

LocationRequest.PRIORITY_HIGH_ACCURACY
LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
LocationRequest.PRIORITY_LOW_POWER
LocationRequest.PRIORITY_NO_POWER

In the onConnected method make the location request.

The onConnected method is available in GoogleApiClient.ConnectionCallbacks interface.

@Override
public void onConnected(Bundle bundle) {

    final 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);
    result = LocationServices.SettingsApi.checkLocationSettings(client, builder.build());

    if (result != null) {
        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(LocationSettingsResult locationSettingsResult) {
                final Status status = locationSettingsResult.getStatus();

                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 optionsDialog.
                        try {
                            // Show the optionsDialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            if (status.hasResolution()) {
                                status.startResolutionForResult(getActivity(), 1000);
                            }
                        } 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 optionsDialog.
                        break;
                }
            }
        });
    }
}

startResolutionForResult() This function shows the dialog for enabling GPS without going to the Location Settings

1000 is the REQUEST_CODE

And retrieve the location in onActivity Result

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if ((resultCode == Activity.RESULT_OK) && (requestCode == 1000)) {
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(client);
        Log.e("location", mLastLocation.getLatitude() + ":" + mLastLocation.getLongitude());
    }
}
Sign up to request clarification or add additional context in comments.

8 Comments

Thanks for the help. Let me check with this code but I am not using google map and i think above code will make location setting to High-Accuracy. My application is a background app which needs minimal info about location. Is there any way to set location setting to Battery saving mode automatically?
You can set the priority of the Location Request to set battery saving mode. Check the edited answer
@Boss so glad I found this. How can I keep popping the dialog if the user pressed no ?
@BogdanDaniel you can check that in the onActivityResult. Check for the resultcode RESULT_CANCELED
@Boss and what should I put inside that ? status.startResolutionForResult(getActivity(), 1000); or the entire onConnected ?
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.