如何设置默认 Chrome 自定义选项卡不必显示“打开方式”
How to set default Chrome custom tabs didn't have to show “open with”
我已经构建了一个带有 Chrome 自定义选项卡的 Android 应用程序,但是当我单击按钮以显示 URL 时,会出现一个对话框,提示我需要选择 [=14] =] 和我所有可供选择的浏览器应用程序的列表。我的问题是如何确定该应用程序仅将 Chrome 设置为默认值并且不必再打开对话框 "open with"。
fab.setOnClickListener {
val url = "http://myurl.com/"
val builder = CustomTabsIntent.Builder()
builder.setToolbarColor(ContextCompat.getColor(this@MainActivity,R.color.colorAccent))
builder.addDefaultShareMenuItem()
val anotherCustomTab = CustomTabsIntent.Builder().build()
val intent = anotherCustomTab.intent
intent.data = Uri.parse("http://myurl.com/")
builder.setShowTitle(true)
val customTabsIntent = builder.build()
customTabsIntent.launchUrl(this@MainActivity, Uri.parse(url))
}
我找到了如何验证它,参考了 所以我得到了这个编码并工作,不再要求设置浏览器。
fab.setOnClickListener {
val PACKAGE_NAME = "com.android.chrome"
val builder = CustomTabsIntent.Builder()
builder.setToolbarColor(ContextCompat.getColor(this@MainActivity,R.color.colorAccent))
builder.addDefaultShareMenuItem()
builder.setShowTitle(true)
val anotherCustomTab = builder.build()
val intent = anotherCustomTab.intent
intent.data = Uri.parse("http://www.myurl.com/")
val packageManager = packageManager
val resolveInfoList = packageManager.queryIntentActivities(anotherCustomTab.intent, PackageManager.MATCH_DEFAULT_ONLY)
for (resolveInfo in resolveInfoList) {
val packageName = resolveInfo.activityInfo.packageName
if (TextUtils.equals(packageName, PACKAGE_NAME))
anotherCustomTab.intent.setPackage(PACKAGE_NAME)
}
anotherCustomTab.launchUrl(this, anotherCustomTab.intent.data)
}
以下代码来自here,但请记住我们应该尊重用户偏好。根据用户偏好,我的意思是,
- 如果用户有多个支持自定义选项卡但不支持的浏览器
有默认浏览器,其中一个浏览器是 Chrome 那么我们可以
在 Chrome 中打开 link。
如果用户有多个浏览器支持
自定义选项卡,并有一个默认浏览器 A 设置和该浏览器 A
有自定义选项卡支持我们应该在该浏览器中打开 link A.
如果用户有多个支持自定义选项卡但不支持的浏览器
有默认浏览器,其中一个浏览器不是 Chrome 那么我们
可以显示带有自定义选项卡的选择器对话框支持浏览器打开
link
其他用例也很少,但希望你能抓住关键点
支持CCT的浏览器(至少最新版本)
- 三星浏览器
- 火狐
- 微软边缘
不支持 CCT 的浏览器:
旧浏览器内置于旧 Android 版本和三星 Android 设备
歌剧
DuckDuckGo
public static String getPackageNameToUse(Context context) {
String packageNameToUse = null;
final PackageManager packageManager = context.getPackageManager();
final Intent activityIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
// Get all apps that can handle VIEW intents and have custom tab service
final List<ResolveInfo> resolvedActivityList = packageManager.queryIntentActivities(activityIntent, 0);
final List<String> packagesSupportingCustomTabs = new ArrayList<>();
for (final ResolveInfo info : resolvedActivityList)
{
final Intent serviceIntent = new Intent();
serviceIntent.setAction(ACTION_CUSTOM_TABS_CONNECTION);
serviceIntent.setPackage(info.activityInfo.packageName);
if (packageManager.resolveService(serviceIntent, 0) != null)
packagesSupportingCustomTabs.add(info.activityInfo.packageName);
}
// Now packagesSupportingCustomTabs contains all apps that can handle both VIEW intents
// and service calls.
if (packagesSupportingCustomTabs.size() == 1)
packageNameToUse = packagesSupportingCustomTabs.get(0);
else if (packagesSupportingCustomTabs.contains(STABLE_PACKAGE))
packageNameToUse = STABLE_PACKAGE;
return packageNameToUse;
}
我已经构建了一个带有 Chrome 自定义选项卡的 Android 应用程序,但是当我单击按钮以显示 URL 时,会出现一个对话框,提示我需要选择 [=14] =] 和我所有可供选择的浏览器应用程序的列表。我的问题是如何确定该应用程序仅将 Chrome 设置为默认值并且不必再打开对话框 "open with"。
fab.setOnClickListener {
val url = "http://myurl.com/"
val builder = CustomTabsIntent.Builder()
builder.setToolbarColor(ContextCompat.getColor(this@MainActivity,R.color.colorAccent))
builder.addDefaultShareMenuItem()
val anotherCustomTab = CustomTabsIntent.Builder().build()
val intent = anotherCustomTab.intent
intent.data = Uri.parse("http://myurl.com/")
builder.setShowTitle(true)
val customTabsIntent = builder.build()
customTabsIntent.launchUrl(this@MainActivity, Uri.parse(url))
}
我找到了如何验证它,参考了
fab.setOnClickListener {
val PACKAGE_NAME = "com.android.chrome"
val builder = CustomTabsIntent.Builder()
builder.setToolbarColor(ContextCompat.getColor(this@MainActivity,R.color.colorAccent))
builder.addDefaultShareMenuItem()
builder.setShowTitle(true)
val anotherCustomTab = builder.build()
val intent = anotherCustomTab.intent
intent.data = Uri.parse("http://www.myurl.com/")
val packageManager = packageManager
val resolveInfoList = packageManager.queryIntentActivities(anotherCustomTab.intent, PackageManager.MATCH_DEFAULT_ONLY)
for (resolveInfo in resolveInfoList) {
val packageName = resolveInfo.activityInfo.packageName
if (TextUtils.equals(packageName, PACKAGE_NAME))
anotherCustomTab.intent.setPackage(PACKAGE_NAME)
}
anotherCustomTab.launchUrl(this, anotherCustomTab.intent.data)
}
以下代码来自here,但请记住我们应该尊重用户偏好。根据用户偏好,我的意思是,
- 如果用户有多个支持自定义选项卡但不支持的浏览器 有默认浏览器,其中一个浏览器是 Chrome 那么我们可以 在 Chrome 中打开 link。
如果用户有多个浏览器支持 自定义选项卡,并有一个默认浏览器 A 设置和该浏览器 A 有自定义选项卡支持我们应该在该浏览器中打开 link A.
如果用户有多个支持自定义选项卡但不支持的浏览器 有默认浏览器,其中一个浏览器不是 Chrome 那么我们 可以显示带有自定义选项卡的选择器对话框支持浏览器打开 link
其他用例也很少,但希望你能抓住关键点
支持CCT的浏览器(至少最新版本)
- 三星浏览器
- 火狐
- 微软边缘
不支持 CCT 的浏览器:
旧浏览器内置于旧 Android 版本和三星 Android 设备
歌剧
DuckDuckGo
public static String getPackageNameToUse(Context context) { String packageNameToUse = null; final PackageManager packageManager = context.getPackageManager(); final Intent activityIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com")); // Get all apps that can handle VIEW intents and have custom tab service final List<ResolveInfo> resolvedActivityList = packageManager.queryIntentActivities(activityIntent, 0); final List<String> packagesSupportingCustomTabs = new ArrayList<>(); for (final ResolveInfo info : resolvedActivityList) { final Intent serviceIntent = new Intent(); serviceIntent.setAction(ACTION_CUSTOM_TABS_CONNECTION); serviceIntent.setPackage(info.activityInfo.packageName); if (packageManager.resolveService(serviceIntent, 0) != null) packagesSupportingCustomTabs.add(info.activityInfo.packageName); } // Now packagesSupportingCustomTabs contains all apps that can handle both VIEW intents // and service calls. if (packagesSupportingCustomTabs.size() == 1) packageNameToUse = packagesSupportingCustomTabs.get(0); else if (packagesSupportingCustomTabs.contains(STABLE_PACKAGE)) packageNameToUse = STABLE_PACKAGE; return packageNameToUse; }