首页 > 解决方案 > 使用启用 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的一种方式吗?

标签: androidapplinkschrome-custom-tabs

解决方案


是的,您可以通过访问 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结合使用来选择包。


推荐阅读