Jak otworzyć domyślną przeglądarkę internetową przy użyciu java


Odpowiedzi:


162

java.awt.Desktop to klasa, której szukasz.

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
czy to rozwiązanie wieloplatformowe czy tylko Windows? inne odpowiedzi w tym wątku sugerują użycie klasy Runtime dla Linuksa
isapir

@lgal, działało dla mnie zarówno na Windows 7, jak i na Linuksie (Ubuntu 10.10). Zawsze otwiera domyślną przeglądarkę systemową (IE na Win7 i Firefox na Ubuntu, w moim przypadku)
Joaquim Oliveira

1
To nie działa dla mnie. Metoda IsDesktopSupported zawsze zwraca wartość false na moim komputerze z systemem Windows. O co chodzi?
krzysiek.ste

2
Jeśli użytkownik przypisał niestandardową akcję „otwórz za pomocą” do rozszerzenia pliku, np. „Html”, NIE spowoduje to otwarcia przeglądarki, ale program, z którym użytkownik ją połączył… To nie jest w ogóle rozwiązanie!
świętego

4
@ krzysiek.ste Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)zamiast tego użyj czeku.
Thibstars

35

Oto mój kod. Otworzy się podany adres URL w domyślnej przeglądarce (rozwiązanie wieloplatformowe).

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' nie jest rozpoznawane jako polecenie wewnętrzne lub zewnętrzne, program operacyjny lub plik wsadowy.”
xehpuk

10
To polecenie unixowe. co robisz, uruchamiając to w
systemie

7
Oprócz „Desktop.isDesktopSupported ()” zaznacz także „Desktop.getDesktop (). IsSupported (Action.BROWSE)”.
Kanchu

35

Dla mnie rozwiązanie z Desktop.isDesktopSupported()nie działa ( Windows 7 i Ubuntu ). Spróbuj tego, aby otworzyć przeglądarkę z kodu java:

Okna:

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

Prochowiec

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

Jeśli chcesz mieć aplikację wieloplatformową, musisz dodać sprawdzanie systemu operacyjnego (na przykład):

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

Okna:

os.indexOf("win") >= 0

Prochowiec:

os.indexOf("mac") >= 0

Linux:

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

1
Dlaczego warto używać tutaj StringBuffer?
Stephan

2
Wymienienie wszystkich przeglądarek w rozwiązaniu Linux jest bardzo złe. Co się stanie, jeśli ktoś użyje innej przeglądarki niż ta z listy? (na liście nie ma chromu ani chromu) A może ma zarówno Epiphany, jak i Firefox, ale woli używać tego drugiego? xdg-openW tym przypadku użycie jest znacznie lepsze. Rozwiązanie mogłoby być zatem tak proste, jak rozwiązanie macOS.
m4tx

Inną opcją dla systemu Windows jest rt.exec ("start \" "+ url +" \ ");
Ivan Nikitin

6

Możesz również użyć środowiska uruchomieniowego, aby utworzyć rozwiązanie wieloplatformowe:

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

Jak wspomniano w odpowiedzi udzielonej przez Tima Coopera, java.awt.Desktopudostępnił tę możliwość od wersji Java 6 (1.6), ale z następującym zastrzeżeniem:

Użyj metody isDesktopSupported (), aby określić, czy interfejs Desktop API jest dostępny. W systemie operacyjnym Solaris i platformie Linux to API jest zależne od bibliotek Gnome. Jeśli te biblioteki są niedostępne, ta metoda zwróci wartość false.

W przypadku platform, które nie obsługują lub nie zapewniają java.awt.Desktop, zajrzyj do projektu BrowserLauncher2 . Jest pochodną i nieco zaktualizowaną z klasy BrowserLauncher pierwotnie napisanej i wydanej przez Erica Alberta. Użyłem oryginalnej klasy BrowserLauncher z powodzeniem w wieloplatformowej aplikacji Java, która działała lokalnie z interfejsem przeglądarki internetowej na początku XXI wieku.

Należy pamiętać, że BrowserLauncher2 jest objęty licencją na podstawie licencji GNU Lesser General Public License . Jeśli ta licencja jest nie do przyjęcia, poszukaj kopii oryginalnego BrowserLaunchera, który ma bardzo liberalną licencję:

Ten kod jest chroniony prawami autorskimi 1999-2001 Erica Alberta (ejalbert@cs.stanford.edu) i może być rozpowszechniany lub modyfikowany w dowolnej formie bez ograniczeń, o ile część tego komentarza od tego akapitu do końca komentarza nie zostanie usunięta . Autor prosi, aby był powiadamiany o każdej aplikacji, aplecie lub innym pliku binarnym, który korzysta z tego kodu, ale jest to bardziej z ciekawości niż cokolwiek innego i nie jest wymagane. To oprogramowanie nie obejmuje gwarancji. Autor nie ponosi odpowiedzialności za jakąkolwiek utratę danych lub funkcjonalności lub jakiekolwiek niepożądane lub nieoczekiwane skutki korzystania z tego oprogramowania.

Napisy: Steven Spencer, magazyn JavaWorld (Java Tip 66) Podziękowania dla: Ron B. Yeh, Eric Shapiro, Ben Engber, Paul Teitlebaum, Andrea Cantatore, Larry Barowski, Trevor Bedzek, Frank Miedrich i Ron Rabakukk

Projekty inne niż BrowserLauncher2 mogły również zaktualizować oryginalny BrowserLauncher, aby uwzględnić zmiany w przeglądarce i domyślnych ustawieniach zabezpieczeń systemu od 2001 roku.


Utrzymane rozwidlenie BrowserLauncher2 jest dostępne pod adresem github.com/rajing/browserlauncher2
koppor

1
Dla tych, którzy chcą używać BrowserLauncher2 na komputerach Mac, ani oryginalny BrowserLauncher2, ani widelec wspomniany przez @koppor nie działają z systemem Mac OS X Sierra. Obydwa zakładają istnienie właściwości systemowej „mrj.version”, która najwyraźniej już nie istnieje. Kod zgłosi wyjątek NullPointerException podczas konstruowania programu uruchamiającego. Dodatkowe informacje można znaleźć na stronie sourceforge.net/p/browserlaunch2/bugs/14 .
Coren

4

To bardzo proste, wystarczy napisać poniższy kod:

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

lub jeśli nie chcesz ładować adresu URL, po prostu wpisz nazwę przeglądarki w wartości ciągów, takie jak,

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

automatycznie otworzy przeglądarkę z pustym adresem URL po wykonaniu programu


2

Mam nadzieję, że nie masz nic przeciwko, ale zebrałem wszystkie pomocne rzeczy z góry i wymyśliłem kompletną klasę gotową do testów ...

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

w systemie Windows wywołaj „cmd / k start http://www.example.com ” W rzeczywistości zawsze możesz wywołać „domyślne” programy za pomocą polecenia start. Na przykład abc.mp3 wywoła domyślny odtwarzacz mp3 i załaduje żądany plik mp3.


Opublikowałeś już wersję przenośną. Właśnie zaproponowałem inne rozwiązanie, o którym można by pamiętać, jeśli nie chodzi tylko o adresy URL, które musisz otworzyć w domyślnych programach.
d-live

1

Przekształcam powyższą odpowiedź Brajesh Kumar na Clojure w następujący sposób:

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

na wypadek, gdyby przydała się komukolwiek.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.