Как открыть веб-браузер по умолчанию с помощью java


107

Может ли кто-нибудь указать мне в правильном направлении, как открыть веб-браузер по умолчанию и установить страницу на «www.example.com», спасибо


2
Повторяющийся вопрос: stackoverflow.com/q/10967451/873282
koppor

Ответы:


162

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, в моем случае)
Хоаким Оливейра

1
У меня это не работает. Метод IsDesktopSupported всегда возвращает false на моем компьютере с Windows. Что случилось?
krzysiek.ste 02

2
Если пользователь назначил настраиваемое действие «открыть с помощью» для расширения файла, такого как «html», тогда это НЕ откроет браузер, а программу, с которой пользователь связал его .... Это вообще не решение!
thesaint

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

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

Если вы хотите иметь мультиплатформенное приложение, вам нужно добавить проверку операционной системы (например):

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
Почему здесь используется StringBuffer?
Стефан

2
Перечислять все браузеры в решении для Linux очень плохо. Что делать, если вы используете другой браузер, чем любой из списка? (в списке нет хрома или хрома) Или есть и Epiphany, и Firefox, но предпочитает последний? xdg-openВ этом случае использование намного лучше. Таким образом, решение может быть таким же простым, как и решение для macOS.
m4tx

Другой вариант для Windows - rt.exec ("start \" "+ url +" \ ");
Иван Никитин

6

Вы также можете использовать среду выполнения для создания кроссплатформенного решения:

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 (), чтобы определить, доступен ли Desktop API. В операционной системе Solaris и платформе Linux этот API зависит от библиотек Gnome. Если эти библиотеки недоступны, этот метод вернет false.

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

Обратите внимание, что BrowserLauncher2 находится под лицензией GNU Lesser General Public License . Если эта лицензия неприемлема, поищите копию оригинального BrowserLauncher с очень либеральной лицензией:

Авторские права на этот код принадлежат Эрику Альберту (ejalbert@cs.stanford.edu), 1999-2001 гг., И его можно распространять или изменять в любой форме без ограничений при условии, что часть этого комментария от этого абзаца до конца комментария не будет удалена. . Автор просит уведомлять его о любых приложениях, апплетах или других двоичных файлах, которые используют этот код, но это больше из любопытства, чем что-либо еще и не требуется. На это программное обеспечение не распространяется гарантия. Автор не несет ответственности за потерю данных или функциональности, а также за любые неблагоприятные или неожиданные последствия использования этого программного обеспечения.

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

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


Поддерживаемый форк 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 ". Фактически, вы всегда можете вызвать программы "по умолчанию", используя команду start. Например, abc.mp3 вызовет mp3-плеер по умолчанию и загрузит запрошенный mp3-файл.


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

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.