Cách mở trình duyệt web mặc định bằng java


Câu trả lời:


161

java.awt.Desktop là lớp học mà bạn đang tìm kiếm.

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
đây là giải pháp đa nền tảng hay chỉ dành cho Windows? các câu trả lời khác trong chủ đề này đề xuất sử dụng lớp Runtime cho Linux
isapir

@lgal, nó hoạt động với tôi trên cả Windows 7 và Linux (Ubuntu 10.10). Nó luôn mở trình duyệt hệ thống mặc định (IE trên Win7 và Firefox trên Ubuntu, trong trường hợp của tôi)
Joaquim Oliveira

1
Điều này không hiệu quả với tôi. Phương thức IsDesktopSupported luôn trả về false trên máy windows của tôi. Có chuyện gì vậy?
krzysiek.ste

2
Nếu người dùng đã chỉ định hành động tùy chỉnh "mở bằng" cho tệp xuất hiện như "html" thì hành động này sẽ KHÔNG mở trình duyệt, nhưng chương trình mà người dùng đã liên kết với .... Đây không phải là một giải pháp!
thesaint

4
@ krzysiek.ste sử dụng Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)séc để thay thế.
Thibstars

35

Đây là mã của tôi. Nó sẽ mở url nhất định trong trình duyệt mặc định (giải pháp đa nền tảng).

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' không được nhận dạng là lệnh nội bộ hoặc lệnh bên ngoài, chương trình có thể hoạt động hoặc tệp hàng loạt."
xehpuk

10
Đó là một lệnh unix. bạn đang làm gì chạy nó trong cửa sổ
Olu Smith

7
Cùng với 'Desktop.isDesktopSupported ()' cũng kiểm tra 'Desktop.getDesktop (). IsSupported (Action.BROWSE)'.
Kanchu

35

Đối với tôi, giải pháp với Desktop.isDesktopSupported()không hoạt động ( windows 7ubuntu ). Vui lòng thử cách này để mở trình duyệt từ mã java:

Các cửa sổ:

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

Nếu bạn muốn có ứng dụng đa nền, bạn cần thêm kiểm tra hệ thống hoạt động (ví dụ):

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

Các cửa sổ:

os.indexOf("win") >= 0

Mac:

os.indexOf("mac") >= 0

Linux:

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

1
Tại sao sử dụng StringBuffer ở đây?
Stephan

2
Liệt kê tất cả các trình duyệt trong giải pháp Linux là rất tệ. Điều gì sẽ xảy ra nếu một người sử dụng trình duyệt khác với bất kỳ trình duyệt nào trong danh sách? (không có chrome cũng như chromium trong danh sách) Hoặc có cả Epiphany và Firefox, nhưng thích sử dụng cái sau hơn? Sử dụng xdg-opentốt hơn nhiều trong trường hợp này. Do đó, giải pháp có thể đơn giản như macOS.
m4tx

Một tùy chọn khác cho Windows là rt.exec ("start \" "+ url +" \ ");
Ivan Nikitin

6

Bạn cũng có thể sử dụng Runtime để tạo giải pháp nền tảng chéo:

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

Như đã lưu ý trong câu trả lời do Tim Cooper java.awt.Desktopcung cấp , đã cung cấp khả năng này kể từ phiên bản Java 6 (1.6), nhưng với cảnh báo sau:

Sử dụng phương thức isDesktopSupported () để xác định xem Desktop API có khả dụng hay không. Trên Hệ điều hành Solaris và nền tảng Linux, API này phụ thuộc vào các thư viện Gnome. Nếu các thư viện đó không khả dụng, phương thức này sẽ trả về false.

Đối với các nền tảng không hỗ trợ hoặc cung cấp java.awt.Desktop, hãy xem xét dự án BrowserLauncher2 . Nó có nguồn gốc và phần nào được cập nhật từ lớp BrowserLauncher do Eric Albert viết và phát hành ban đầu. Tôi đã sử dụng thành công lớp BrowserLauncher gốc trong một ứng dụng Java đa nền tảng chạy cục bộ với giao diện trình duyệt web vào đầu những năm 2000.

Lưu ý rằng BrowserLauncher2 được cấp phép theo Giấy phép Công cộng Nhỏ hơn GNU . Nếu giấy phép đó không được chấp nhận, hãy tìm bản sao của BrowserLauncher gốc có giấy phép rất tự do:

Mã này là Bản quyền 1999-2001 của Eric Albert (ejalbert@cs.stanford.edu) và có thể được phân phối lại hoặc sửa đổi dưới bất kỳ hình thức nào mà không có giới hạn miễn là phần nhận xét này từ đoạn này đến cuối nhận xét không bị xóa . Tác giả yêu cầu anh ta được thông báo về bất kỳ ứng dụng, applet hoặc tệp nhị phân nào khác sử dụng mã này, nhưng điều đó vì tò mò hơn bất cứ điều gì và không bắt buộc. Phần mềm này không bao gồm bảo hành. Tác giả không chịu trách nhiệm về bất kỳ mất mát dữ liệu hoặc chức năng nào hoặc bất kỳ ảnh hưởng xấu hoặc không mong muốn nào của việc sử dụng phần mềm này.

Tín dụng: Steven Spencer, tạp chí JavaWorld (Java Mẹo 66) Cũng xin cảm ơn Ron B. Yeh, Eric Shapiro, Ben Engber, Paul Teitlebaum, Andrea Cantatore, Larry Barowski, Trevor Bedzek, Frank Miedrich và Ron Rabakukk

Các dự án khác ngoài BrowserLauncher2 cũng có thể đã cập nhật BrowserLauncher gốc để giải thích cho những thay đổi trong cài đặt bảo mật hệ thống và trình duyệt mặc định kể từ năm 2001.


Bản fork được duy trì của BrowserLauncher2 có sẵn tại github.com/rajing/browserlauncher2
koppor

1
Đối với những người muốn sử dụng BrowserLauncher2 trên máy Mac, không phải BrowserLauncher2 gốc hoặc bản fork được @koppor đề cập đều hoạt động với Mac OS X Sierra. Cả hai đều giả định sự tồn tại của thuộc tính hệ thống "mrj.version" mà dường như không còn tồn tại. Mã sẽ ném một NullPointerException khi trình khởi chạy được xây dựng. Xem sourceforge.net/p/browserlaunch2/bugs/14 để biết thêm thông tin.
Coren

4

Nó rất đơn giản chỉ cần viết mã dưới đây:

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

hoặc nếu bạn không muốn tải URL thì chỉ cần viết tên trình duyệt của bạn thành các giá trị chuỗi như,

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

nó sẽ tự động mở trình duyệt với URL trống sau khi thực hiện một chương trình


1

trên windows gọi "cmd / k start http://www.example.com " Infact bạn luôn có thể gọi các chương trình "mặc định" bằng cách sử dụng lệnh start. Đối với ex start, abc.mp3 sẽ gọi trình phát mp3 mặc định và tải tệp mp3 được yêu cầu.


Bạn đã đăng phiên bản di động. Tôi vừa mới cầu hôn một giải pháp khác có thể được lưu ý nếu nó không chỉ là các url bạn cần mở trong các chương trình mặc định.
d-live

1

Hy vọng bạn không phiền nhưng tôi đã tổng hợp lại tất cả những thứ hữu ích, từ phía trên, và đưa ra một lớp hoàn chỉnh sẵn sàng để kiểm tra ...

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

Tôi đúc lại câu trả lời của Brajesh Kumar ở trên vào Clojure như sau:

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

trong trường hợp nó hữu ích cho bất kỳ ai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.