2013-04-06 18 views
17

Esiste un metodo che restituirà il browser predefinito di un utente come stringa?Metodo che restituisce il browser predefinito come stringa?

esempio di quello che sto cercando:

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

Perché è necessario il browser predefinito degli utenti? Sto indovinando che il codice verrà eseguito sul lato server anziché sul lato client o si sta creando un'app desktop? –

+0

Ci sono molte ragioni per cui è necessario trovare il browser predefinito di un utente, quello per cui lo sto usando sono dati statistici con i miei clienti. Questa funzione mi dirà quali browser usano, e forse avrò il mio codice consigliare software diversi se hanno installato un determinato browser. – syb0rg

+0

Perché hai bisogno di un browser predefinito per questo? È possibile eseguire string userAgent = request.getHeader ("User-Agent"); e quindi ottenere il browser da esso. La maggior parte delle persone avrà IE come browser predefinito e utilizzerà Chrome o Firefox. –

risposta

21

è possibile eseguire questa metodo utilizzando registri [1] e le espressioni regolari per estrarre il browser predefinito come una stringa. Non c'è un modo "pulito" per fare ciò che io conosca.

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

Ora ogni volta getDefaultBrowser() si chiama, deve essere restituito il browser predefinito per Windows.

browser testati:

  • Google Chrome (funzione ritorna "Chrome")
  • Mozilla Firefox (restituisce "Firefox")
  • Opera (restituisce "Opera")

Spiegazione della regex (/(?=[^/]*$)(.+?)[.]):

  • /(?=[^/]*$) corrisponde l'ultimo che si verificano / nella stringa
  • [.] corrisponde al . nel file di estensione
  • (.+?) cattura la stringa tra questi due personaggi abbinati.

Si può vedere come questo viene catturato guardando il valore della registry destra prima ci prova contro l'espressione regolare (che ho in grassetto ciò che viene catturato):

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


[1] solo Windows. Non ho accesso a un computer Mac o Linux, ma guardando da Internet, penso che lo com.apple.LaunchServices.plist memorizzi il valore predefinito del browser su un Mac e su Linux, penso che sia possibile eseguire il comando xdg-settings get default-web-browser per ottenere il browser predefinito. Potrei sbagliarmi comunque, forse qualcuno con accesso a quelli sarebbe disposto a testare per me e commentare come implementarli?

+2

_ "HKEY_CLASSES_ROOT \ http \ shell \ open \ command" _ non viene aggiornato quando Internet Explorer è impostato come browser predefinito. Almeno non sul mio PC, Windows 7. –

+0

@StevenJeuris Odd, sto facendo funzionare lo stesso OS e quel registro è aggiornato quando IE è impostato. – syb0rg

+0

Il valore di follwing del registro viene aggiornato per me: _ "HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ Shell \ Associations \ UrlAssociations \ http \ UserChoice" _. Tuttavia, memorizza un ProgID e non un percorso. –

Problemi correlati