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

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

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

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

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 (ejalbert@cs.stanford.edu) 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.


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


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.


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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.