วิธีเปิดเว็บเบราว์เซอร์เริ่มต้นโดยใช้ java


108

ใครช่วยชี้ทางที่ถูกต้องเกี่ยวกับวิธีเปิดเว็บเบราว์เซอร์เริ่มต้นและตั้งค่าหน้าเว็บเป็น"www.example.com"ขอบคุณ


2
คำถามซ้ำซ้อน: stackoverflow.com/q/10967451/873282
koppor

คำตอบ:


163

java.awt.Desktop คือคลาสที่คุณกำลังมองหา

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
นี่เป็นโซลูชันข้ามแพลตฟอร์มหรือ Windows เท่านั้น? คำตอบอื่น ๆ ในหัวข้อนี้แนะนำให้ใช้คลาส Runtime สำหรับ Linux
isapir

1
สิ่งนี้ไม่ได้ผลสำหรับฉัน วิธีการ IsDesktopSupported ส่งคืนเท็จบนเครื่อง windows ของฉันเสมอ เกิดอะไรขึ้น?
krzysiek.ste

2
หากผู้ใช้กำหนดการดำเนินการ "เปิดด้วย" แบบกำหนดเองให้กับไฟล์ exten เช่น "html" สิ่งนี้จะไม่เปิดเบราว์เซอร์ แต่โปรแกรมที่ผู้ใช้เชื่อมโยงด้วย .... นี่ไม่ใช่วิธีแก้ปัญหาเลย!
thesaint

4
@ krzysiek.ste ใช้Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)เช็คแทน
Thibstars

1
@thesaint หากผู้ใช้เปลี่ยนตัวจัดการสำหรับไฟล์ html นั่นคือสิ่งที่ผู้ใช้ต้องการให้เบราว์เซอร์เริ่มต้นสำหรับไฟล์ html ดังนั้นจึงเป็นเพียงสิ่งที่คำถามถาม
toolforger

35

นี่คือรหัสของฉัน จะเปิด URL ที่กำหนดในเบราว์เซอร์เริ่มต้น (โซลูชันข้ามแพลตฟอร์ม)

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' ไม่ได้รับการยอมรับว่าเป็นคำสั่งภายในหรือภายนอกโปรแกรมที่ใช้งานได้หรือไฟล์แบตช์"
xehpuk

10
นั่นคือคำสั่ง unix คุณกำลังทำอะไรอยู่ใน windows
Olu Smith

7
นอกจาก 'Desktop.isDesktopSupported ()' แล้วให้เลือก 'Desktop.getDesktop (). isSupported (Action.BROWSE)'
Kanchu

35

สำหรับฉันวิธีแก้ปัญหาด้วยDesktop.isDesktopSupported()ไม่ได้ผล ( windows 7และubuntu ) โปรดลองสิ่งนี้เพื่อเปิดเบราว์เซอร์จากรหัส 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);

ลินุกซ์:

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

หากคุณต้องการมีแอปพลิเคชันหลายแพลตฟอร์มคุณต้องเพิ่มการตรวจสอบระบบปฏิบัติการ (เช่น):

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

Windows:

os.indexOf("win") >= 0

Mac:

os.indexOf("mac") >= 0

ลินุกซ์:

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

1
ทำไมต้องใช้ StringBuffer ที่นี่?
Stephan

2
การแสดงรายการเบราว์เซอร์ทั้งหมดในโซลูชัน Linux นั้นแย่มาก จะเป็นอย่างไรหากใช้เบราว์เซอร์อื่นนอกเหนือจากรายการ (ไม่มีโครเมี่ยมหรือโครเมียมในรายการ) หรือมีทั้ง Epiphany และ Firefox แต่ชอบใช้แบบหลัง? การใช้xdg-openจะดีกว่ามากในกรณีนี้ วิธีแก้ปัญหาอาจทำได้ง่ายเหมือน macOS
m4tx

อีกทางเลือกหนึ่งสำหรับ Windows คือ rt.exec ("start \" "+ url +" \ ");
Ivan Nikitin

6

คุณยังสามารถใช้Runtimeเพื่อสร้างโซลูชันข้ามแพลตฟอร์ม:

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

ตามที่ระบุไว้ในคำตอบของ Tim Cooper java.awt.Desktopได้ให้ความสามารถนี้มาตั้งแต่ Java เวอร์ชัน 6 (1.6) แต่มีข้อแม้ดังต่อไปนี้:

ใช้เมธอด isDesktopSupported () เพื่อตรวจสอบว่า Desktop API พร้อมใช้งานหรือไม่ บนระบบปฏิบัติการ Solaris และแพลตฟอร์ม Linux API นี้ขึ้นอยู่กับไลบรารี Gnome หากไลบรารีเหล่านั้นไม่พร้อมใช้งานเมธอดนี้จะส่งคืนเท็จ

สำหรับแพลตฟอร์มที่ไม่รองรับหรือจัดหาให้java.awt.DesktopดูในโครงการBrowserLauncher2 มันได้มาและค่อนข้างปรับปรุงจากคลาสBrowserLauncher ที่เขียนและเผยแพร่โดย Eric Albert ฉันใช้คลาส BrowserLauncher ดั้งเดิมได้สำเร็จในแอปพลิเคชัน Java แบบหลายแพลตฟอร์มซึ่งทำงานในเครื่องด้วยอินเทอร์เฟซเว็บเบราว์เซอร์ในช่วงต้นปี 2000

โปรดทราบว่า BrowserLauncher2 ได้รับใบอนุญาตภายใต้สัญญาอนุญาตแบบสาธารณะทั่วไป หากใบอนุญาตนั้นไม่เป็นที่ยอมรับให้มองหาสำเนาของ BrowserLauncher ดั้งเดิมซึ่งมีใบอนุญาตแบบเสรีมาก:

รหัสนี้เป็นลิขสิทธิ์ 1999-2001 โดย Eric Albert (ejalbert@cs.stanford.edu) และอาจถูกแจกจ่ายหรือแก้ไขในรูปแบบใดก็ได้โดยไม่มีข้อ จำกัด ตราบใดที่ส่วนของความคิดเห็นจากย่อหน้านี้จนถึงตอนท้ายของความคิดเห็นจะไม่ถูกลบออก . ผู้เขียนขอให้เขาได้รับแจ้งเกี่ยวกับแอปพลิเคชันแอพเพล็ตหรือไบนารีอื่น ๆ ที่ใช้รหัสนี้ แต่นั่นเป็นเพราะความอยากรู้อยากเห็นมากกว่าสิ่งใด ๆ และไม่จำเป็น ซอฟต์แวร์นี้ไม่มีการรับประกัน ผู้เขียนจะไม่รับผิดชอบต่อการสูญเสียข้อมูลหรือฟังก์ชันการทำงานหรือผลกระทบที่ไม่พึงประสงค์หรือไม่คาดคิดจากการใช้ซอฟต์แวร์นี้

เครดิต: Steven Spencer, นิตยสาร JavaWorld (Java Tip 66) ขอบคุณ Ron B.Yeh, Eric Shapiro, Ben Engber, Paul Teitlebaum, Andrea Cantatore, Larry Barowski, Trevor Bedzek, Frank Miedrich และ Ron Rabakukk

โครงการอื่นที่ไม่ใช่ BrowserLauncher2 อาจมีการอัปเดต BrowserLauncher ดั้งเดิมเพื่อรองรับการเปลี่ยนแปลงในเบราว์เซอร์และการตั้งค่าความปลอดภัยเริ่มต้นของระบบตั้งแต่ปี 2544


ส้อมที่บำรุงรักษาของ BrowserLauncher2 มีอยู่ที่github.com/rajing/browserlauncher2
koppor

1
สำหรับผู้ที่ต้องการใช้ BrowserLauncher2 บนเครื่อง Mac ทั้ง BrowserLauncher2 ดั้งเดิมหรือทางแยกที่ @koppor กล่าวถึงจะทำงานกับ Mac OS X Sierra ไม่ได้ ทั้งสองถือว่ามีคุณสมบัติของระบบ "mrj.version" ซึ่งดูเหมือนจะไม่มีอยู่แล้ว รหัสจะโยน NullPointerException เมื่อตัวเรียกใช้งานถูกสร้างขึ้น ดูsourceforge.net/p/browserlaunch2/bugs/14สำหรับข้อมูลเพิ่มเติม
Coren

4

มันง่ายมากเพียงแค่เขียนโค้ดด้านล่าง:

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

หรือถ้าคุณไม่ต้องการโหลด URL ให้เขียนชื่อเบราว์เซอร์ของคุณลงในค่าสตริงเช่น

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

มันจะเปิดเบราว์เซอร์โดยอัตโนมัติพร้อม URL ว่างเปล่าหลังจากเรียกใช้โปรแกรม


2

หวังว่าคุณจะไม่รังเกียจ แต่ฉันได้รวบรวมสิ่งที่เป็นประโยชน์ทั้งหมดจากด้านบนและมาพร้อมกับคลาสที่สมบูรณ์พร้อมสำหรับการทดสอบ ...

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

บน windows เรียกใช้ "cmd / k start http://www.example.com " Infact คุณสามารถเรียกโปรแกรม "default" ได้ตลอดเวลาโดยใช้คำสั่ง start สำหรับ ex start abc.mp3 จะเรียกใช้เครื่องเล่น mp3 เริ่มต้นและโหลดไฟล์ mp3 ที่ร้องขอ


คุณโพสต์เวอร์ชันพกพาแล้ว ฉันเพิ่งเสนอวิธีแก้ปัญหาอื่นซึ่งสามารถจำไว้ได้หากไม่ใช่แค่ URL ที่คุณต้องเปิดในโปรแกรมเริ่มต้น
d-live

1

ฉันเขียนคำตอบของBrajesh Kumarข้างต้นลงใน Clojure ดังนี้:

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

เผื่อว่าจะเป็นประโยชน์กับทุกคน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.