我正在尝试使用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代码收到的重定向网址:
myappscheme:// OAuth的代码= 1234567&安培;状态= 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+'
}
感谢您的帮助......
答案 0 :(得分:6)
在服务器端302重定向到自定义方案后,我还意外地观察到我的Android应用后台,并观察了独立Chrome的预期处理以及客户端中手动触发的重定向。
我能够修复&#34;在加载重定向的网址之前调用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将热身描述为最佳做法,但它似乎也有助于确保预期的行为。
就环境而言,我正在使用Nexus 5X w Chrome 51进行测试。我在Gradle中的Chrome标签依赖关系如下所示:
dependencies {
compile 'com.android.support:customtabs:24.0.0'
答案 1 :(得分:2)
如果我使用android:launchMode =&#34; singleInstance&#34;任务管理器中有多个实例,所以这是没有选择的。
使用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));
答案 2 :(得分:0)
它帮助我在清单文件中设置我用来启动CustomTab到 singleInstance 模式的Activity:
<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);
并且没有帮助。
答案 3 :(得分:0)
我很确定这是Chrome中的错误导致的结果。我将所有设备(GS6,GS7,Nexus 7和Nexus 9)更新到最新版本的Chrome,并且在重定向时我的应用程序不再被最小化。
我今天刚刚发现(2016年3月11日),所以我还没有任何关于特定错误或其后续解决方案的信息。这正是我注意到的。
希望有所帮助!