Cara membuka browser web default menggunakan java


Jawaban:


162

java.awt.Desktop adalah kelas yang Anda cari.

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
apakah ini solusi lintas platform atau hanya untuk Windows? jawaban lain di utas ini menyarankan untuk menggunakan kelas Runtime untuk Linux
isapir

@lgal, ini bekerja untuk saya di Windows 7 dan Linux (Ubuntu 10.10). Itu selalu membuka browser sistem default (IE di Win7 dan Firefox di Ubuntu, dalam kasus saya)
Joaquim Oliveira

1
Ini tidak berhasil untuk saya. Metode IsDesktopSupported selalu mengembalikan false di mesin windows saya. Apa masalahnya?
krzysiek.ste

2
Jika pengguna telah menetapkan tindakan "buka dengan" khusus ke file yang diperluas seperti "html" maka ini TIDAK akan membuka browser, tetapi program yang telah dihubungkan dengan pengguna .... Ini sama sekali bukan solusi!
santo

4
@ krzysiek.ste gunakan Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)cek sebagai gantinya.
Thibstars

35

Ini kode saya. Ini akan membuka url yang diberikan di browser default (solusi lintas platform).

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' tidak dikenali sebagai perintah internal atau eksternal, program yang dapat dioperasikan atau file batch."
xehpuk

10
Itu adalah perintah unix. apa yang Anda lakukan menjalankannya di windows
Olu Smith

7
Bersama dengan 'Desktop.isDesktopSupported ()', centang juga 'Desktop.getDesktop (). IsSupported (Action.BROWSE)'.
Kanchu

35

Bagi saya solusi dengan Desktop.isDesktopSupported()tidak berfungsi ( windows 7 dan ubuntu ). Silakan coba ini untuk membuka browser dari kode java:

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

Jika Anda ingin memiliki aplikasi multiplatform, Anda perlu menambahkan pemeriksaan sistem operasi (misalnya):

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
Mengapa menggunakan StringBuffer di sini?
Stephan

2
Mendaftar semua browser di solusi Linux sangat buruk. Bagaimana jika seseorang menggunakan browser selain dari daftar? (tidak ada chrome atau chromium dalam daftar) Atau memiliki Epiphany dan Firefox, tetapi lebih suka menggunakan yang terakhir? Menggunakan xdg-openjauh lebih baik dalam hal ini. Karena itu, solusinya bisa sesederhana macOS.
m4tx

Pilihan lain untuk Windows adalah rt.exec ("start \" "+ url +" \ ");
Ivan Nikitin

6

Anda juga dapat menggunakan Runtime untuk membuat solusi lintas platform:

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

Sebagaimana dicatat dalam jawaban yang diberikan oleh Tim Cooper, java.awt.Desktoptelah menyediakan kemampuan ini sejak Java versi 6 (1.6), tetapi dengan peringatan berikut:

Gunakan metode isDesktopSupported () untuk menentukan apakah API Desktop tersedia. Di Sistem Operasi Solaris dan platform Linux, API ini bergantung pada pustaka Gnome. Jika pustaka tersebut tidak tersedia, metode ini akan mengembalikan nilai salah.

Untuk platform yang tidak mendukung atau menyediakan java.awt.Desktop, lihat proyek BrowserLauncher2 . Ini diturunkan dan agak diperbarui dari kelas BrowserLauncher yang aslinya ditulis dan dirilis oleh Eric Albert. Saya berhasil menggunakan kelas BrowserLauncher asli dalam aplikasi Java multi-platform yang berjalan secara lokal dengan antarmuka browser web pada awal tahun 2000-an.

Perhatikan bahwa BrowserLauncher2 dilisensikan di bawah GNU Lesser General Public License . Jika lisensi itu tidak dapat diterima, cari salinan BrowserLauncher asli yang memiliki lisensi sangat liberal:

Kode ini adalah Hak Cipta 1999-2001 oleh Eric Albert (ejalbert@cs.stanford.edu) dan dapat didistribusikan ulang atau diubah dalam bentuk apapun tanpa batasan selama bagian dari komentar ini dari paragraf ini hingga akhir komentar tidak dihapus . Penulis meminta agar dia diberi tahu tentang aplikasi, applet, atau biner lain yang menggunakan kode ini, tetapi itu lebih karena rasa ingin tahu daripada apa pun dan tidak diperlukan. Perangkat lunak ini tidak memiliki jaminan. Penulis tidak bertanggung jawab atas hilangnya data atau fungsionalitas atau efek buruk atau tidak terduga dari penggunaan perangkat lunak ini.

Penghargaan: Steven Spencer, majalah JavaWorld (Java Tip 66) Terima kasih juga kepada Ron B.Yeh, Eric Shapiro, Ben Engber, Paul Teitlebaum, Andrea Cantatore, Larry Barowski, Trevor Bedzek, Frank Miedrich, dan Ron Rabakukk

Proyek selain BrowserLauncher2 mungkin juga telah memperbarui BrowserLauncher asli untuk memperhitungkan perubahan di browser dan pengaturan keamanan sistem default sejak 2001.


Garpu yang dipelihara dari BrowserLauncher2 tersedia di github.com/rajing/browserlauncher2
koppor

1
Bagi mereka yang ingin menggunakan BrowserLauncher2 di Mac, baik BrowserLauncher2 asli atau garpu yang disebutkan oleh @koppor tidak berfungsi dengan Mac OS X Sierra. Keduanya mengasumsikan adanya properti sistem "mrj.version" yang tampaknya sudah tidak ada lagi. Kode tersebut akan menampilkan NullPointerException saat peluncur dibuat. Lihat sourceforge.net/p/browserlaunch2/bugs/14 untuk informasi tambahan.
Coren

4

Sangat sederhana cukup tulis kode di bawah ini:

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

atau jika Anda tidak ingin memuat URL, cukup tulis nama browser Anda ke dalam nilai string seperti,

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

itu akan membuka browser secara otomatis dengan URL kosong setelah menjalankan program


2

Harap Anda tidak keberatan, tetapi saya mengumpulkan semua hal yang bermanfaat, dari atas, dan menghasilkan kelas lengkap yang siap untuk diuji ...

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

di windows aktifkan "cmd / k start http://www.example.com " Infact Anda selalu dapat menjalankan program "default" menggunakan perintah start. Sebagai contoh, abc.mp3 akan memanggil pemutar mp3 default dan memuat file mp3 yang diminta.


Anda sudah memposting versi portabel. Saya baru saja mengusulkan solusi lain yang dapat diingat jika bukan hanya url yang perlu Anda buka dalam program default.
d-live

1

Saya menyusun kembali jawaban Brajesh Kumar di atas menjadi Clojure sebagai berikut:

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

seandainya itu berguna bagi siapa pun.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.