1

我已经使用 Chrome 自定义选项卡构建了一个 Android 应用程序,但是当我单击按钮以显示 URL 时,会出现一个对话框,说我需要选择“打开方式”并列出所有可供选择的浏览器应用程序。我的问题是如何确定该应用程序仅将 Chrome 设置为默认值,而不必再打开“打开方式”对话框。

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))
}
4

2 回答 2

7

我找到了如何验证它,引用了这个,所以我得到了这个编码和工作,不再要求设置浏览器。

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)
    }
于 2019-03-06T00:46:39.943 回答
1

以下代码来自这里,但请记住我们应该尊重用户偏好。通过用户偏好,我的意思是,

  1. 如果用户有多个支持自定义选项卡的浏览器并且没有默认浏览器并且其中一个浏览器是 Chrome,那么我们可以在 Chrome 中打开链接。
  2. 如果用户有多个支持自定义选项卡的浏览器并设置了一个默认浏览器 A,并且该浏览器 A 具有自定义选项卡支持,我们应该在该浏览器 A 中打开链接。

  3. 如果用户有多个支持自定义选项卡的浏览器并且没有默认浏览器并且其中一个浏览器不是 Chrome,那么我们可以显示带有自定义选项卡支持浏览器的选择器对话框以打开链接

其他用例也很少,但希望你能抓住这个问题的症结所在

支持 CCT 的浏览器(至少最新版本)

  1. 三星浏览器
  2. 火狐
  3. 微软边缘

不支持 CCT 的浏览器:

  1. 旧版浏览器内置于旧版 Android 和三星 Android 设备

  2. 歌剧

  3. 鸭鸭围棋

    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;
      }
    
于 2019-03-28T23:24:26.367 回答