Googleapiclient在使用Android中使用Fused的位置API时,即使将上下文传递给了该上下文,也会给出



我正在尝试在服务中实现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用作上下文。

更多信息在这里。

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

相关内容

  • 没有找到相关文章

最新更新