2013-04-06 6 views
17

Gibt es eine Methode, die den Standardbrowser eines Benutzers als Zeichenfolge zurückgibt?Methode, die den Standardbrowser als Zeichenfolge zurückgibt?

Beispiel von dem, was ich suche:

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

Warum benötigen Sie den Standardbrowser des Benutzers? Ich vermute, dass Ihr Code auf der Serverseite statt auf der Clientseite ausgeführt wird oder Sie eine Desktopanwendung erstellen? –

+0

Es gibt viele Gründe dafür, den Standardbrowser eines Benutzers zu finden, den ich für statistische Daten mit meinen Kunden verwende. Diese Funktion wird mir sagen, welche Browser sie verwenden, und vielleicht wird mein Code andere Software empfehlen, wenn sie einen bestimmten Browser installiert haben. – syb0rg

+0

Warum benötigen Sie den Standardbrowser dafür? Sie können String userAgent = request.getHeader ("User-Agent"); und dann Browser von ihm bekommen. Die meisten Leute haben IE als Standard-Browser und werden Chrome oder Firefox verwenden. –

Antwort

21

Sie können diese Methode erreichen, indem Register [1] und reguläre Ausdrücke unter Verwendung des Standard-Browsers als Zeichenfolge zu extrahieren. Es gibt keinen "saubereren" Weg, dies zu tun, von dem ich weiß. Jetzt

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"; 
} 

, wenn getDefaultBrowser() genannt wird, sollte der Standard-Browser für Windows zurückgegeben werden.

Getestete Browser:

  • Google Chrome (function returns "Chrome")
  • Mozilla Firefox (Funktion gibt "Firefox")
  • Opera (Funktion gibt "Opera")

Erklärung der Regex (/(?=[^/]*$)(.+?)[.]):

  • /(?=[^/]*$) entspricht der letzte zwischen diesen beiden angepassten Zeichen
  • [.] passt die . in der Dateierweiterung
  • (.+?) fängt die Zeichenfolge / in der Zeichenfolge auftritt.

Sie können sehen, wie dies durch einen Blick auf den Wert von registry Recht erfasst wird, bevor wir es gegen die Regex Test (I bolded haben, was gefangen wird):

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


[1] Nur Windows. Ich habe keinen Zugriff auf einen Mac oder Linux-Computer, aber wenn ich mich im Internet umschlage, denke ich, com.apple.LaunchServices.plist speichert den Standard-Browser-Wert auf einem Mac, und unter Linux kann ich den Befehl xdg-settings get default-web-browser ausführen, um den Standard-Browser zu erhalten. Da könnte ich mich aber irren, vielleicht wäre jemand, der Zugang dazu hat, bereit, mich zu testen und zu kommentieren, wie man sie implementiert?

+2

_ "HKEY_CLASSES_ROOT \ http \ shell \ open \ command" _ wird nicht aktualisiert, wenn Internet Explorer als Standardbrowser festgelegt ist. Zumindest nicht auf meinem PC, Windows 7. –

+0

@StevenJeuris Odd, ich habe das gleiche Betriebssystem und diese Registrierung wird aktualisiert, wenn IE eingestellt ist. – syb0rg

+0

Der folgende Registrierungswert wird für mich aktualisiert: _ "HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ Shell \ Associations \ UrlAssociations \ http \ UserChoice" _. Es speichert jedoch eine ProgID und keinen Pfad. –