我们在应用程序中使用 Chrome 自定义标签来打开链接。我们在三星 S6 Edge 上有问题。当我们点击应用程序中的链接时,该设备会打开自己的浏览器(称为 Internet),而不是 Chrome 自定义标签。当您按下返回按钮时,有时它不会返回我们的应用程序,而是从堆栈中打开 Internet 应用程序(如果您最近已经使用此 Internet 应用程序进行浏览)。如果您最近没有使用 Internet 应用程序进行浏览,按返回将正确打开您的应用程序。
3 回答
自定义标签是一个开放的规范,除了 Chrome 之外的其他浏览器可能支持它。
话虽如此,目前三星的互联网浏览器实施(4.0.10-51)似乎存在导致上述行为的错误。
一个临时的解决方法是在打开自定义选项卡时忽略三星 IB 包。您可以在 Github Demo上的getPackageNameToUse方法上查看如何发现哪些浏览器支持自定义选项卡。
修改方法忽略com.sec.android.app.sbrowser
包。然后,强制您要使用的包打开自定义选项卡,如下所示:
customTabsIntent.intent.setPackage(packageName);
customTabsIntent.launchUrl(activity, uri);
我还建议查看自定义选项卡最佳实践,以了解如何为系统中安装了多个支持自定义选项卡的浏览器的场景做好准备。
更新:三星互联网浏览器(4.2)的最新版本似乎已修复这些问题。改进的解决方案是检查已安装浏览器的版本是否兼容。可以使用类似这个 StackOverflow 问题的答案。
我检查了三星最新手机中的许多自定义选项卡客户端。
我发现在三星手机(如 Note 7)中没有观察到这个问题,它具有最新版本的默认浏览器,即 4.2 版(检查版本的程序菜单选项 -> 设置 -> 关于互联网)
因此,对于他们最新的手机,上述忽略或绕过“com.sec.android.app.sbrowser”包名称的解决方案不是必需的。
Google 自定义选项卡示例代码中的解决方法:CustomTabsHelper.java
// Get all apps that can handle VIEW intents.
List<ResolveInfo> resolvedActivityList = pm.queryIntentActivities(activityIntent, 0);
List<String> packagesSupportingCustomTabs = new ArrayList<>();
for (ResolveInfo info : resolvedActivityList) {
Intent serviceIntent = new Intent();
serviceIntent.setAction(ACTION_CUSTOM_TABS_CONNECTION);
serviceIntent.setPackage(info.activityInfo.packageName);
if (pm.resolveService(serviceIntent, 0) != null) {
//If the packagename is not the samsung thing, add it to the list
if (! info.activityInfo.packageName.equals("com.sec.android.app.sbrowser")) {
packagesSupportingCustomTabs.add(info.activityInfo.packageName);
}
}
}