Je suis coincé là-dessus depuis des heures maintenant que la chose fonctionnait auparavant, mais je me suis soudain arrêté pour me comporter comme prévu. Je ne sais pas vraiment comment et pourquoi car j'ai revérifié chaque ligne de code dans le processus sans être en mesure de voir ce qui ne va pas, alors je vous demande de l'aide.
Bien. J'ai donc une activité LoginScreen
avec un bouton démarrant une nouvelle Intent.ACTION_VIEW
sur clic. Cela démarre le processus OAUTH dans le navigateur avec un ApiManager.OAUTH_CALLBACK_URI
mis à stjapp://oauthresponse
.
Voici mon AndroidManifest.xml
partie pour cette activité:
<activity
Android:name=".LoginScreen"
Android:label="@string/application"
Android:launchMode="singleTask">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.BROWSABLE" />
<data Android:scheme="stjapp" Android:Host="oauthresponse" />
</intent-filter>
</activity>
Comment je démarre le Intent.ACTION_VIEW
dans mon activité:
private View.OnClickListener loginHandler = new View.OnClickListener() {
public void onClick(View v) {
OAuthClientRequest request = null;
try {
request = OAuthClientRequest
.authorizationLocation(ApiManager.OAUTH_AUTHORIZE)
.setClientId(ApiManager.CLIENT_ID).setRedirectURI(ApiManager.OAUTH_CALLBACK_URI)
.buildQueryMessage();
}
catch (OAuthSystemException e) { e.printStackTrace(); }
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(request.getLocationUri() + "&response_type=code"));
startActivity(intent);
}
};
Et voici une capture d'écran de ce qui se passe dans le navigateur:
Là, je suis censé revenir à mon activité LoginScreen
et gérer les paramètres de requête code
dans la méthode onNewIntent
mais ... oui, la chose ne fonctionne pas comme plus attendu.
Toute aide appréciée.
Il semble que ce soit un bug de chrome . La solution de contournement que j'utilise est une page de destination PHP pour le RedirectURI qui ouvre l'application via JavaScript (qui n'est pas affectée par ce bogue):
<script language="javascript">
window.location = 'myscheme://myhost/?<?=$_SERVER["QUERY_STRING"]?>';
</script>
J'ai eu la même erreur et je l'ai résolue en préfixant l'url avec http://
.
uniquement si vous saisissez manuellement l'URL de la page de redirection dans la barre d'adresse. Le problème est sur le tracker de problème de chrome ici.
La réponse avec la "solution de contournement", collée à partir du problème:
OK, j'ai découvert que la redirection window.location via l'intention fonctionnera, COMME LONGUEMENT car elle est cliquée à partir d'une source externe ou d'un lien sur la page. Si vous entrez manuellement l'adresse de la page de redirection dans la barre d'adresse, la redirection/ouverture de l'application échouera avec cette erreur.
Ainsi, l'envoi d'un lien vers la page de redirection dans un e-mail ou SMS fonctionnera très bien lorsque l'utilisateur cliquera sur le lien. La saisie manuelle de l'adresse dans la barre d'adresse échouera. Window.location = chromeUrl ; devrait fonctionner très bien.
Dans Chrome version 40 et plus, ce bogue a refait surface, mais uniquement si vous entrez manuellement l'URL de la page de redirection dans la barre d'adresse. Le problème est sur le tracker de problème de chrome ici .
La réponse avec la "solution de contournement", collée à partir du problème:
OK, j'ai découvert que la redirection window.location via l'intention fonctionnera, COMME LONGUEMENT car elle est cliquée à partir d'une source externe ou d'un lien sur la page. Si vous entrez manuellement l'adresse de la page de redirection dans la barre d'adresse, la redirection/ouverture de l'application échouera avec cette erreur.
Ainsi, l'envoi d'un lien vers la page de redirection dans un e-mail ou SMS fonctionnera très bien lorsque l'utilisateur cliquera sur le lien. La saisie manuelle de l'adresse dans la barre d'adresse échouera.
window.location = chromeUrl;
devrait très bien fonctionner.