我正在尝试在服务中实现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");
}