我需要在后台获取用户的位置,因此我尝试在我的Service类中使用Fused Location Provider。我将下面的代码放在onStart()
方法中,但无法识别上下文MainActivity.getAppContext()
。我可以在它的位置使用什么,因为我在我的服务类中使用它?
GoogleApi = new GoogleApiClient.Builder(MainActivity.getAppContext())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
答案 0 :(得分:3)
下面的代码解释了如何在服务中使用融合位置提供程序
import android.Manifest;
import android.app.Service;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.os.IBinder;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
public class LocationService extends Service implements
LocationListener,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private String TAG = LocationService.class.getSimpleName();
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private static final long INTERVAL = 1000 * 30 * 60;
private static final long FASTEST_INTERVAL = 1000 * 25 * 60;
private static final long MEDIUM_INTERVAL = 1000 * 30 * 60;
public LocationService() {
}
@Override
public void onCreate() {
super.onCreate();
createLocationRequest();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (!mGoogleApiClient.isConnected()) {
mGoogleApiClient.connect();
} else {
startLocationUpdates();
}
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
protected void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(MEDIUM_INTERVAL);
mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
@Override
public void onConnected(@Nullable Bundle bundle) {
Log.v(TAG, "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected());
if (mGoogleApiClient.isConnected()) {
startLocationUpdates();
}
}
protected void startLocationUpdates() {
if (mGoogleApiClient != null) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
Log.v(TAG, "Location update started ..............: ");
}
}
protected void stopLocationUpdates() {
if (mGoogleApiClient != null && mGoogleApiClient.isConnected() && LocationServices.FusedLocationApi != null) {
LocationServices.FusedLocationApi.removeLocationUpdates(
mGoogleApiClient, this);
Log.v(TAG, "Location update stopped .......................");
mGoogleApiClient.disconnect();
}
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
public void onLocationChanged(Location location) {
Log.v(TAG, "Latitude: " + location.getLatitude() + " Longitude: " + location.getLongitude());
}
@Override
public void onDestroy() {
super.onDestroy();
stopLocationUpdates();
Log.v(TAG, "Service Stopped!");
}
}
答案 1 :(得分:0)
df2 = self.df.copy()
是Service
,因此您可以Context
在Service
内使用this
。
服务还有getApplicationContext()
,它返回应用程序的上下文,这可能是MainActivity.getAppContext()
可能应该返回的内容。你也可以使用它。
GoogleApi = new GoogleApiClient.Builder(getApplicationContext())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();