Search code examples
androidandroid-servicegoogle-api-clientlocation-services

android check location services enabled if using GoogleApiClient


I am using GoogleApiClient to get current location in Service class and while starting I want to get the status of location Service of mobile, if location service is disable then I want to show popup to enable it.

So how do I check the status of location service using GoogleApiClient

here is my Service class

public class MyService extends Service implements LocationListener,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener{


    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;




    private static final long INTERVAL = 1000 * 300;
    private static final long FASTEST_INTERVAL = 1000 * 200;

    public MyService() {
        super();

    }


    @Override
    public void onCreate() {
        super.onCreate();
        //initialize location request
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(INTERVAL);
        mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

        //initialize GooleApiClient
        mGoogleApiClient = new GoogleApiClient.Builder(this)
        .addApi(LocationServices.API)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .build();

                //code to find nearby using TimerTask
                Timer timer = new Timer();
                TimerTaskFindNearby findNearby = new TimerTaskFindNearby(getApplicationContext());
                timer.scheduleAtFixedRate(findNearby,1000,AppDataHandler.TASK_TIME);


    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        mGoogleApiClient.connect();
        Log.d("Service","onstartcommand");
        return Service.START_STICKY;
    }

    @Override
    public void onConnected(Bundle arg0) {


        Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if (location == null) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }
        else{
            onLocationChanged(location);
        }

    }



    @Override
    public void onLocationChanged(Location location) {


        AppDataHandler.myLocation.setLatitude(String.valueOf(location.getLatitude())+"");
        AppDataHandler.myLocation.setLongitude(String.valueOf(location.getLongitude())+"");

        //store on shared pref
        SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("FriendFinderSharedPref", Context.MODE_PRIVATE);

        LocationBean myLocation = new LocationBean();
        myLocation.setLatitude(String.valueOf(location.getLatitude())+"");
        myLocation.setLongitude(String.valueOf(location.getLongitude())+"");
        myLocation.setMobile(sharedPreferences.getString("myMobile", "noData"));

        //save to shared pref to make accessible from TimerTask
        Gson gson = new Gson();
        Editor editor = sharedPreferences.edit();
        editor.putString("myLocation", gson.toJson(myLocation).toString()); 
        editor.commit();

        //store location on server by using volley String request
        String url = baseURL+"userdata/savemylocation";


            //inform to activity
            sendBroadcast();
    }


    //send broadcast from activity to all receivers listening to the action "ACTION_STRING_ACTIVITY"
    private void sendBroadcast() {
        final Intent new_intent = new Intent();
        new_intent.setAction(AppDataHandler.ACTIVITY_RECEIVER_ACTION);

        sendBroadcast(new_intent);


    }

    @Override
    public void onDestroy() {
        Log.d("service", "destroy");
        super.onDestroy();
    }

    @Override
    public void onConnectionFailed(ConnectionResult arg0) {}
    @Override
    public void onConnectionSuspended(int arg0) {}


    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }

}

Solution

  • LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(mLocationRequest);
        builder.setAlwaysShow(true);
    
        result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
    
        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @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(
                                    getActivity(),
                                    REQUEST_LOCATION);
                        } 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;
                }
            }
        });
    
    }
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        Log.d("onActivityResult()", Integer.toString(resultCode));
    
        //final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
        switch (requestCode)
        {
            case REQUEST_LOCATION:
                switch (resultCode)
                {
                    case Activity.RESULT_OK:
                    {
                        // All required changes were successfully made
                        Toast.makeText(getActivity(), "Location enabled by user!", Toast.LENGTH_LONG).show();
                        break;
                    }
                    case Activity.RESULT_CANCELED:
                    {
                        // The user was asked to change settings, but chose not to
                        Toast.makeText(getActivity(), "Location not enabled, user cancelled.", Toast.LENGTH_LONG).show();
                        break;
                    }
                    default:
                    {
                        break;
                    }
                }
                break;
        }
    }
    

    This will display a dialog if location is OFF