android - Chrome 自定义标签页重定向到 Android 应用程序将关闭该应用程序

标签 android google-chrome oauth chrome-custom-tabs

我正在尝试使用 Android Chrome 自定义选项卡实现 OAuth2 流程,但当 Chrome 自定义选项卡收到包含我的应用程序的位置/方案的 302 时,我的应用程序始终关闭(没有崩溃)。

如果我创建一个带有 ahref 链接的 HTML 页面并手动触摸它,Chrome 自定义选项卡会正确切换到我的应用程序。

似乎在 Chrome 自定义选项卡中处理服务器 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

构建.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+'
}

感谢您的帮助...

最佳答案

我还观察到我的 Android 应用程序在服务器端 302 重定向到自定义方案后出现意外背景,并观察到独立 Chrome 的预期处理和客户端中手动触发的重定向。

我可以通过调用 warmup 来“解决”这个问题。在加载重定向的 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 Custom Tab docs将热身描述为最佳实践,但它似乎也有助于确保预期的行为。

就环境而言,我正在 Nexus 5X w Chrome 51 上进行测试。我在 Gradle 中的 chrome 选项卡依赖项如下所示:

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

关于android - Chrome 自定义标签页重定向到 Android 应用程序将关闭该应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36084681/

相关文章:

google-chrome - Chrome 控制台/开发人员工具中的 Firebug cd 等效项

java - 使用嵌入式 Web 浏览器(例如 Chrome)作为 Java 桌面应用程序的 GUI 工具包?

javascript - 如何使 Facebook 的 Chrome 扩展重复执行?

javascript - 进行简单的 Twitter API 调用

Node.js 和 Twitter API 1.1

node.js - 如何强制 Angular 在 HTML5 模式下向服务器发送请求?

java - 在 Android 中阻止短信

java - 如何在 Android 中链接 GPS 追踪器?

java - 如何随机排列数组中的问题

android - 单选按钮样式未显示在 webview 中