web-dev-qa-db-fra.com

Les onglets personnalisés Chrome redirigent vers l'application Android vont fermer l'application.

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

10
sysbeast

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'
6
user1971682

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));
1
Sebastian

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!

0
bstar55

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

0
dkunin