Come aprire il browser web predefinito usando java


Risposte:


162

java.awt.Desktop è la classe che stai cercando.

import java.awt.Desktop;
import java.net.URI;

// ...

if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
    Desktop.getDesktop().browse(new URI("http://www.example.com"));
}

3
è una soluzione multipiattaforma o solo Windows? altre risposte in questo thread suggeriscono di utilizzare la classe Runtime per Linux
isapir

@lgal, ha funzionato per me sia su Windows 7 che su Linux (Ubuntu 10.10). Apre sempre il browser di sistema predefinito (IE su Win7 e Firefox su Ubuntu, nel mio caso)
Joaquim Oliveira

1
Questo non funziona per me. Il metodo IsDesktopSupported restituisce sempre false sul mio computer Windows. Che cosa c'é?
krzysiek.ste

2
Se l'utente ha assegnato un'azione personalizzata "apri con" al file exten come "html", questo NON aprirà il browser, ma il programma con cui l'utente lo ha collegato .... Questa non è affatto una soluzione!
thesaint

4
@ krzysiek.ste usa Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)invece il segno di spunta.
Thibstars

35

Ecco il mio codice. Si aprirà l'URL specificato nel browser predefinito (soluzione multipiattaforma).

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class Browser {
    public static void main(String[] args) {
        String url = "http://www.google.com";

        if(Desktop.isDesktopSupported()){
            Desktop desktop = Desktop.getDesktop();
            try {
                desktop.browse(new URI(url));
            } catch (IOException | URISyntaxException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }else{
            Runtime runtime = Runtime.getRuntime();
            try {
                runtime.exec("xdg-open " + url);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

2
"'xdg-open' non è riconosciuto come comando interno o esterno, programma eseguibile o file batch."
xehpuk

10
Questo è un comando unix. cosa stai facendo eseguendolo in Windows
Olu Smith

7
Insieme a "Desktop.isDesktopSupported ()", seleziona anche "Desktop.getDesktop (). IsSupported (Action.BROWSE)".
Kanchu

35

Per me la soluzione con Desktop.isDesktopSupported()non funziona ( Windows 7 e Ubuntu ). Prova questo per aprire il browser dal codice java:

Finestre:

Runtime rt = Runtime.getRuntime();
String url = "http://stackoverflow.com";
rt.exec("rundll32 url.dll,FileProtocolHandler " + url);

Mac

Runtime rt = Runtime.getRuntime();
String url = "http://stackoverflow.com";
rt.exec("open " + url);

Linux:

Runtime rt = Runtime.getRuntime();
String url = "http://stackoverflow.com";
String[] browsers = { "epiphany", "firefox", "mozilla", "konqueror",
                                 "netscape", "opera", "links", "lynx" };

StringBuffer cmd = new StringBuffer();
for (int i = 0; i < browsers.length; i++)
    if(i == 0)
        cmd.append(String.format(    "%s \"%s\"", browsers[i], url));
    else
        cmd.append(String.format(" || %s \"%s\"", browsers[i], url)); 
    // If the first didn't work, try the next browser and so on

rt.exec(new String[] { "sh", "-c", cmd.toString() });

Se vuoi avere un'applicazione multipiattaforma, devi aggiungere il controllo del sistema operativo (ad esempio):

String os = System.getProperty("os.name").toLowerCase();

Finestre:

os.indexOf("win") >= 0

Mac:

os.indexOf("mac") >= 0

Linux:

os.indexOf("nix") >=0 || os.indexOf("nux") >=0

1
Perché usare StringBuffer qui?
Stephan

2
Elencare tutti i browser nella soluzione Linux è pessimo. Cosa succede se si utilizza un browser diverso da qualsiasi nell'elenco? (non c'è né cromo né cromo nell'elenco) O ha sia Epiphany che Firefox, ma preferisce usare quest'ultimo? L'utilizzo xdg-openè molto meglio in questo caso. La soluzione potrebbe essere quindi semplice come quella di macOS.
m4tx

Un'altra opzione per Windows è rt.exec ("start \" "+ url +" \ ");
Ivan Nikitin

6

È inoltre possibile utilizzare il runtime per creare una soluzione multipiattaforma:

import java.awt.Desktop;
import java.net.URI;

public class App {

    public static void main(String[] args) throws Exception {
        String url = "http://stackoverflow.com";

        if (Desktop.isDesktopSupported()) {
            // Windows
            Desktop.getDesktop().browse(new URI(url));
        } else {
            // Ubuntu
            Runtime runtime = Runtime.getRuntime();
            runtime.exec("/usr/bin/firefox -new-window " + url);
        }
    }
}

5

Come notato nella risposta fornita da Tim Cooper, java.awt.Desktopha fornito questa funzionalità dalla versione Java 6 (1.6), ma con il seguente avvertimento:

Utilizza il metodo isDesktopSupported () per determinare se l'API desktop è disponibile. Sul sistema operativo Solaris e sulla piattaforma Linux, questa API dipende dalle librerie Gnome. Se queste librerie non sono disponibili, questo metodo restituirà false.

Per le piattaforme che non supportano o forniscono java.awt.Desktop, guarda nel progetto BrowserLauncher2 . È derivato e in qualche modo aggiornato dalla classe BrowserLauncher originariamente scritta e rilasciata da Eric Albert. Ho usato con successo la classe BrowserLauncher originale in un'applicazione Java multipiattaforma che veniva eseguita localmente con un'interfaccia browser web nei primi anni 2000.

Tieni presente che BrowserLauncher2 è concesso in licenza con GNU Lesser General Public License . Se quella licenza è inaccettabile, cerca una copia del BrowserLauncher originale che ha una licenza molto liberale:

Questo codice è protetto da Copyright 1999-2001 di Eric Albert (ejalbert@cs.stanford.edu) e può essere ridistribuito o modificato in qualsiasi forma senza restrizioni purché la parte di questo commento da questo paragrafo fino alla fine del commento non venga rimossa . L'autore richiede di essere informato di qualsiasi applicazione, applet o altro binario che fa uso di questo codice, ma è più per curiosità che per altro e non è richiesto. Questo software non include alcuna garanzia. L'autore non è responsabile per qualsiasi perdita di dati o funzionalità o per qualsiasi effetto negativo o imprevisto derivante dall'utilizzo di questo software.

Crediti: Steven Spencer, JavaWorld magazine (Java Tip 66) Grazie anche a Ron B. Yeh, Eric Shapiro, Ben Engber, Paul Teitlebaum, Andrea Cantatore, Larry Barowski, Trevor Bedzek, Frank Miedrich e Ron Rabakukk

Progetti diversi da BrowserLauncher2 potrebbero anche aver aggiornato il BrowserLauncher originale per tenere conto delle modifiche nel browser e delle impostazioni di sicurezza del sistema predefinite dal 2001.


Il fork mantenuto di BrowserLauncher2 è disponibile su github.com/rajing/browserlauncher2
koppor

1
Per coloro che desiderano utilizzare BrowserLauncher2 su Mac, né il BrowserLauncher2 originale né il fork menzionato da @koppor funzionano con Mac OS X Sierra. Entrambi presumono l'esistenza di una proprietà di sistema "mrj.version" che apparentemente non esiste più. Il codice genererà un'eccezione NullPointerException quando viene creato il programma di avvio. Vedere sourceforge.net/p/browserlaunch2/bugs/14 per ulteriori informazioni.
Coren

4

È molto semplice basta scrivere sotto il codice:

String s = "http://www.google.com";
Desktop desktop = Desktop.getDesktop();
desktop.browse(URI.create(s));

o se non vuoi caricare l'URL, scrivi il nome del tuo browser in valori di stringa come,

String s = "chrome";
Desktop desktop = Desktop.getDesktop();
desktop.browse(URI.create(s));

aprirà automaticamente il browser con un URL vuoto dopo aver eseguito un programma


2

Spero non ti dispiaccia, ma ho messo insieme tutte le cose utili, dall'alto, e ho creato una lezione completa pronta per i test ...

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class MultiBrowPop {

    public static void main(String[] args) {
        OUT("\nWelcome to Multi Brow Pop.\nThis aims to popup a browsers in multiple operating systems.\nGood luck!\n");

        String url = "http://www.birdfolk.co.uk/cricmob";
        OUT("We're going to this page: "+ url);

        String myOS = System.getProperty("os.name").toLowerCase();
        OUT("(Your operating system is: "+ myOS +")\n");

        try {
            if(Desktop.isDesktopSupported()) { // Probably Windows
                OUT(" -- Going with Desktop.browse ...");
                Desktop desktop = Desktop.getDesktop();
                desktop.browse(new URI(url));
            } else { // Definitely Non-windows
                Runtime runtime = Runtime.getRuntime();
                if(myOS.contains("mac")) { // Apples
                    OUT(" -- Going on Apple with 'open'...");
                    runtime.exec("open " + url);
                } 
                else if(myOS.contains("nix") || myOS.contains("nux")) { // Linux flavours 
                    OUT(" -- Going on Linux with 'xdg-open'...");
                    runtime.exec("xdg-open " + url);
                }
                else 
                    OUT("I was unable/unwilling to launch a browser in your OS :( #SadFace");
            }
            OUT("\nThings have finished.\nI hope you're OK.");
        }
        catch(IOException | URISyntaxException eek) {
            OUT("**Stuff wrongly: "+ eek.getMessage());
        }
    }

    private static void OUT(String str) {
        System.out.println(str);
    }
}

1

su Windows invoca "cmd / k start http://www.example.com " Infatti puoi sempre invocare programmi "predefiniti" usando il comando start. Ad esempio, start abc.mp3 richiamerà il lettore mp3 predefinito e caricherà il file mp3 richiesto.


Hai già pubblicato la versione portatile. Ho appena proposto un'altra soluzione che potrebbe essere tenuta a mente se non sono solo gli URL che devi aprire nei programmi predefiniti.
d-live

1

I rifusione Brajesh Kumar risposta 's sopra in Clojure come segue:

(defn open-browser 
  "Open a new browser (window or tab) viewing the document at this `uri`."
  [uri]
  (if (java.awt.Desktop/isDesktopSupported)
    (let [desktop (java.awt.Desktop/getDesktop)]
      (.browse desktop (java.net.URI. uri)))
    (let [rt (java.lang.Runtime/getRuntime)]
      (.exec rt (str "xdg-open " uri)))))

nel caso sia utile a chiunque.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.