Да, вы можете установить имя пакета приложения, которое вы хотите открыть, открыв внутренний Intent внутри CustomTabsIntent и вызвав 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 и Samsung, также поддерживают 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 для выбора пакета.