Android FusedLocationProviderApi: входящее намерение не имеет LocationResult или LocationAvailability
Я пытаюсь подписаться на обновления местоположения через Google FusedLocationProviderApi. Я хочу получать обновления в фоновом режиме, чтобы получать обновления, даже если приложение убито. Следуя электронной документации, насколько я могу, я написал следующий код. Примечание: это делается в службе намерений, а не в потоке пользовательского интерфейса, поэтому я использую блокирующие методы соединения / результата.
private void startLocationServices(String deviceId, int pollingInterval) {
Log.i(TAG, "Starting location services with interval: " + pollingInterval + "ms");
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
final PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
wakeLock.acquire();
final GoogleApiClient googleApiClient =
new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.build();
ConnectionResult result = googleApiClient.blockingConnect();
if (!result.isSuccess() || !googleApiClient.isConnected()) {
Log.e(TAG, "Failed to connect to Google Api");
wakeLock.release();
return;
}
LocationRequest locationRequest = new LocationRequest();
locationRequest.setInterval(pollingInterval);
locationRequest.setFastestInterval(10000);
locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
Intent locationIntent = new Intent(this, GeoBroadcastReceiver.class);
locationIntent.putExtra(EXTRA_LOCATION_UPDATE_DEVICE_ID, deviceId);
locationIntent.setAction(GeoBroadcastReceiver.ACTION_LOCATION_UPDATE);
PendingIntent locationPendingIntent = PendingIntent.getBroadcast(
this, 0, locationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingResult pendingResult = LocationServices.FusedLocationApi
.requestLocationUpdates(googleApiClient, locationRequest, locationPendingIntent);
Result requestResult = pendingResult.await();
Status requestStatus = requestResult.getStatus();
if (requestStatus.isSuccess()) {
Log.i(TAG, "Successfully subscribed to location updates.");
} else {
Log.e(TAG, String.format(
"Failed subscribe to location updates. Error code: %d, Message: %s.",
requestStatus.getStatusCode(),
requestStatus.getStatusMessage()));
}
googleApiClient.disconnect();
wakeLock.release();
}
Когда я запускаю это, я вижу, чтоrequestStatus.isSuccess()
возвращает true, указывая, что я успешно подписался на обновления местоположения. Кроме того,GeoBroadcastReciever
, который расширяетWakefulBroadcastReceiver
, получает намерение с правильным интервалом опроса, с правильным действием. Кажется, пока хорошо. Вот что я делаю вonReceive
метод дляGeoBroadcastReceiver
:
if (LocationResult.hasResult(intent)) {
LocationResult locationResult = LocationResult.extractResult(intent);
Location location = locationResult.getLastLocation();
if (location != null) {
GeoMonitoringService.wakefulLocationUpdate(context, location);
} else {
Log.e(TAG, "LocationResult does not contain a LastLocation.");
}
} else {
Log.e(TAG, "Intent does not contain a LocationResult.");
}
Проблема в том, что всякий раз, когда намерение приходит, оно не содержитLocationResult
и не содержитLocationAvailabilityResult
, Я проверил входящее намерение в отладчике, и единственный элемент в дополнениях намерения - это дополнительный, который я добавил при настройке намерения (идентификатор устройства). В качестве таких,LocationResult.hasResult()
возвращает ложь Каждый раз.
Я пробовал это на Galaxy Note 4 с 4.0.1 и Nexus 4 с 5.1.1 с тем же результатом.
Если я отключу местоположение на телефоне, я перестану получать намерения вообще, как и ожидалось.