J'essaie d'implémenter un flux OAuth2 avec un onglet personnalisé Chrome Android, mais mon application est toujours fermée (pas de blocage) lorsque l'onglet personnalisé Chrome reçoit le 302 avec l'emplacement/le schéma de mon application.
Si je crée une page HTML avec un lien ahref et touche manuellement dessus, l'onglet personnalisé Chrome bascule correctement vers mon application.
On dirait que lors de la gestion de la redirection du serveur 302 dans l'onglet personnalisé Chrome, cela ne gérera pas correctement mon schéma d'applications personnalisées ... mais pourquoi?
Si j'essaye la même URL de redirection dans un navigateur standard ou avec une WebView, tout fonctionne également.
Voici ma configuration actuelle:
MainActiviy.Java
Button btnChromeCustomTab = (Button) findViewById(R.id.btnChromeCustomTab);
btnChromeCustomTab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build();
String packageName = CustomTabsHelper.getPackageNameToUse(MainActivity.this);
customTabsIntent.intent.setPackage(packageName);
Uri theLocationUri = Uri.parse(URL);
customTabsIntent.launchUrl(MainActivity.this, theLocationUri);
}
});
AndroidManifest.xml
<activity Android:name=".MainActivity" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter Android:label="@string/filter_title">
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT" />
<category Android:name="Android.intent.category.BROWSABLE" />
<data Android:scheme="myappscheme" Android:Host="oauth" />
</intent-filter>
</activity>
Voici l'URL de redirection reçue par l'application avec le code HTTP 302:
myappscheme: // oauth? code = 1234567 & state = tokenCheck123
build.gradle
Android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "de.myapptest.webviewtest"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.Android.support:appcompat-v7:23.2.1'
compile 'com.Android.support:design:23.2.1'
compile 'com.Android.support:customtabs:23.0.0+'
}
Merci pour toute aide...
J'ai également observé de manière inattendue mon application Android en arrière-plan après la redirection 302 côté serveur vers un schéma personnalisé, ainsi que la gestion attendue à partir de Chrome autonome et la redirection déclenchée manuellement dans le client.
J'ai pu "résoudre" le problème en appelant la fonction warmup avant de charger l'URL qui redirige.
En d'autres termes, cela fonctionne:
void launchTab(Context context, Uri uri){
final CustomTabsServiceConnection connection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(ComponentName componentName, CustomTabsClient client) {
final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
final CustomTabsIntent intent = builder.build();
client.warmup(0L); // This prevents backgrounding after redirection
intent.launchUrl(context, uri);
}
@Override
public void onServiceDisconnected(ComponentName name) {}
};
CustomTabsClient.bindCustomTabsService(context, "com.Android.chrome", connection);
}
Cela ne marche pas:
void launchTab(Context context, Uri uri){
final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
final CustomTabsIntent intent = builder.build();
intent.launchUrl(context, uri);
}
Les documents Les onglets personnalisés de Chrome décrivent l’échauffement comme meilleure pratique, mais ils semblent également aider à garantir le comportement attendu.
En termes d’env, je teste un Nexus 5X w Chrome 51. La dépendance de mon onglet chrome dans Gradle ressemble à ceci:
dependencies {
compile 'com.Android.support:customtabs:24.0.0'
Si j'ai utilisé Android: launchMode = "singleInstance", il y avait plusieurs instances dans le gestionnaire de tâches, donc ce n'était pas une option.
Démarrer le CustomTabsIntent avec FLAG_ACTIVITY_NEW_TASK Le drapeau a fait l'affaire.
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent intent = builder.build();
intent.intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
intent.launchUrl(context, Uri.parse(url));
Je suis sûr que c'est le résultat d'un bug dans Chrome. J'ai mis à jour tous mes appareils (GS6, GS7, Nexus 7 et Nexus 9) vers la dernière version de Chrome et mon application n'est plus minimisée lorsque la redirection se produit.
Je viens de découvrir cela aujourd'hui (03/11/2016), donc je n'ai pas encore d'informations sur le bogue spécifique ou sa résolution ultérieure. C'est juste ce que j'ai remarqué.
J'espère que cela pourra aider!
Cela m'a aidé à définir l'activité que j'utilise pour démarrer un CustomTab sur singleInstance mode dans le fichier manifeste:
<activity
Android:launchMode="singleInstance"
Android:name="com.example.SingleInstanceActivityToStartCustomTab"
</activity>
Et dans le code je fais comme d'habitude:
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
final CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.intent.setPackage(someChromePackage);
customTabsIntent.launchUrl(singleInstanceModeActivity, someUriThatDoesRedirect);
J'ai essayé d'échauffer Google Chrome et même d'appeler customTabsIntent.launchUrl()
avec un peu de retard après avoir appelé client.warmup(0l);
et je n'ai pas aidé.