Як відкрити веб-браузер за замовчуванням за допомогою Java


107

Чи може хтось вказати мені в правильному напрямку щодо того, як відкрити веб-браузер за замовчуванням і встановити сторінку на "www.example.com" дякую


2
Повторювані питання: stackoverflow.com/q/10967451/873282
koppor

Відповіді:


161

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

@lgal, він працював для мене і в Windows 7, і в Linux (Ubuntu 10.10). Він завжди відкриває системний браузер за замовчуванням (у моєму випадку IE на Win7 та Firefox на Ubuntu)
Joaquim Oliveira

1
Це не працює для мене. Метод IsDesktopSupported завжди повертає помилку на моїй машині Windows. Що трапилось?
krzysiek.ste

2
Якщо користувач призначив власну дію "відкрити з" для файлу exten типу "html", це НЕ відкриє браузер, але програма, з якою користувач пов’язав це .... Це зовсім не рішення!
святого

4
@ krzysiek.ste Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)замість цього використовуйте чек.
Thibstars

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
Олу Сміт

7
Поряд з 'Desktop.isDesktopSupported ()' також встановіть прапорець "Desktop.getDesktop (). IsSupported (Action.BROWSE) '.
Канчу

35

Для мене рішення з Desktop.isDesktopSupported()не працює ( Windows 7 і ubuntu ). Спробуйте скористатися цим, щоб відкрити браузер із коду Java:

Windows:

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

Мак

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

Якщо ви хочете мати багатоплатформенний додаток, вам потрібно додати перевірку операційної системи (наприклад):

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

Windows:

os.indexOf("win") >= 0

Мак:

os.indexOf("mac") >= 0

Linux:

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

1
Чому тут використовується StringBuffer?
Стефан

2
Перерахувати всі браузери в рішенні Linux дуже погано. Що робити, якщо користувач переглядає інший, ніж будь-який зі списку? (в списку немає ні хрому, ні хрому) Або є Epiphany та Firefox, але вважає за краще використовувати останній? Використовувати xdg-openв цьому випадку набагато краще. Тому рішення може бути таким же простим, як і macOS.
m4tx

Інший варіант для Windows - rt.exec ("start \" "+ url +" \ ");
Іван Нікітін

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

Як зазначається у відповіді, наданій Тімом Купером, java.awt.Desktopвін надав цю можливість ще з версії Java 6 (1.6), але із наступним застереженням:

Використовуйте метод isDesktopSupported (), щоб визначити, чи доступний API Desktop. В операційній системі Solaris та платформі Linux цей API залежить від бібліотек Gnome. Якщо ці бібліотеки недоступні, цей метод поверне помилковий.

Для платформ, які не підтримують і не надають java.awt.Desktop, перегляньте проект BrowserLauncher2 . Він отриманий та дещо оновлений з класу BrowserLauncher, спочатку написаного та опублікованого Еріком Альбертом. Я успішно використовував оригінальний клас BrowserLauncher у багатоплатформенному додатку Java, який працював локально з інтерфейсом веб-браузера на початку 2000-х.

Зауважте, що BrowserLauncher2 ліцензований згідно з ліцензією GNU Lesser General Public . Якщо ця ліцензія неприйнятна, шукайте копію оригіналу BrowserLauncher, яка має дуже ліберальну ліцензію:

Цей код є авторським правом Еріка Альберта 1999-2001 рр. (Ejalbert@cs.stanford.edu) і може бути перерозподілений або змінений у будь-якій формі без обмежень до тих пір, поки частина цього коментаря з цього пункту до кінця коментаря не буде видалена. . Автор просить його повідомити про будь-яку програму, аплет чи інший бінарний код, який використовує цей код, але це більше з цікавості, ніж усе, і не потрібно. Це програмне забезпечення не включає гарантії. Автор не несе відповідальності за будь-яку втрату даних або функціональності або будь-які несприятливі або несподівані наслідки використання цього програмного забезпечення.

Кредити: Стівен Спенсер, журнал JavaWorld (Java Tip 66) Завдяки також Рона Б. Йе, Еріку Шапіро, Бен Енгбер, Полу Тейтлебауму, Андреа Кантаторе, Ларрі Баровському, Тревору Бедзеку, Френку Мідріху та Рона Рабакукку

Інші проекти, окрім BrowserLauncher2, можливо, також оновили оригінальний BrowserLauncher для врахування змін у браузері та налаштуваннях системи безпеки за замовчуванням з 2001 року.


Підтримуваний вилка BrowserLauncher2 доступний на веб-
koppor

1
Для тих, хто хоче використовувати BrowserLauncher2 на Mac, ні оригінальний BrowserLauncher2, ні вилка, згадана @koppor, не працюють з Mac OS X Sierra. Обидва припускають існування властивості системи "mrj.version", якої, очевидно, більше немає. Код буде кидати NullPointerException при створенні пускового пристрою. Для отримання додаткової інформації див. Sourceforge.net/p/browserlaunch2/bugs/14 .
Корен

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-адресою після виконання програми


1

у Windows викликають "cmd / k start http://www.example.com " Infact, ви завжди можете викликати "програми за замовчуванням", використовуючи команду start. Для запуску abc.mp3 викличе програвач mp3 за замовчуванням та завантажить потрібний mp3-файл.


Ви вже опублікували портативну версію. Я просто запропонував ще одне рішення, про яке можна пам’ятати, якщо це не лише URL-адреси, які потрібно відкрити в програмах за замовчуванням.
d-live

1

Сподіваюся, ви не заперечуєте, але я згорнув всі корисні речі зверху і придумав повний клас, готовий до тестування ...

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

Відповідь Браєша Кумара вище переробляю в 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)))))

якщо це комусь корисно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.