Chrome自定义标签redirect到Android应用将closures该应用

我正尝试使用Android Chrome自定义标签实现OAuth2stream程,但当Chrome自定义标签接收到302应用程序的位置/scheme时,我的应用程序始终是closures的(不会崩溃)。

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

似乎在处理服务器302redirect在Chrome自定义选项卡时,它不会正确处理我的自定义应用程序scheme…但为什么?

如果我在股票浏览器或WebView中尝试使用相同的redirecturl,则所有内容都可以正常工作。

这是我目前的设置:

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代码收到的redirecturl:

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

谢谢你的帮助…

Solutions Collecting From Web of "Chrome自定义标签redirect到Android应用将closures该应用"

在服务器端302redirect到自定义scheme之后,我也观察到我的Android应用程序意外地出现了后台,并观察到来自独立Chrome的预期处理,并在客户端中手动触发redirect。

我能够通过在加载redirect的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自定义标签文档将热身作为最佳做法来描述,但它似乎也有助于确保预期的行为。

在env方面,我正在Nexus 5X w Chrome 51上进行testing。我在Gradle中的chrome选项卡依赖项如下所示:

 dependencies { compile 'com.android.support:customtabs:24.0.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,甚至在调用client.warmup(0l);之后调用了client.warmup(0l); 并没有帮助。

如果我使用android:launchMode =“singleInstance”,那么在任务pipe理器中有多个实例,所以这是没有select的。

使用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)); 

我很确定这是Chrome中的一个错误的结果。 我将所有设备(GS6,GS7,Nexus 7和Nexus 9)更新为最新版Chrome,发生redirect时我的应用不再最小化。

我今天才发现这个(11/3/2016),所以我还没有任何有关具体错误或其后parsing的信息。 这正是我所注意到的。

希望有所帮助!