So öffnen Sie den Standard-Webbrowser mit Java


Antworten:


161

java.awt.Desktop ist die Klasse, die Sie suchen.

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
Ist dies eine plattformübergreifende Lösung oder nur Windows? Andere Antworten in diesem Thread schlagen vor, die Runtime-Klasse für Linux zu verwenden
Isapir

@lgal, es hat bei mir sowohl unter Windows 7 als auch unter Linux (Ubuntu 10.10) funktioniert. Es öffnet immer den Standard-Systembrowser (IE unter Win7 und Firefox unter Ubuntu, in meinem Fall)
Joaquim Oliveira

1
Das funktioniert bei mir nicht. Die IsDesktopSupported-Methode gibt auf meinem Windows-Computer immer false zurück. Was ist los?
krzysiek.ste

2
Wenn der Benutzer der Datei Exten wie "html" eine benutzerdefinierte Aktion "Öffnen mit" zugewiesen hat, wird der Browser NICHT geöffnet, sondern das Programm, mit dem der Benutzer ihn verknüpft hat. Dies ist überhaupt keine Lösung!
Heilige

4
@ krzysiek.ste benutze Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)stattdessen den Scheck.
Thibstars

35

Hier ist mein Code. Die angegebene URL wird im Standardbrowser (plattformübergreifende Lösung) geöffnet.

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' wird nicht als interner oder externer Befehl, bedienbares Programm oder Batchdatei erkannt."
Xehpuk

10
Das ist ein Unix-Befehl. Was machst du damit in Windows
Olu Smith

7
Aktivieren Sie neben 'Desktop.isDesktopSupported ()' auch 'Desktop.getDesktop (). IsSupported (Action.BROWSE)'.
Kanchu

35

Für mich Desktop.isDesktopSupported()funktioniert die Lösung mit nicht ( Windows 7 und Ubuntu ). Bitte versuchen Sie dies, um den Browser über Java-Code zu öffnen:

Windows:

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() });

Wenn Sie eine Multiplattform-Anwendung wünschen, müssen Sie die Betriebssystemprüfung hinzufügen (zum Beispiel):

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

Windows:

os.indexOf("win") >= 0

Mac:

os.indexOf("mac") >= 0

Linux:

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

1
Warum hier StringBuffer verwenden?
Stephan

2
Das Auflisten aller Browser in der Linux-Lösung ist sehr schlecht. Was ist, wenn man einen anderen Browser als einen aus der Liste verwendet? (Es gibt weder Chrom noch Chrom auf der Liste.) Oder hat sowohl Epiphany als auch Firefox, bevorzugt aber Letzteres? Die Verwendung xdg-openist in diesem Fall viel besser. Die Lösung könnte daher so einfach sein wie die von macOS.
m4tx

Eine andere Option für Windows ist rt.exec ("start" + url + ");
Ivan Nikitin

6

Sie können die Laufzeit auch verwenden , um eine plattformübergreifende Lösung zu erstellen:

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

Wie in der Antwort von Tim Cooper erwähnt, java.awt.Desktopbietet diese Funktion seit Java Version 6 (1.6), jedoch mit der folgenden Einschränkung:

Verwenden Sie die Methode isDesktopSupported (), um festzustellen, ob die Desktop-API verfügbar ist. Unter dem Solaris-Betriebssystem und der Linux-Plattform ist diese API von Gnome-Bibliotheken abhängig. Wenn diese Bibliotheken nicht verfügbar sind, gibt diese Methode false zurück.

Informationen zu Plattformen, die nicht unterstützt oder bereitgestellt werden, finden Siejava.awt.Desktop im BrowserLauncher2- Projekt. Es ist vom BrowserLauncher abgeleitet und etwas aktualisiert Klasse, die ursprünglich von Eric Albert geschrieben und veröffentlicht wurde. Ich habe die ursprüngliche BrowserLauncher-Klasse erfolgreich in einer plattformübergreifenden Java-Anwendung verwendet, die Anfang der 2000er Jahre lokal mit einer Webbrowser-Oberfläche ausgeführt wurde.

Beachten Sie, dass BrowserLauncher2 unter der GNU Lesser General Public License lizenziert ist . Wenn diese Lizenz nicht akzeptabel ist, suchen Sie nach einer Kopie des ursprünglichen BrowserLauncher mit einer sehr liberalen Lizenz:

Dieser Code unterliegt dem Copyright 1999-2001 von Eric Albert (ejalbert@cs.stanford.edu) und kann ohne Einschränkung in irgendeiner Form weitergegeben oder geändert werden, solange der Teil dieses Kommentars von diesem Absatz bis zum Ende des Kommentars nicht entfernt wird . Der Autor fordert, dass er über jede Anwendung, jedes Applet oder jede andere Binärdatei informiert wird, die diesen Code verwendet. Dies ist jedoch mehr aus Neugier als alles andere und nicht erforderlich. Diese Software beinhaltet keine Garantie. Der Autor ist nicht verantwortlich für Daten- oder Funktionsverlust oder nachteilige oder unerwartete Auswirkungen der Verwendung dieser Software.

Credits: Steven Spencer, JavaWorld-Magazin (Java-Tipp 66) Dank auch an Ron B. Yeh, Eric Shapiro, Ben Engber, Paul Teitlebaum, Andrea Cantatore, Larry Barowski, Trevor Bedzek, Frank Miedrich und Ron Rabakukk

Andere Projekte als BrowserLauncher2 haben möglicherweise auch den ursprünglichen BrowserLauncher aktualisiert, um Änderungen in den Browser- und Standardsystem-Sicherheitseinstellungen seit 2001 zu berücksichtigen.


Die gewartete Gabel von BrowserLauncher2 ist verfügbar unter github.com/rajing/browserlauncher2
koppor

1
Für diejenigen, die BrowserLauncher2 auf Macs verwenden möchten, funktionieren weder der ursprüngliche BrowserLauncher2 noch die von @koppor erwähnte Gabel mit Mac OS X Sierra. Beide setzen die Existenz einer Systemeigenschaft "mrj.version" voraus, die anscheinend nicht mehr existiert. Der Code löst eine NullPointerException aus, wenn der Launcher erstellt wird. Weitere Informationen finden Sie unter sourceforge.net/p/browserlaunch2/bugs/14 .
Coren

4

Es ist sehr einfach, schreiben Sie einfach den folgenden Code:

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

oder wenn Sie keine URL laden möchten, schreiben Sie einfach Ihren Browsernamen in Zeichenfolgenwerte wie:

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

Nach dem Ausführen eines Programms wird der Browser automatisch mit leerer URL geöffnet


1

Unter Windows rufen Sie "cmd / k start http://www.example.com " auf. Tatsächlich können Sie mit dem Befehl "start" jederzeit "Standard" -Programme aufrufen. Zum Beispiel startet abc.mp3 den Standard-MP3-Player und lädt die angeforderte MP3-Datei.


Sie haben die tragbare Version bereits veröffentlicht. Ich habe gerade eine andere Lösung vorgeschlagen , die berücksichtigt werden könnte, wenn es sich nicht nur um die URLs handelt, die Sie in Standardprogrammen öffnen müssen.
D-Live

1

Ich hoffe, es macht Ihnen nichts aus, aber ich habe all die hilfreichen Dinge von oben zusammengeschustert und mir eine komplette Klasse ausgedacht, die zum Testen bereit ist ...

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

Ich habe die Antwort von Brajesh Kumar oben in Clojure wie folgt umformuliert :

(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)))))

für den Fall, dass es für irgendjemanden nützlich ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.