Search code examples
androidnullpointerexceptionandroid-fusedlocationandroid-googleapiclient

GoogleApiClient gives a nullpointer even when a context is passed to it while using Fused Location API in android


I am trying to implement Fused Location API in a service. I have done the following coding but I am getting an error as follows:

  java.lang.RuntimeException: Unable to instantiate service com.locate.LocationDetails: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Looper android.content.Context.getMainLooper()' on a null object reference

at the following line of code:

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

My code is as follows:

public class LocationDetails extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;
    Broadcaster broadcaster;
    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;

    @Override
    public void onCreate() {
        super.onCreate();



    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);

    }

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

        return super.onStartCommand(intent, flags, startId);
    }

    public LocationDetails() {
        // super();
      mGoogleApiClient = new GoogleApiClient.Builder(getBaseContext())
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();


        mGoogleApiClient.connect();
      /*  mLocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setInterval(10 * 1000)        // 10 seconds, in milliseconds
                .setFastestInterval(1 * 1000);*/
        Log.i("Service", "Started");


    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    @Override
    public void onConnected(Bundle bundle) {

        Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

        if (location == null) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, (com.google.android.gms.location.LocationListener) this);
        } else {
            handleNewLocation(location);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.i("Connection", "Suspended");

    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {

        if (connectionResult.hasResolution()) {
            try {

                connectionResult.startResolutionForResult((Activity) getBaseContext(), CONNECTION_FAILURE_RESOLUTION_REQUEST);
            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
            }
        } else {
            Log.i("connection err", "Location services connection failed with code " + connectionResult.getErrorCode());
        }
    }

    private void handleNewLocation(Location location) {
        double currentLatitude = location.getLatitude();
        double currentLongitude = location.getLongitude();
        LatLng latLng = new LatLng(currentLatitude, currentLongitude);

        Log.i("location", "" + latLng);


    }

    @Override
    public void onLocationChanged(Location location) {
        Log.i("On Changd Location", "" + location.getLatitude());

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {
        Log.i("Provider", provider);

    }

    @Override
    public void onProviderDisabled(String provider) {

    }
}

I am passing a context but still the NullPointer Exception.

Can anyone tell me how to fix this crash and correct mt code and secondly I have a doubt that whether fused location api can be used with a service or not?


Solution

  • The reason you're getting a NullPointerException is because you are calling getBaseContext() in the constructor.

    This equates to this.getBaseContext(), and this cannot be used as a Context at that time.

    More info here.

    Just move the code from the constructor to onCreate():

    @Override
    public void onCreate() {
        super.onCreate();
    
        mGoogleApiClient = new GoogleApiClient.Builder(getBaseContext())
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    
    
        mGoogleApiClient.connect();
    
        Log.i("Service", "Started");
    
    }