Android FusedLocationProviderApi: Eingehende Absicht hat keine LocationResult oder LocationAvailability

Ich versuche, Standort-Updates über Google FusedLocationProviderApi zu abonnieren. Ich möchte Updates im Hintergrund erhalten, damit ich Updates bekomme, auch wenn die App getötet wird. Nach der Online-Dokumentation so gut ich kann, habe ich den folgenden Code geschrieben. Hinweis: Dies geschieht in einem Absichtsdienst, nicht auf dem UI-Thread, weshalb ich mit Blocking connect / result Methoden.

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 laufe, sehe ich, dass requestStatus.isSuccess() true zurückgibt, was darauf hinweist, dass ich die Standortaktualisierungen erfolgreich abonniert habe. Darüber hinaus erhält der GeoBroadcastReciever , der WakefulBroadcastReceiver , eine Absicht auf das richtige Polling-Intervall mit der richtigen Aktion. Gut so weit, es scheint. Hier ist was ich in der onReceive Methode für den GeoBroadcastReceiver :

  • RecyclerDie Hibenspiele
  • Akzente aus String entfernen
  • Kundenspezifischer Spinner Adapter
  • Android Studio muss das Projekt vor jedem Lauf neu erstellen
  • Zeitmesser zeigt Zeit wie 4: 7 statt 04:07
  • Wie programmgesteuert erzwingen bluetooth Niedrigenergie Service Entdeckung auf Android ohne Cache zu verwenden
  •   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, wenn die Absicht kommt, es enthält nicht die LocationResult , noch enthält es die LocationAvailabilityResult . Ich überprüfte die eingehende Absicht in den Debugger, und das einzige Element in der Intention der Extras ist das Extra, das ich bei der Einrichtung der Absicht (die Geräte-ID) hinzugefügt habe. Als solches gibt LocationResult.hasResult() false zurück. Jedes Mal.

    Ich habe versucht, dies auf einer Galaxy Note 4 läuft 4.0.1, und ein Nexus 4 läuft 5.1.1, mit dem gleichen Ergebnis.

    Wenn ich den Standort am Telefon deaktiviere, hört ich auf, die Absicht zu bekommen, wie erwartet.

  • Wie zeichne Grundkreis in OpenGL ES 2.0 Android
  • Was sind die Vorteile der Programmiersprache Kotlin?
  • Gibt es eine Möglichkeit, die Android Device Chooser zu verbergen?
  • Wie man Kontaktdetails Bildschirm wie Lollipop implementieren
  • Entfernen von Adressleiste aus dem Browser (auf Android)
  • Äquivalent von ImageView scaleType 'centerCrop' zur Bitmap ziehbare Gravitation
  • 3 Solutions collect form web for “Android FusedLocationProviderApi: Eingehende Absicht hat keine LocationResult oder LocationAvailability”

    Entfernen Sie die Extras aus der anstehenden Absicht, sonst wird das Standortergebnis nicht ausgeliefert. Ich kann nicht finden, wo in der Dokumentation dies erklärt wird, aber ich habe herausgefunden, nach vielen Test und Irrtum.

    Ein Workaround (Christophe Beyls schlug vor, dass nur Intent Data verwendet werden sollte) Also, da muss ich nur noch ein paar Parameter senden, also mache ich so etwas wie beim Aufbau der Intent vor dem requestLocationUpdates: intent.setData (Uri.parse (" http://a.com/a? "+ Param1 +"? "+ Param2 +"? "+ Param3) und im BroadcastReceiver: String [] Parameter = intent.getDataString () Split (" [?] "); Das funktioniert gut, und intent.getParcelableExtra (FusedLocationProviderApi.KEY_LOCATION_CHANGED) gibt den Standort zurück.

    Sie können:

     int id = 7; String name = "myName"; uriBuilder.scheme("http") .authority("workaround.com") .appendPath("extra") .appendQueryParameter("id", String.valueOf(id)) .appendQueryParameter("name", name); intent.setData(uriBuilder.build()); 

    und

     @Override protected void onHandleIntent(Intent intent) { if (LocationResult.hasResult(intent)) { int id = Integer.valueOf(uri.getQueryParameter("id")); String name = uri.getQueryParameter("name"); .... } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.