【问题标题】:Method returning default browser as a String?方法将默认浏览器作为字符串返回?
【发布时间】:2023-03-25 16:32:01
【问题描述】:

有没有一种方法可以将用户的默认浏览器作为字符串返回?

我正在寻找的示例:

System.out.println(getDefaultBrowser()); // prints "Chrome"

【问题讨论】:

  • 为什么需要用户默认浏览器?我猜您的代码将在服务器端而不是客户端运行,或者您正在制作桌面应用程序?
  • 有很多原因需要找到用户的默认浏览器,我使用它的原因是我的客户的统计数据。这个功能会告诉我他们使用什么浏览器,如果他们安装了某个浏览器,我可能会让我的代码推荐不同的软件。
  • 为什么需要默认浏览器?你可以做 String userAgent = request.getHeader("User-Agent");然后从中获取浏览器。大多数人会将 IE 作为默认浏览器并使用 Chrome 或 Firefox。
  • 我不确定你知道你在说什么了。如果他们使用的是 Chrome 或 Firefox,那么他们可能已将其设置为默认浏览器。此外,您的建议根本不考虑离线使用,并且您在实现代码时始终必须考虑所有不同的使用场景。我的回答确实考虑了离线使用,因为您不能总是指望客户端连接到互联网。

标签: java string browser default


【解决方案1】:

您可以通过使用注册表[1] 和正则表达式将默认浏览器提取为字符串来完成此方法。据我所知,没有一种“更清洁”的方法可以做到这一点。

public static String getDefaultBrowser()
{
    try
    {
        // Get registry where we find the default browser
        Process process = Runtime.getRuntime().exec("REG QUERY HKEY_CLASSES_ROOT\\http\\shell\\open\\command");
        Scanner kb = new Scanner(process.getInputStream());
        while (kb.hasNextLine())
        {
            // Get output from the terminal, and replace all '\' with '/' (makes regex a bit more manageable)
            String registry = (kb.nextLine()).replaceAll("\\\\", "/").trim();

            // Extract the default browser
            Matcher matcher = Pattern.compile("/(?=[^/]*$)(.+?)[.]").matcher(registry);
            if (matcher.find())
            {
                // Scanner is no longer needed if match is found, so close it
                kb.close();
                String defaultBrowser = matcher.group(1);

                // Capitalize first letter and return String
                defaultBrowser = defaultBrowser.substring(0, 1).toUpperCase() + defaultBrowser.substring(1, defaultBrowser.length());
                return defaultBrowser;
            }
        }
        // Match wasn't found, still need to close Scanner
        kb.close();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
    // Have to return something if everything fails
    return "Error: Unable to get default browser";
}

现在,无论何时调用 getDefaultBrowser(),都应返回 Windows 的默认浏览器。

经过测试的浏览器:

  • Google Chrome(函数返回“Chrome”)
  • Mozilla Firefox(函数返回“Firefox”)
  • Opera(函数返回“Opera”)

正则表达式的解释(/(?=[^/]*$)(.+?)[.]):

  • /(?=[^/]*$) 匹配字符串中最后出现的/
  • [.] 匹配文件扩展名中的.
  • (.+?) 捕获这两个匹配字符之间的字符串。

在我们针对正则表达式进行测试之前,您可以通过查看 registry 的值来了解它是如何捕获的(我已将捕获的内容加粗):

(默认)REG_SZ "C:/Program Files (x86)/Mozilla Firefox/firefox.exe" -osint -url "%1"


[1] 仅限 Windows。我无法访问 Mac 或 Linux 计算机,但是通过浏览 Internet,我认为 com.apple.LaunchServices.plist 将默认浏览器值存储在 Mac 上,而在 Linux 上我认为您可以执行命令 xdg-settings get default-web-browser 来获取默认浏览器。不过,我可能是错的,也许可以访问这些内容的人愿意为我测试并评论如何实施它们?

【讨论】:

  • 当 Internet Explorer 设置为默认浏览器时,"HKEY_CLASSES_ROOT\http\shell\open\command" 不会更新。至少在我的电脑 Windows 7 上没有。
  • @StevenJeuris 奇怪,我正在运行相同的操作系统,并且在设置 IE 时更新注册表。
  • 以下注册表值已为我更新:"HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice"。但是,它存储的是 ProgID 而不是路径。
  • 最有趣的事情发生在我身上。在编写打开密钥的代码时,我从自己的注释中复制粘贴了上述路径,但它不起作用。 StackOverflow 引入了字符 0x200c 和 0x200b 来强制将整个路径分成两行。因此,当您将其复制粘贴到源代码时,请注意!
  • Here is my working C# implementation 使用似乎应该从 Windows Vista 开始使用的更新密钥。
猜你喜欢
  • 2019-12-05
  • 1970-01-01
  • 2017-07-18
  • 2021-12-12
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多