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 с тем же результатом.

Если я отключу местоположение на телефоне, я перестану получать намерения вообще, как и ожидалось.

Ответы на вопрос(3)

Ваш ответ на вопрос