Como abrir o navegador da web padrão usando java

Respostas:

162

java.awt.Desktop é a aula que você está procurando.

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"));
}
Tim Cooper
fonte
3
esta é uma solução multiplataforma ou apenas Windows? outras respostas neste tópico sugerem o uso da classe Runtime para Linux
isapir
@lgal, funcionou para mim no Windows 7 e no Linux (Ubuntu 10.10). Sempre abre o navegador padrão do sistema (IE no Win7 e Firefox no Ubuntu, no meu caso)
Joaquim Oliveira
1
Isso não funciona para mim. O método IsDesktopSupported sempre retorna falso na minha máquina com Windows. Qual é o problema?
krzysiek.ste
2
Se o usuário atribuiu uma ação personalizada "abrir com" ao arquivo exten como "html", isso NÃO abrirá o navegador, mas o programa ao qual o usuário o vinculou ... Isso não é uma solução de forma alguma!
TheSaint
4
@ krzysiek.ste use a Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)verificação em seu lugar.
Thibstars
35

Aqui está meu código. Ele vai abrir a url fornecida no navegador padrão (solução de plataforma cruzada).

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();
            }
        }
    }
}
Brajesh Kumar
fonte
2
"'xdg-open' não é reconhecido como um comando interno ou externo, programa operável ou arquivo em lote."
xehpuk
10
Esse é um comando unix. o que você está fazendo executando no windows
Olu Smith
7
Junto com 'Desktop.isDesktopSupported ()', marque também 'Desktop.getDesktop (). IsSupported (Action.BROWSE)'.
Kanchu de
35

Para mim, a solução com Desktop.isDesktopSupported()não funciona ( windows 7 e ubuntu ). Tente isso para abrir o navegador a partir do código java:

Janelas:

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

Se você deseja ter um aplicativo multiplataforma, é necessário adicionar a verificação do sistema operacional (por exemplo):

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

Janelas:

os.indexOf("win") >= 0

Mac:

os.indexOf("mac") >= 0

Linux:

os.indexOf("nix") >=0 || os.indexOf("nux") >=0
krzysiek.ste
fonte
1
Por que usar StringBuffer aqui?
Stephan
2
Listar todos os navegadores na solução Linux é muito ruim. E se alguém usar outro navegador diferente de qualquer um da lista? (não há cromo nem cromo na lista) Ou tem o Epiphany e o Firefox, mas prefere usar o último? Usar xdg-opené muito melhor neste caso. A solução poderia ser tão simples quanto a do macOS.
m4tx
Outra opção para Windows é rt.exec ("start \" "+ url +" \ ");
Ivan Nikitin
6

Você também pode usar o Runtime para criar uma solução de plataforma cruzada:

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);
        }
    }
}
Benny Neugebauer
fonte
5

Conforme observado na resposta fornecida por Tim Cooper, java.awt.Desktopoferece esse recurso desde a versão 6 do Java (1.6), mas com a seguinte ressalva:

Use o método isDesktopSupported () para determinar se a API do Desktop está disponível. No sistema operacional Solaris e na plataforma Linux, esta API depende das bibliotecas Gnome. Se essas bibliotecas não estiverem disponíveis, este método retornará falso.

Para plataformas que não oferecem suporte ou não java.awt.Desktop, dê uma olhada no projeto BrowserLauncher2 . É derivado e um tanto atualizado da classe BrowserLauncher originalmente escrita e lançada por Eric Albert. Usei a classe BrowserLauncher original com sucesso em um aplicativo Java multiplataforma que rodava localmente com uma interface de navegador da web no início dos anos 2000.

Observe que o BrowserLauncher2 está licenciado sob a GNU Lesser General Public License . Se essa licença for inaceitável, procure uma cópia do BrowserLauncher original, que tem uma licença bastante liberal:

Este código tem copyright 1999-2001 de Eric Albert ([email protected]) e pode ser redistribuído ou modificado de qualquer forma sem restrições, desde que a parte deste comentário deste parágrafo até o final do comentário não seja removida . O autor solicita que ele seja notificado sobre qualquer aplicativo, miniaplicativo ou outro binário que faça uso desse código, mas isso é mais por curiosidade do que qualquer coisa e não é obrigatório. Este software não inclui garantia. O autor não é responsável por qualquer perda de dados ou funcionalidade ou quaisquer efeitos adversos ou inesperados do uso deste software.

Créditos: Steven Spencer, revista JavaWorld (Java Dica 66) Agradecimentos também a Ron B. Yeh, Eric Shapiro, Ben Engber, Paul Teitlebaum, Andrea Cantatore, Larry Barowski, Trevor Bedzek, Frank Miedrich e Ron Rabakukk

Projetos diferentes do BrowserLauncher2 também podem ter atualizado o BrowserLauncher original para levar em conta as alterações no navegador e nas configurações de segurança do sistema padrão desde 2001.

Ned
fonte
A bifurcação mantida do BrowserLauncher2 está disponível em github.com/rajing/browserlauncher2
koppor
1
Para aqueles que procuram usar o BrowserLauncher2 em Macs, nem o BrowserLauncher2 original nem o fork mencionado por @koppor funcionam com o Mac OS X Sierra. Ambos assumem a existência de uma propriedade de sistema "mrj.version" que aparentemente não existe mais. O código lançará uma NullPointerException quando o inicializador for construído. Consulte sourceforge.net/p/browserlaunch2/bugs/14 para obter informações adicionais.
Coren
4

É muito simples, basta escrever o código abaixo:

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

ou se você não quiser carregar o URL, basta escrever o nome do seu navegador em valores de string como,

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

ele irá abrir o navegador automaticamente com um URL vazio após a execução de um programa

Rushikesh Chaudhari
fonte
2

Espero que você não se importe, mas eu juntei todas as coisas úteis, de cima, e vim com uma classe completa pronta para teste ...

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);
    }
}
Dave
fonte
1

no Windows invoque "cmd / k start http://www.example.com " Na verdade, você sempre pode invocar programas "padrão" usando o comando start. Para ex start abc.mp3 irá invocar o reprodutor de mp3 padrão e carregar o arquivo de mp3 solicitado.

d-live
fonte
Você já postou a versão portátil. Acabei de propor outra solução que pode ser mantida em mente, se não forem apenas os urls que você precisa abrir em programas padrão.
d-live em
1

Eu reformulei a resposta de Brajesh Kumar acima em Clojure da seguinte forma:

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

caso seja útil para alguém.

Simon Brooke
fonte