android - 使用启用 AppLink 的应用程序打开 CustomTabIntent
问题描述
我正在尝试在我的应用程序上添加 CustomTabIntent 以打开我网站的 url。问题是我已经在我的应用程序中实现了 AppLinking,因为 Chrome 选项卡没有出现,并且它被重定向到我的深度链接处理程序类,该类将我的 url 重定向到 chrome。
我为 CustomTabIntent 使用了以下代码,
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder()
.setToolbarColor(ContextCompat.getColor(this, R.color.colorPrimary))
.setSecondaryToolbarColor(ContextCompat.getColor(this, R.color.colorPrimaryDark))
.setShowTitle(true)
.addDefaultShareMenuItem()
.setStartAnimations(this, R.anim.slide_in_right, R.anim.slide_out_left)
.setExitAnimations(this, android.R.anim.slide_in_left,
android.R.anim.slide_out_right);
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(this, Uri.parse(url));
他们是我可以绕过applink打开CustomTabIntent的一种方式吗?
解决方案
是的,您可以通过访问 CustomTabsIntent 中的内部 Intent 并调用 setPackageName 来设置要打开的应用程序的包名称。
String packageName = "...";
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder()
.setToolbarColor(ContextCompat.getColor(this, R.color.colorPrimary))
.setSecondaryToolbarColor(ContextCompat.getColor(this, R.color.colorPrimaryDark))
.setShowTitle(true)
.addDefaultShareMenuItem()
.setStartAnimations(this, R.anim.slide_in_right, R.anim.slide_out_left)
.setExitAnimations(this, android.R.anim.slide_in_left,
android.R.anim.slide_out_right);
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.intent.setPackage(packageName);
customTabsIntent.launchUrl(this, Uri.parse(url));
从现在开始,您一定想知道在打开自定义选项卡时如何找出要设置的包名称。即使您可以为特定浏览器硬编码包名称,例如:
customTabsIntent.intent.setPackageName("com.android.chrome");
但是,由于其他浏览器(例如 Firefox 和三星)也支持 CustomTabs,因此您最好找出安装了哪些浏览器并使用其中之一。
下面的代码可以帮助解决这个问题:
public static ArrayList getCustomTabsPackages(Context context) {
PackageManager pm = context.getPackageManager();
// Get default VIEW intent handler.
Intent activityIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
// Get all apps that can handle VIEW intents.
List resolvedActivityList = pm.queryIntentActivities(activityIntent, 0);
ArrayList packagesSupportingCustomTabs = new ArrayList<>();
for (ResolveInfo info : resolvedActivityList) {
Intent serviceIntent = new Intent();
serviceIntent.setAction(ACTION_CUSTOM_TABS_CONNECTION);
serviceIntent.setPackage(info.activityInfo.packageName);
// Check if this package also resolves the Custom Tabs service.
if (pm.resolveService(serviceIntent, 0) != null) {
packagesSupportingCustomTabs.add(info);
}
}
return packagesSupportingCustomTabs;
}
可以将它与CustomTabsClient.getPackageName结合使用来选择包。
推荐阅读
- generics - 使用 Core Data 在 SwiftUI ForEach 中为 Data.Element 键入未知数
- sql - 使用不匹配的复合主键连接两个表
- mysql - MySQL Workbench - 存储过程 - 错误 - 手册中没有参考
- python - 如何检查来自变量输入的 SQL 查询是否在 Python 中返回一行?
- java - 使用 Rest Template 从外部 api 返回特定数据
- angular - Angular Observable - 订阅但 html 不输出信息
- python - 如何打印列表中当前元素和前一个元素的总和
- ios - textfield.becomeFirstResponder 没有保持文本字段快速集中
- c - 我怎样才能写一个 if thats 与一个 else 相关,然后在它下面写一个 if 与另一个 else 相关?
- android - 浮动操作按钮背景模糊