更新:我收到此错误,就像在这些问题中解释的那样(1和2),但根据{{ 3}},这只是一个内部日志,不应该对功能产生影响
V / GoogleSignatureVerifier:com.google.android.gms签名无效
原始问题:
即使应用程序被杀,我也必须实现与用户位置相关的不同功能。为此,我使用了一项服务。我尝试跟踪用户时遇到问题,因为我似乎在请求位置更新时遇到问题。
这是我服务中最相关的部分:
免责声明:为了阅读起见,代码已经过简化。所有与服务绑定相关的方法以及几个回调都已被删除,因为不是问题的一部分
public class LocationService extends RoboService implements LocationListener {
private static final String TAG = "LocationService";
private static final long UPDATE_INTERVAL_IN_MILLISECONDS = TimeUnit.SECONDS.toMillis(5);
private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = TimeUnit.SECONDS.toMillis(1);
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
@Override
public void onCreate() {
super.onCreate();
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
}
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_REDELIVER_INTENT;
}
public Location getCurrentLocation() {
ConnectionResult connectionResult = mGoogleApiClient.blockingConnect();
if (connectionResult.isSuccess()) {
return LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
}
return null;
}
public void startLocationUpdates() {
ConnectionResult connectionResult = mGoogleApiClient.blockingConnect();
if (connectionResult.isSuccess()) {
Log.d(TAG, "startLocationUpdates: Posting request");
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
Log.d(TAG, "startLocationUpdates: Request posted");
}
}
@Override
public void onLocationChanged(Location newLocation) {
System.out.println("LocationService.onLocationChanged");
}
}
我使用mGoogleApiClient.blockingConnect()
因为架构限制我无法使用连接回调,但是当我尝试获取当前位置时,我没有遇到任何问题。< / p>
当我致电startLocationUpdates()
时,当我请求位置更新时,执行似乎丢失了,而且Log.d(TAG, "startLocationUpdates: Request posted")
和onLocationChanged(Location newLocation)
都没有被调用。
这里是logcat:
05-23 11:42:47.509 13547-13547/com.example.location D/MapPresenterImpl: onRouteAdded: Starting route tracking
05-23 11:42:47.512 13547-13950/com.example.location D/LocationService: startLocationUpdates: Posting request
05-23 11:43:28.115 13547-13557/com.example.location W/art: Suspending all threads took: 7.530ms
我的代码基本上是从this answer复制的。我下载了示例源代码,我让它正常工作。我的代码和示例之间的唯一区别是我在服务中并使用mGoogleApiClient.blockingConnect()
,但我不知道这会如何影响这种方式。
有人曾经遇到过这种行为吗?我真的输了,我会提前帮助。
替代方法:
最后,我使用PendingIntent而不是Callback方法解决了这个问题。我仍然很高兴知道为什么会这样,但如果有人遇到这个问题并且不知道如何继续,那么这就是我的解决方法。
启动位置更新的方法:
public void startLocationTracking(long routeId) {
ConnectionResult connectionResult = mGoogleApiClient.blockingConnect();
if (connectionResult.isSuccess()) {
Intent intent = new Intent(this, TrackingService.class);
PendingIntent pi = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
LocationRequest request = new LocationRequest();
request.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
request.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, pi);
}
}
跟踪服务:
public class TrackingService extends IntentService {
public TrackingService() {
super("TrackingService");
}
@Override
protected void onHandleIntent(Intent intent) {
if (LocationResult.hasResult(intent)) {
LocationResult locationResult = LocationResult.extractResult(intent);
Location location = locationResult.getLastLocation();
// Do whatever you need with the location
}
}
}
使用这种方法我遇到了另一个奇怪的问题。如果你在用于构建PendingIntent的Intent中加入一些额外的东西,当调用TrackingService时,Intent extras中没有任何位置,只有在创建Intent时添加的内容。我的解决方法是使用SharedPreferences传递我需要的id,但我并不真正相信这个补丁。 Android examples中讨论了此问题。