Javaを使用してデフォルトのWebブラウザーを開く方法


回答:


161

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のみですか?このスレッドの他の回答は、Linuxのランタイムクラスを使用することを提案しています
isapir 2013年

@lgal、それは私にとってWindows 7とLinux(Ubuntu 10.10)の両方で機能しました。常にデフォルトのシステムブラウザー(Win7ではIE、UbuntuではFirefox)を開きます
Joaquim Oliveira

1
これは私にはうまくいきません。IsDesktopSupportedメソッドは、Windowsマシンで常にfalseを返します。どうしたの?
krzysiek.ste 2015年

2
ユーザーが「html」のようなファイルにカスタムの「で開く」アクションをファイルに割り当てた場合、これはブラウザーを開きませんが、ユーザーがリンクしたプログラムを開きます....これはまったく解決策ではありません!
thesaint

4
@ krzysiek.steはDesktop.getDesktop().isSupported(Desktop.Action.BROWSE)代わりにチェックを使用してください。
Thibstars 2017

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 2015

10
それはUNIXコマンドです。Windowsでそれを実行するために何をしていますか
Olu Smith

7
「Desktop.isDesktopSupported()」とともに「Desktop.getDesktop()。isSupported(Action.BROWSE)」も確認してください。
Kanchu

35

私にとっての解決策はDesktop.isDesktopSupported()機能しません(Windows 7およびubuntu)。これを試して、Javaコードからブラウザを開いてください。

ウィンドウズ:

Runtime rt = Runtime.getRuntime();
String url = "http://stackoverflow.com";
rt.exec("rundll32 url.dll,FileProtocolHandler " + url);

マック

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

ウィンドウズ:

os.indexOf("win") >= 0

マック:

os.indexOf("mac") >= 0

Linux:

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

1
ここでStringBufferを使用する理由
ステファン

2
Linuxソリューションにすべてのブラウザーをリストするのは非常に悪いことです。リストにあるブラウザ以外のブラウザを使用するとどうなりますか?(リストにクロムもクロムもありません)またはEpiphanyとFirefoxの両方を持っていますが、後者を使用することを好みますか?xdg-openこの場合、使用する方がはるかに優れています。したがって、ソリューションはmacOSのソリューションと同じくらい簡単なものになる可能性があります。
m4tx 2017

Windows用の別のオプションrt.execである( "\スタート"」+ 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

Tim Cooperの回答にあるように、java.awt.DesktopJavaバージョン6(1.6)以降、この機能を提供していますが、次の警告があります。

isDesktopSupported()メソッドを使用して、デスクトップAPIが使用可能かどうかを判別します。SolarisオペレーティングシステムとLinuxプラットフォームでは、このAPIはGnomeライブラリに依存しています。これらのライブラリが利用できない場合、このメソッドはfalseを返します。

をサポートまたは提供していないプラットフォームの場合はjava.awt.DesktopBrowserLauncher2プロジェクトを調べてください。これは、Eric Albertによって最初に作成およびリリースされたBrowserLauncherクラスから派生し、多少更新されています。2000年代初頭にWebブラウザーインターフェイスでローカルに実行されるマルチプラットフォームJavaアプリケーションで、元のBrowserLauncherクラスをうまく使用しました。

BrowserLauncher2は、GNU Lesser General Public Licenseの下でライセンスされていることに注意してください。そのライセンスが受け入れられない場合は、非常に自由なライセンスを持つ元のBrowserLauncherのコピーを探します。

このコードは、Eric AlbertによるCopyright 1999-2001(ejalbert@cs.stanford.edu)であり、この段落のコメントの最後からコメントの最後まで、このコメントの部分が削除されない限り、制限なく再配布または変更できます。 。著者は、このコードを使用するアプリケーション、アプレット、またはその他のバイナリについて通知を受けることを要求しますが、それは何よりも好奇心から外れており、必須ではありません。このソフトウェアには保証が含まれていません。著者は、データや機能の損失、またはこのソフトウェアの使用による悪影響または予期しない影響について責任を負いません。

クレジット:Steven Spencer、JavaWorldマガジン(Java Tip 66)Ron B. Yeh、Eric Shapiro、Ben Engber、Paul Teitlebaum、Andrea Cantatore、Larry Barowski、Trevor Bedzek、Frank Miedrich、Ron Rabakukkにも感謝

BrowserLauncher2以外のプロジェクトでも、2001年以降のブラウザおよびデフォルトのシステムセキュリティ設定の変更に対応するために、元のBrowserLauncherが更新されている可能性があります。


維持されているBrowserLauncher2のフォークはgithub.com/rajing/browserlauncher2から
koppor

1
MacでBrowserLauncher2を使用したいと考えている人にとっては、元のBrowserLauncher2も@kopporが言及しているフォークもMac OS X Sierraでは動作しません。どちらも、明らかに存在しない「mrj.version」システムプロパティの存在を前提としています。ランチャーが構築されると、コードはNullPointerExceptionをスローします。詳細については、sourceforge.net / p / browserlaunch2 / bugs / 14を参照してください。
Coren 2017

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でブラウザを自動的に開きます


1

Windowsでは「cmd / k start http://www.example.com」を呼び出します。事実、startコマンドを使用して「デフォルト」プログラムをいつでも呼び出すことができます。ex startの場合、abc.mp3はデフォルトのmp3プレーヤーを呼び出し、要求されたmp3ファイルをロードします。


あなたはすでにポータブル版を投稿しました。デフォルトのプログラムで開く必要があるURLだけではない場合に留意できる別のソリューションを提案しました。
d-live

1

あなたが気にしないことを願っていますが、私は上からすべての役立つものをまとめ、そしてテストの準備ができている完全なクラスを思いつきました...

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

上記のBrajesh Kumarの答えを次のように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)))))

万が一のために。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.