Browserabsicht und Rückkehr zur korrekten Aktivität (geöffnete Registerkarte schließen)

9

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:

%Vor%

Anstatt ein WebView in SignInActivity zu öffnen, starte ich dann eine Browserabsicht und warte bis der Browser my-custom-scheme://callback erreicht hat.

%Vor%

In meinem SignInActivity habe ich den folgenden Code, um den Rückruf zu behandeln:

%Vor%

Das funktioniert. Aber, zu dem Problem (endlich!):

  1. Wenn der Benutzer nicht angemeldet ist, zeigt die Browserabsicht die Anmeldeseite für den oauth-Anbieter an. Nachdem der Nutzer sich angemeldet hat, wird Chrome zu my-custom-scheme: // Callback umgeleitet und 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.
  2. Wenn der Benutzer bereits angemeldet ist, leitet der oauth-Provider direkt zu my-custom-scheme: // callback um. In diesem Fall wird der Browser tab automatisch geschlossen, aber der Browser selbst bleibt geöffnet (ohne sichtbare Registerkarten).

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).

    
joscarsson 14.09.2014, 09:40
quelle

1 Antwort

4

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:

  • Browser mit Anmeldeseite öffnen
  • Fang Umleitung zu custom-scheme://callback
  • Beenden Sie den Anmeldevorgang mit dem Token, das Sie von der umgeleiteten URL erhalten haben
  • gibt das Ergebnis zurück an MainActivity

So sieht seine Methode onCreate folgendermaßen aus:

%Vor%

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.

%Vor%

Hier ist die Deklaration von SignInActivity in AndroidManifest.xml

%Vor%     
Andrii Panasiuk 22.11.2016 10:16
quelle