Пользовательские вкладки Chrome redirect to Android app закроет приложение

Я пытаюсь реализовать поток OAuth2 с пользовательской вкладкой Android Chrome, но мое приложение всегда закрыто (без сбоев), когда пользовательская вкладка Chrome получает 302 с местоположением/схемой моего приложения.

Если я создаю HTML-страницу со ссылкой ahref и касаюсь ее вручную, вкладка Chrome Custom правильно переключается на мое приложение.

похоже, что при обработке перенаправления сервера 302 на вкладке Chrome Custom он неправильно обрабатывает мою пользовательскую схему приложения... но почему?

Если я попробую тот же URL перенаправления в браузере акций или с WebView, все тоже работает.

вот моя текущая настройка:

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>

это URL-адрес перенаправления, который приложение получило с кодом HTTP 302:

myappscheme: / / oauth?код=1234567 & состояние=tokenCheck123

построить.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+'
}

Спасибо за любую помощь...

4 ответов


Я также заметил, что мое приложение для Android неожиданно фоновое после перенаправления на стороне сервера 302 на пользовательскую схему и наблюдал ожидаемую обработку из автономного Chrome и перенаправление вручную в клиенте.

я смог "исправить" проблему, вызвав разминка функция перед загрузкой url, который перенаправляет.

другими словами, это работает:

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);
}

Это не работает:

void launchTab(Context context, Uri uri){
    final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
    final CustomTabsIntent intent = builder.build();
    intent.launchUrl(context, uri);
}

на Chrome Пользовательские вкладки docs опишите разминку как наилучшую практику, но она также, по-видимому, помогает обеспечить ожидаемое поведение.

С точки зрения env, я тестирую Nexus 5X w Chrome 51. Моя зависимость от вкладки chrome в Gradle выглядит так:

dependencies {
    compile 'com.android.support:customtabs:24.0.0'

это помогло мне установить действие, которое я использую для запуска CustomTab в singleInstance режим в файле манифеста:

    <activity
        android:launchMode="singleInstance"
        android:name="com.example.SingleInstanceActivityToStartCustomTab"
    </activity>

а в коде делаю как обычно:

    CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
    final CustomTabsIntent customTabsIntent = builder.build();
    customTabsIntent.intent.setPackage(someChromePackage);
    customTabsIntent.launchUrl(singleInstanceModeActivity, someUriThatDoesRedirect);

Я попытался разогреть Chrome и даже позвонить customTabsIntent.launchUrl() С некоторой задержкой после вызова client.warmup(0l); и ни то, ни другое не помогло.


Если я использовал android: launchMode= "singleInstance", в диспетчере задач было несколько экземпляров, поэтому это не было опцией.

запуск CustomTabsIntent с флагом FLAG_ACTIVITY_NEW_TASK сделал трюк.

CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent intent = builder.build();

intent.intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
intent.launchUrl(context, Uri.parse(url));

Я уверен, что это результат ошибки в Chrome. Я обновил все свои устройства (GS6, GS7, Nexus 7 и Nexus 9) до последней версии Chrome, и мое приложение больше не сворачивается при перенаправлении.

Я только что обнаружил это сегодня (11/3/2016), поэтому у меня пока нет никакой информации о конкретной ошибке или ее последующем разрешении. Именно это я и заметил.

надеюсь, что это поможет!