Comment ouvrir le navigateur Web par défaut à l'aide de Java


Réponses:


162

java.awt.Desktop est la classe que vous recherchez.

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
est-ce une solution multiplateforme ou Windows uniquement? d'autres réponses dans ce fil suggèrent d'utiliser la classe Runtime pour Linux
isapir

@lgal, cela a fonctionné pour moi à la fois sur Windows 7 et Linux (Ubuntu 10.10). Il ouvre toujours le navigateur système par défaut (IE sur Win7 et Firefox sur Ubuntu, dans mon cas)
Joaquim Oliveira

1
Cela ne fonctionne pas pour moi. La méthode IsDesktopSupported renvoie toujours false sur ma machine Windows. Quel est le problème?
krzysiek.ste

2
Si l'utilisateur a assigné une action personnalisée "ouvrir avec" au fichier exten comme "html" alors cela n'ouvrira PAS le navigateur, mais le programme avec lequel l'utilisateur l'a lié .... Ce n'est pas du tout une solution!
thesaint

4
@ krzysiek.ste utilise la Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)vérification à la place.
Thibstars

35

Voici mon code. Il ouvrira l'URL donnée dans le navigateur par défaut (solution multiplateforme).

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' n'est pas reconnu comme une commande interne ou externe, un programme utilisable ou un fichier de commandes."
xehpuk

10
C'est une commande unix. que faites-vous en cours d'exécution dans Windows
Olu Smith

7
Avec «Desktop.isDesktopSupported ()», cochez également «Desktop.getDesktop (). IsSupported (Action.BROWSE)».
Kanchu

35

Pour moi, la solution avec Desktop.isDesktopSupported()ne fonctionne pas ( Windows 7 et Ubuntu ). Veuillez essayer ceci pour ouvrir le navigateur à partir du code java:

Les fenêtres:

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 vous souhaitez avoir une application multiplateforme, vous devez ajouter une vérification du système d'exploitation (par exemple):

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

Les fenêtres:

os.indexOf("win") >= 0

Mac:

os.indexOf("mac") >= 0

Linux:

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

1
Pourquoi utiliser StringBuffer ici?
Stephan

2
Lister tous les navigateurs de la solution Linux est très mauvais. Et si l'on utilise un autre navigateur que n'importe lequel de la liste? (il n'y a pas de chrome ni de chrome sur la liste) Ou a à la fois Epiphany et Firefox, mais préfère utiliser ce dernier? L'utilisation xdg-openest bien meilleure dans ce cas. La solution pourrait donc être aussi simple que celle de macOS.
m4tx

Une autre option pour Windows est rt.exec ("start \" "+ url +" \ ");
Ivan Nikitin

6

Vous pouvez également utiliser le Runtime pour créer une solution multiplateforme:

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

Comme indiqué dans la réponse fournie par Tim Cooper, java.awt.Desktopa fourni cette capacité depuis la version 6 de Java (1.6), mais avec la mise en garde suivante:

Utilisez la méthode isDesktopSupported () pour déterminer si l'API de bureau est disponible. Sur le système d'exploitation Solaris et la plate-forme Linux, cette API dépend des bibliothèques Gnome. Si ces bibliothèques ne sont pas disponibles, cette méthode retournera false.

Pour les plates-formes qui ne prennent pas en charge ou ne fournissent pas java.awt.Desktop, regardez dans le projet BrowserLauncher2 . Il est dérivé et quelque peu mis à jour de la classe BrowserLauncher initialement écrite et publiée par Eric Albert. J'ai utilisé avec succès la classe originale BrowserLauncher dans une application Java multi-plateforme qui fonctionnait localement avec une interface de navigateur Web au début des années 2000.

Notez que BrowserLauncher2 est sous licence GNU Lesser General Public License . Si cette licence est inacceptable, recherchez une copie du BrowserLauncher original qui a une licence très libérale:

Ce code est Copyright 1999-2001 par Eric Albert (ejalbert@cs.stanford.edu) et peut être redistribué ou modifié sous n'importe quelle forme sans restriction tant que la partie de ce commentaire de ce paragraphe jusqu'à la fin du commentaire n'est pas supprimée . L'auteur demande qu'il soit averti de toute application, applet ou autre binaire utilisant ce code, mais c'est plus par curiosité qu'autre chose et n'est pas obligatoire. Ce logiciel n'inclut aucune garantie. L'auteur n'est pas responsable de toute perte de données ou de fonctionnalité ou de tout effet indésirable ou inattendu de l'utilisation de ce logiciel.

Crédits: Steven Spencer, magazine JavaWorld (Java Tip 66) Merci également à Ron B.Yeh, Eric Shapiro, Ben Engber, Paul Teitlebaum, Andrea Cantatore, Larry Barowski, Trevor Bedzek, Frank Miedrich et Ron Rabakukk

Les projets autres que BrowserLauncher2 peuvent également avoir mis à jour le BrowserLauncher d'origine pour tenir compte des modifications apportées aux paramètres de sécurité du navigateur et du système par défaut depuis 2001.


Le fork maintenu de BrowserLauncher2 est disponible sur github.com/rajing/browserlauncher2
koppor

1
Pour ceux qui cherchent à utiliser BrowserLauncher2 sur Mac, ni le BrowserLauncher2 d'origine ni le fork mentionné par @koppor ne fonctionnent avec Mac OS X Sierra. Les deux supposent l'existence d'une propriété système "mrj.version" qui n'existe apparemment plus. Le code lèvera une NullPointerException lorsque le lanceur est construit. Voir sourceforge.net/p/browserlaunch2/bugs/14 pour plus d'informations.
Coren

4

C'est très simple, il suffit d'écrire le code ci-dessous:

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

ou si vous ne voulez pas charger l'URL, écrivez simplement le nom de votre navigateur dans des valeurs de chaîne comme,

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

il ouvrira automatiquement le navigateur avec une URL vide après l'exécution d'un programme


2

J'espère que cela ne vous dérange pas, mais j'ai bricolé toutes les choses utiles, d'en haut, et j'ai proposé une classe complète prête à être testée ...

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

sous windows, invoquez "cmd / k start http://www.example.com " En fait, vous pouvez toujours invoquer des programmes "par défaut" en utilisant la commande start. Par exemple, abc.mp3 invoquera le lecteur mp3 par défaut et chargera le fichier mp3 demandé.


Vous avez déjà publié la version portable. Je viens de proposer une autre solution qui pourrait être gardée à l'esprit si ce n'est pas seulement les URL que vous devez ouvrir dans les programmes par défaut.
d-live

1

Je reformule la réponse de Brajesh Kumar ci-dessus en Clojure comme suit:

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

au cas où cela serait utile à quiconque.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.