web-dev-qa-db-ja.com

ChromeカスタムタブはAndroidアプリがアプリを閉じます

Android Chrome Custom Tabを使用してOAuth2フローを実装しようとしていますが、Chromeカスタムタブは、私のアプリの場所/スキームを含む302を受信して​​います。

Ahrefリンクを含むHTMLページを作成し、それを手動でタッチすると、Chromeカスタムタブが正しくアプリに切り替わります。

Chrome Custom Tabでサーバー302リダイレクトを処理する場合、カスタムアプリケーションスキームを正しく処理しないようです...しかし、なぜですか?

ストックブラウザーまたはWebViewで同じリダイレクトURLを試しても、すべてが機能しています。

これが私の現在の設定です:

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>

これは、アプリがHTTP 302コードで受け取ったリダイレクトURLです。

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+'
}

助けてくれてありがとう...

14
sysbeast

私はまた、Androidアプリが予期せずバックグラウンドでカスタムスキームにリダイレクトした後のバックグラウンドアプリを観察し、スタンドアロンから期待される処理を確認しましたChromeおよび手動でクライアントでリダイレクトをトリガーしました。

リダイレクトするURLをロードする前に warmup 関数を呼び出すことで問題を「修正」することができました。

つまり、これは機能します。

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 Custom Tab docs は、ウォーミングアップをベストプラクティスとして説明していますが、期待される動作を保証するのにも役立つようです。

Envに関しては、Nexus 5Xでテストしています。Chrome51。Gradleのchromeタブの依存関係は次のようになります。

dependencies {
    compile 'com.Android.support:customtabs:24.0.0'
7
user1971682

Android:launchMode = "singleInstance"を使用した場合、タスクマネージャーに複数のインスタンスがあったため、これはオプションではありませんでした。

FLAG_ACTIVITY_NEW_TASKフラグを使用してCustomTabsIntentを開始するとうまくいきました。

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

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

これはChromeのバグが原因であると確信しています。すべてのデバイス(GS6、GS7、Nexus 7、Nexus 9)をChrome)の最新バージョンに更新しましたが、リダイレクトが発生したときにアプリが最小化されなくなりました。

今日(2016年11月3日)にこれを発見したので、特定のバグまたはその後の解決策についての情報はまだありません。これは私が気づいたことです。

お役に立てば幸いです。

0
bstar55

これにより、マニフェストファイルで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);を呼び出してみましたが、どちらも役に立ちませんでした。

0
dkunin