2013-04-06 18 views
17

Czy istnieje metoda, która zwróci domyślną przeglądarkę użytkownika jako ciąg?Metoda zwracająca domyślną przeglądarkę jako ciąg?

Przykład czego szukam:

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

Dlaczego potrzebna jest domyślna przeglądarka użytkownika? Domyślam się, że Twój kod będzie działał po stronie serwera, a nie po stronie klienta, czy robisz aplikację na komputery? –

+0

Istnieje wiele powodów, dla których należy znaleźć domyślną przeglądarkę użytkownika, z której korzystam, ponieważ jest to dane statystyczne dotyczące moich klientów. Ta funkcja podpowie mi, jakich przeglądarek używają, i być może zalecę, aby mój kod zalecał inne oprogramowanie, jeśli zainstalowana jest określona przeglądarka. – syb0rg

+0

Dlaczego potrzebujesz domyślnej przeglądarki? Możesz wykonać String userAgent = request.getHeader ("User-Agent"); a następnie pobrać z niego przeglądarkę. Większość osób będzie mieć IE jako domyślną przeglądarkę i będzie używać Chrome lub Firefox. –

Odpowiedz

21

Można wykonać tę metodę za pomocą rejestrów [1] i wyrażeń regularnych aby wyodrębnić domyślną przeglądarkę jako ciąg znaków. Nie ma "czystszego" sposobu na zrobienie tego, o czym wiem.

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

Teraz, gdy wywoływana jest nazwa getDefaultBrowser(), należy zwrócić domyślną przeglądarkę dla systemu Windows.

Testowane przeglądarki:

  • Google Chrome (funkcja zwraca "Chrome")
  • Mozilla Firefox (zwraca "Firefox")
  • Opera (zwraca "Opera")

Wyjaśnienie regex (/(?=[^/]*$)(.+?)[.]):

  • /(?=[^/]*$) mecze ostatni występujący / w ciągu
  • [.] dopasowuje . w rozszerzeniu pliku
  • (.+?) oddaje ciąg pomiędzy tymi dwoma dopasowanych znaków.

Można zobaczyć, jak to jest zrobione, patrząc na wartości registry tuż przed przetestowania go przed regex (mam pogrubione, co zostało zrobione):

(Domyślna) REG_SZ " C:/Program Files (x86)/Mozilla Firefox/zapalić eXE”-osint -url "% 1"


[1] Tylko system Windows. Nie mam dostępu do komputera Mac lub Linux, ale po rozejrzeniu się po Internecie, myślę, że com.apple.LaunchServices.plist przechowuje domyślną wartość przeglądarki na Macu, a na Linuksie, myślę, że możesz wykonać polecenie xdg-settings get default-web-browser, aby uzyskać domyślną przeglądarkę. Mogę się jednak mylić, może ktoś z dostępem do nich byłby skłonny przetestować dla mnie i skomentować, jak je wdrożyć?

+2

_ "HKEY_CLASSES_ROOT \ http \ shell \ open \ command" _ nie jest aktualizowane, gdy program Internet Explorer jest ustawiony jako domyślna przeglądarka. Przynajmniej nie na moim komputerze, Windows 7. –

+0

@StevenJeuris Nieparzyste, używam tego samego systemu operacyjnego i rejestr jest aktualizowany po ustawieniu IE. – syb0rg

+0

Następująca dla mnie wartość rejestru jest dla mnie aktualizowana: _ "HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ Shell \ Associations \ UrlAssociations \ http \ UserChoice" _. Przechowuje jednak identyfikator ProgID, a nie ścieżkę. –