2014-11-04 15 views
11

Ich versuche meiner App GPS-Tracking-Funktionalität hinzuzufügen, indem ich einen GPS-Tracking-Service schreibe. Ich habe die Materialien für Android-Entwickler über die Google Play-Dienste verfolgt, aber ich stehe fest auf der onConnectionFailed-Methode. Ich versuche, startResolutionForResult anzurufen, damit Google Play Services den Fehler behandeln kann. Allerdings erfordert diese Methode, dass eine Aktivität als erster Parameter übergeben wird, und da ich sie von einem Service aus anrufe, bin ich mir nicht sicher, was ich tun soll.Android: Wie rufe ich startResolutionForResult von einem Service auf?

Ich gehe davon aus, dass ich alles falsch mache und es gibt einen ganz anderen Weg, dies von einem Dienst zu behandeln.

Antwort

1

Der Authentifizierungsprozess für Google Play-Dienste benötigt eine Aktivität, da er dem Benutzer möglicherweise eine Benutzeroberfläche anzeigen muss. Da Dienste keine Benutzeroberfläche haben, müssen Sie eine Nachricht an eine Aktivität senden, um die Verbindung einzurichten, und der Dienst kann dann fortgesetzt werden. Es gibt eine gute Antwort, die einen Weg zeigt, dies hier zu tun: Example: Communication between Activity and Service using Messaging

+1

So eine seltsame Lösung. Wie auf googleIO2015 angekündigt, kann der Benutzer einige Berechtigungen deaktivieren. Und wie sollte der UI-Dialog für den Benutzer angezeigt werden ?! Es ist komisch. – ruX

+0

Die neue Funktionalität in M ​​wird wahrscheinlich dieses Verhalten ändern. Bleib dran! –

+0

@ClaytonWilkinson Wie man das richtig macht? Soll ich das 'ConnectionResult' nur in einer Nachricht an die Aktivität und dann an den Aktivitätsaufruf' startResolutionForResult' übergeben? Wird das den API-Client verbinden, der vom Dienst verwendet wird, oder sollte der Dienst anschließend 'connect()' aufrufen? Kann ich auch sicher sein, dass dadurch die Aktivität nicht an die API-Verbindung verloren geht, die vom Dienst verwendet wird? – tron

1

Sie können Status.getResolution() verwenden und Aktivität damit starten. Zum Beispiel:

In Service

PendingIntent pI = status.getResolution(); 
mGoogleApiClient.getContext().startActivity(new Intent(mGoogleApiClient.getContext(), SomeActivity.class) 
.putExtra("resolution", pI).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 

In Aktivität onCreate:

PendingIntent pI = (PendingIntent) (getIntent().getParcelableExtra("resolution")); 
startIntentSenderForResult(pI.getIntentSender(),1,null,0,0,0); 

auch onActivityResult (int requestCode, int Result, Intent-Daten) hinzufügen Ergebnis der Auflösung erhalten

Verwandte Themen