Android FusedLocationProviderApi: Eingehende Absicht hat kein LocationResult oder LocationAvailability

Ich versuche, Standortaktualisierungen über FusedLocationProviderApi von Google zu abonnieren. Ich möchte Updates im Hintergrund erhalten, damit ich auch dann Updates erhalte, wenn die App beendet wird. Nach der Online-Dokumentation, so gut ich kann, habe ich den folgenden Code geschrieben. Hinweis: Dies geschieht in einem Intent-Dienst, nicht im UI-Thread. Aus diesem Grund verwende ich blockierende Verbindungs- / Ergebnismethoden.

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();
}

Wenn ich das starte, sehe ich, dassrequestStatus.isSuccess() gibt true zurück und zeigt an, dass ich die Standortaktualisierungen erfolgreich abonniert habe. Zusätzlich kann dasGeoBroadcastReciever, das erweitertWakefulBroadcastReceiver empfängt eine Absicht im richtigen Abfrageintervall mit der richtigen Aktion. Soweit gut, scheint es. Hier ist was ich im @ maconReceive Methode für dasGeoBroadcastReceiver:

    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.");
    }

Das Problem ist, wann immer die Absicht hereinkommt, enthält es nicht dasLocationResult, noch enthält es dasLocationAvailabilityResult. Ich habe die eingehende Absicht im Debugger überprüft, und das einzige Element in den Extras der Absicht ist die zusätzliche, die ich beim Einrichten der Absicht hinzugefügt habe (die Geräte-ID). So wie,LocationResult.hasResult() gibt false zurück. Jedes Mal

Ich habe dies auf einem Galaxy Note 4 mit 4.0.1 und einem Nexus 4 mit 5.1.1 versucht, mit dem gleichen Ergebnis.

Wenn ich den Standort auf dem Telefon deaktiviere, erhalte ich erwartungsgemäß keine Absichten mehr.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage