Beim Implementieren eines benutzerdefinierten Kontotyps in AccountManager
in Android habe ich das folgende Problem für den Anmeldevorgang:
Die Anmeldung sollte über einen OAuth-Anbieter erfolgen. Daher habe ich ein SignInActivity
erstellt, das ein WebView
startet und einen OAuth-Flow startet. Dies funktioniert einwandfrei, wenn der Rückruf an my-custom-scheme://callback
empfangen wird, der WebView
ihn erkennt, den Parameter code
querystring empfängt und den Fluss abschließt. Der Nachteil bei der Verwendung von WebView
ist, dass, obwohl der Benutzer möglicherweise bereits eine aktive Sitzung im Browser hat, diese Sitzung nicht in WebView
verwendet wird, so dass sich der Benutzer erneut in WebView
anmelden muss.
Um das Problem zu lösen, habe ich versucht, einen intent-filter
in AndroidManifest.xml
zu verwenden, wie folgt:
Anstatt ein WebView
in SignInActivity
zu öffnen, starte ich dann eine Browserabsicht und warte bis der Browser my-custom-scheme://callback
erreicht hat.
In meinem SignInActivity
habe ich den folgenden Code, um den Rückruf zu behandeln:
Das funktioniert. Aber, zu dem Problem (endlich!):
SignInActivity
wird gestartet, um die Absicht zu bearbeiten. Da diese Aktivität nicht sichtbar ist, bleibt der Browser auf der Anmeldeseite geöffnet und für den Benutzer sieht es so aus, als sei nichts passiert. Der Browser wird nie geschlossen. Also meine Frage ist: Gibt es trotzdem, dass der Browser sich anders verhält, nachdem er zu my-custom-scheme: // callback umgeleitet wurde? Idealerweise möchte ich, dass es einfach geschlossen wird, nachdem es zum Callback umgeleitet wurde und zu der vorherigen Aktivität im Aktivitätsstapel zurückkehrt (d. H. Zu der Aktivität, die SignInActivity
von Anfang an gestartet hat).
Ich habe den nächsten Ansatz verwendet, um das gleiche Problem zu beheben.
Nehmen wir an, wir haben MainActivity
mit Sign In
button. Anstatt des Browsers direkt auf diesen Button zu klicken, starte ich SignInActivity
mit startActivityForResult
method. Es verwendet für dann kann ich das Ergebnis des Login-Flusses behandeln.
startActivityForResult(new Intent(this, SignInActivity.class), requestCode);
SignInActivity
ist verantwortlich für:
custom-scheme://callback
MainActivity
So sieht seine Methode onCreate
folgendermaßen aus:
Geben Sie in der Browserabsicht festgelegte Flags ein.
Auf diese Weise, wenn SignInActivity
von MainActivity
geöffnet wird, öffnet es einfach die Anmeldeseite im Browser und wenn es geöffnet wird, fängt es die Weiterleitungs-URL ab und vervollständigt den Login-Fluss mit der entsprechenden Anfrage.
Nachdem Sie den Anmeldevorgang abgeschlossen und den Code an einen Endpunkt Ihrer Rückrufmethode gesendet haben, sollten Sie Folgendes tun:
%Vor% Natürlich erhalten Sie access_token von diesem Endpunkt. Sie können sie entweder hier im Erfolgsrückruf speichern oder an den MainActivity
zurückgeben, um sie dort zu behandeln.
Als Layout für SignInActivity
können Sie nur ProgressBar
in der Mitte der Seite verwenden. Es erscheint während des Abschlusses des Login-Ablaufs, nachdem SignInActivity
geöffnet wurde und die Umleitungs-URL ( custom-scheme://callback
) aufgefunden wurde.
Hier ist die Deklaration von SignInActivity
in AndroidManifest.xml
Tags und Links android google-chrome android-intent oauth-2.0