Cómo abrir el navegador web predeterminado usando java

Respuestas:

161

java.awt.Desktop es la clase que estás buscando.

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
fuente
3
¿Es esta una solución multiplataforma o solo Windows? otras respuestas en este hilo sugieren usar la clase Runtime para Linux
isapir
@lgal, funcionó para mí tanto en Windows 7 como en Linux (Ubuntu 10.10). Siempre abre el navegador del sistema predeterminado (IE en Win7 y Firefox en Ubuntu, en mi caso)
Joaquim Oliveira
1
Esto no funciona para mí. El método IsDesktopSupported siempre devuelve falso en mi máquina con Windows. ¿Qué pasa?
krzysiek.ste
2
Si el usuario ha asignado una acción personalizada "abrir con" a la extensión del archivo como "html", esto NO abrirá el navegador, sino el programa con el que el usuario lo ha vinculado ... ¡Esto no es una solución en absoluto!
Santo-
4
@ krzysiek.ste usa el Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)cheque en su lugar.
Thibstars
35

Aquí está mi código. Se abrirá la URL dada en el navegador predeterminado (solución multiplataforma).

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
fuente
2
"'xdg-open' no se reconoce como un comando interno o externo, programa operable o archivo por lotes".
xehpuk
10
Ese es un comando de Unix. ¿Qué estás haciendo ejecutándolo en Windows?
Olu Smith
7
Junto con 'Desktop.isDesktopSupported ()' también marque 'Desktop.getDesktop (). IsSupported (Action.BROWSE)'.
Kanchu
35

Para mí, la solución Desktop.isDesktopSupported()no funciona ( Windows 7 y Ubuntu ). Intente esto para abrir el navegador desde el código java:

Ventanas:

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

Si desea tener una aplicación multiplataforma, debe agregar la verificación del sistema operativo (por ejemplo):

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

Ventanas:

os.indexOf("win") >= 0

Mac:

os.indexOf("mac") >= 0

Linux:

os.indexOf("nix") >=0 || os.indexOf("nux") >=0
krzysiek.ste
fuente
1
¿Por qué usar StringBuffer aquí?
Stephan
2
Listar todos los navegadores en la solución Linux es muy malo. ¿Qué pasa si uno usa un navegador diferente a cualquiera de la lista? (no hay cromo ni cromo en la lista) ¿O tiene Epiphany y Firefox, pero prefiere usar este último? Usar xdg-openes mucho mejor en este caso. Por lo tanto, la solución podría ser tan simple como la de macOS.
m4tx
Otra opción para Windows es rt.exec ("start \" "+ url +" \ ");
Ivan Nikitin
6

También puede usar Runtime para crear una solución multiplataforma:

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
fuente
5

Como se indica en la respuesta proporcionada por Tim Cooper, java.awt.Desktopha proporcionado esta capacidad desde la versión 6 de Java (1.6), pero con la siguiente advertencia:

Utilice el método isDesktopSupported () para determinar si la API de escritorio está disponible. En el sistema operativo Solaris y la plataforma Linux, esta API depende de las bibliotecas de Gnome. Si esas bibliotecas no están disponibles, este método devolverá falso.

Para las plataformas que no son compatibles o no proporcionan java.awt.Desktop, consulte el proyecto BrowserLauncher2 . Se deriva y algo actualizado de la clase BrowserLauncher originalmente escrita y publicada por Eric Albert. Utilicé la clase BrowserLauncher original con éxito en una aplicación Java multiplataforma que se ejecutaba localmente con una interfaz de navegador web a principios de la década de 2000.

Tenga en cuenta que BrowserLauncher2 tiene la licencia GNU Lesser General Public License . Si esa licencia es inaceptable, busque una copia del BrowserLauncher original que tiene una licencia muy liberal:

Este código tiene Copyright 1999-2001 de Eric Albert ([email protected]) y puede redistribuirse o modificarse de cualquier forma sin restricciones, siempre que no se elimine la parte de este comentario desde este párrafo hasta el final del comentario. . El autor solicita que se le notifique de cualquier aplicación, subprograma u otro binario que haga uso de este código, pero eso es más por curiosidad que por cualquier otra cosa y no es obligatorio. Este software no incluye garantía. El autor no es responsable de ninguna pérdida de datos o funcionalidad o de cualquier efecto adverso o inesperado del uso de este software.

Créditos: Steven Spencer, revista JavaWorld (Consejo 66 de Java) Gracias también a Ron B. Yeh, Eric Shapiro, Ben Engber, Paul Teitlebaum, Andrea Cantatore, Larry Barowski, Trevor Bedzek, Frank Miedrich y Ron Rabakukk

Es posible que otros proyectos distintos a BrowserLauncher2 también hayan actualizado el BrowserLauncher original para tener en cuenta los cambios en la configuración de seguridad predeterminada del navegador y del sistema desde 2001.

Ned
fuente
La bifurcación mantenida de BrowserLauncher2 está disponible en github.com/rajing/browserlauncher2
koppor
1
Para aquellos que buscan usar BrowserLauncher2 en Mac, ni el BrowserLauncher2 original ni el fork mencionado por @koppor funcionan con Mac OS X Sierra. Ambos asumen la existencia de una propiedad del sistema "mrj.version" que aparentemente ya no existe. El código lanzará una NullPointerException cuando se construya el lanzador. Consulte sourceforge.net/p/browserlaunch2/bugs/14 para obtener información adicional.
Coren
4

Es muy simple, simplemente escriba el código a continuación:

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

o si no desea cargar la URL, simplemente escriba el nombre de su navegador en valores de cadena como,

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

abrirá el navegador automáticamente con la URL vacía después de ejecutar un programa

Rushikesh Chaudhari
fuente
1

en Windows, invoque "cmd / k start http://www.example.com " De hecho, siempre puede invocar programas "predeterminados" utilizando el comando de inicio. Por ejemplo, start abc.mp3 invocará el reproductor mp3 predeterminado y cargará el archivo mp3 solicitado.

d-vivir
fuente
Ya publicaste la versión portátil. Acabo de proponer otra solución que podría tenerse en cuenta si no son solo las URL que necesita abrir en los programas predeterminados.
d-live
1

Espero que no le importe, pero improvisé todas las cosas útiles, desde arriba, y se me ocurrió una clase completa lista para probar ...

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
fuente
1

Me refundición Brajesh Kumar respuesta 's arriba en Clojure de la siguiente manera:

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

en caso de que sea útil para alguien.

Simon Brooke
fuente