自动关闭 chrome 个自定义选项卡
Auto close chrome custom tab
我有一个用于打开 phone 浏览器的应用程序,用户将被重定向到我的网络应用程序,在某个用户操作之后,网络应用程序使用意图过滤器重定向回应用程序
<application>
<activity
android:name="com.xyz.sdk.SomeActivity"
android:allowTaskReparenting="true"
android:configChanges="keyboardHidden|orientation|keyboard|screenSize"
android:launchMode="singleTask"
android:noHistory="true"
android:theme="@android:style/Theme.NoTitleBar">
<intent-filter>
<data android:scheme="someString-${applicationId}" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
</application>
最近我迁移到使用 Chrome 自定义选项卡而不是浏览器(出于安全考虑,Webview 不是一个选项)
不幸的是,在 chrome 自定义选项卡中重定向回应用程序时,chrome 自定义选项卡不会自动关闭。即使我可以通过日志验证应用程序已收到响应,自定义选项卡仍保持打开状态并保持在顶部,因此用户无法看到应用程序上发生的事情,直到他关闭应用程序。
我发现的一个解决方法是在启动我的自定义选项卡时设置 NEW_TASK 标志,但这会使我的应用程序和自定义选项卡显示为两个单独的应用程序,这就是我离开的全部原因首先来自浏览器。
总结:我有应用程序 A,它打开了一个自定义选项卡,在自定义选项卡中打开的 Web 应用程序使用意图过滤器重定向回应用程序 A,但 vustom 选项卡不会关闭并保持在顶部,直到用户手动关闭它。
我已经尝试为自定义标签意图设置 NO_HISTORY 标志,但没有任何区别。
自定义标签代码:
CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder()
.setShowTitle(true)
.setToolbarColor(getToolBarColor())
.setStartAnimations(this, android.R.anim.slide_in_left, android.R.anim.slide_out_right)
.setExitAnimations(this, android.R.anim.slide_in_left, android.R.anim.slide_out_right)
.build();
customTabsIntent.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
customTabsIntent.launchUrl(this, Uri.parse(url));
customTabsIntent.launchUrl(this, Uri.parse(url));
更新
我已经意识到,如果 intent 过滤器重定向回另一个应用程序,则自定义选项卡会成功关闭(前提是它是单页 activity 并且没有历史记录设置为 true)
但就我而言,我们需要重定向回调用自定义选项卡的同一个 activity。
我也遇到了同样的问题,但就我而言,它现在可以正常工作了。
我使用 FLAG_ACTIVITY_NO_HISTORY 和 FLAG_ACTIVITY_CLEAR_TOP 启动了自定义选项卡。
customTabsIntent.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
我的 activity 的启动模式是 "singleTop"。
<activity
android:name=".SomeActivity"
android:theme="@style/SomeTheme"
android:configChanges="keyboardHidden|orientation|screenSize"
android:noHistory="true"
android:launchMode="singleTop" >
<intent-filter>
<data android:scheme="intent" />
<data android:scheme="myFile" />
<data android:scheme="myScheme" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
@bkant 的重要更新:
I was able to get this to work by changing the launch mode from 'singleTop' to either 'singleTask' or 'singleInstance'. In this mode, the redirect will come to the same Activity via 'onNewIntent'.
这个问题也存在于 Xamarin 中,答案适用于使用 Xamarin.Forms 时的问题。它可以通过修改 Activity 属性来应用。修改代码以匹配 LaunchMode = LaunchMode.SingleTask
这里是 Xamarain.Auth 来自 https://developer.xamarin.com/samples/xamarin-forms/WebServices/OAuthNativeFlow/
的修改示例
namespace OAuthNativeFlow.Droid
{
[Activity(Label = "CustomUrlSchemeInterceptorActivity", NoHistory = true, LaunchMode = LaunchMode.SingleTask)]
[IntentFilter(
new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
DataSchemes = new[] { "<insert custom URL here>" },
DataPath = "/oauth2redirect")]
public class CustomUrlSchemeInterceptorActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Convert Android.Net.Url to Uri
var uri = new Uri(Intent.Data.ToString());
// Load redirectUrl page
AuthenticationState.Authenticator.OnPageLoading(uri);
Finish();
}
}
}
我有一个用于打开 phone 浏览器的应用程序,用户将被重定向到我的网络应用程序,在某个用户操作之后,网络应用程序使用意图过滤器重定向回应用程序
<application>
<activity
android:name="com.xyz.sdk.SomeActivity"
android:allowTaskReparenting="true"
android:configChanges="keyboardHidden|orientation|keyboard|screenSize"
android:launchMode="singleTask"
android:noHistory="true"
android:theme="@android:style/Theme.NoTitleBar">
<intent-filter>
<data android:scheme="someString-${applicationId}" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
</application>
最近我迁移到使用 Chrome 自定义选项卡而不是浏览器(出于安全考虑,Webview 不是一个选项)
不幸的是,在 chrome 自定义选项卡中重定向回应用程序时,chrome 自定义选项卡不会自动关闭。即使我可以通过日志验证应用程序已收到响应,自定义选项卡仍保持打开状态并保持在顶部,因此用户无法看到应用程序上发生的事情,直到他关闭应用程序。
我发现的一个解决方法是在启动我的自定义选项卡时设置 NEW_TASK 标志,但这会使我的应用程序和自定义选项卡显示为两个单独的应用程序,这就是我离开的全部原因首先来自浏览器。
总结:我有应用程序 A,它打开了一个自定义选项卡,在自定义选项卡中打开的 Web 应用程序使用意图过滤器重定向回应用程序 A,但 vustom 选项卡不会关闭并保持在顶部,直到用户手动关闭它。
我已经尝试为自定义标签意图设置 NO_HISTORY 标志,但没有任何区别。
自定义标签代码:
CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder()
.setShowTitle(true)
.setToolbarColor(getToolBarColor())
.setStartAnimations(this, android.R.anim.slide_in_left, android.R.anim.slide_out_right)
.setExitAnimations(this, android.R.anim.slide_in_left, android.R.anim.slide_out_right)
.build();
customTabsIntent.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
customTabsIntent.launchUrl(this, Uri.parse(url));
customTabsIntent.launchUrl(this, Uri.parse(url));
更新 我已经意识到,如果 intent 过滤器重定向回另一个应用程序,则自定义选项卡会成功关闭(前提是它是单页 activity 并且没有历史记录设置为 true) 但就我而言,我们需要重定向回调用自定义选项卡的同一个 activity。
我也遇到了同样的问题,但就我而言,它现在可以正常工作了。
我使用 FLAG_ACTIVITY_NO_HISTORY 和 FLAG_ACTIVITY_CLEAR_TOP 启动了自定义选项卡。
customTabsIntent.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
我的 activity 的启动模式是 "singleTop"。
<activity
android:name=".SomeActivity"
android:theme="@style/SomeTheme"
android:configChanges="keyboardHidden|orientation|screenSize"
android:noHistory="true"
android:launchMode="singleTop" >
<intent-filter>
<data android:scheme="intent" />
<data android:scheme="myFile" />
<data android:scheme="myScheme" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
@bkant 的重要更新:
I was able to get this to work by changing the launch mode from 'singleTop' to either 'singleTask' or 'singleInstance'. In this mode, the redirect will come to the same Activity via 'onNewIntent'.
这个问题也存在于 Xamarin 中,答案适用于使用 Xamarin.Forms 时的问题。它可以通过修改 Activity 属性来应用。修改代码以匹配 LaunchMode = LaunchMode.SingleTask
这里是 Xamarain.Auth 来自 https://developer.xamarin.com/samples/xamarin-forms/WebServices/OAuthNativeFlow/
的修改示例namespace OAuthNativeFlow.Droid
{
[Activity(Label = "CustomUrlSchemeInterceptorActivity", NoHistory = true, LaunchMode = LaunchMode.SingleTask)]
[IntentFilter(
new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
DataSchemes = new[] { "<insert custom URL here>" },
DataPath = "/oauth2redirect")]
public class CustomUrlSchemeInterceptorActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Convert Android.Net.Url to Uri
var uri = new Uri(Intent.Data.ToString());
// Load redirectUrl page
AuthenticationState.Authenticator.OnPageLoading(uri);
Finish();
}
}
}