即使在 android 中使用 Fused Location API 时将上下文传递给 GoogleApiClient,GoogleApiClient 也会给出空指针

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

我正在尝试在服务中实施 Fused Location API。我完成了以下编码,但出现如下错误:

  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

在以下代码行:

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

我的代码如下:

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) {

    }
}

我正在通过 context 但仍然是 NullPointer Exception

任何人都可以告诉我如何修复此崩溃并更正 mt 代码,其次我怀疑 fused location api 是否可以与服务一起使用?

你得到 NullPointerException 的原因是你在构造函数中调用 getBaseContext()

这等同于this.getBaseContext()this当时不能用作上下文。

更多信息here

只需将代码从构造函数移动到 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");

}