Java kullanarak varsayılan web tarayıcısı nasıl açılır


Yanıtlar:


162

java.awt.Desktop aradığınız sınıf.

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
Bu bir çapraz platform çözümü mü yoksa yalnızca Windows mu? bu konudaki diğer yanıtlar Linux için Runtime sınıfını kullanmanızı öneriyor
isapir

@lgal, benim için hem Windows 7'de hem de Linux'ta (Ubuntu 10.10) çalıştı. Her zaman varsayılan sistem tarayıcısını açar (benim durumumda Win7'de IE ve Ubuntu'da Firefox)
Joaquim Oliveira

1
Bu benim için çalışmıyor. IsDesktopSupported yöntemi Windows makinemde her zaman yanlış döndürüyor. Sorun ne?
krzysiek.ste

2
Kullanıcı exten dosyaya "html" gibi özel bir "birlikte aç" eylemi atamışsa, bu, tarayıcıyı AÇMAYACAK, ancak kullanıcının ona bağladığı program .... Bu hiç de bir çözüm değil!
thesaint

4
@ krzysiek.ste Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)bunun yerine onay kullanın.
Thibstars

35

İşte kodum. Verilen url'yi varsayılan tarayıcıda açacaktır (çapraz platform çözümü).

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', dahili veya harici bir komut, çalıştırılabilir program veya toplu iş dosyası olarak tanınmıyor."
xehpuk

10
Bu bir unix komutu. pencerelerde çalıştırırken ne yapıyorsun
Olu Smith

7
'Desktop.isDesktopSupported ()' ile birlikte 'Desktop.getDesktop (). İsSupported (Action.BROWSE)' seçeneğini de işaretleyin.
Kanchu

35

Benim için çözüm Desktop.isDesktopSupported()çalışmıyor ( Windows 7 ve ubuntu ). Lütfen tarayıcıyı java kodundan açmayı deneyin:

Pencereler:

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

Çoklu platform uygulamasına sahip olmak istiyorsanız, işletim sistemi denetimi eklemeniz gerekir (örneğin):

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

Pencereler:

os.indexOf("win") >= 0

Mac:

os.indexOf("mac") >= 0

Linux:

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

1
Neden burada StringBuffer kullanılıyor?
Stephan

2
Linux çözümünde tüm tarayıcıları listelemek çok kötü. Ya listedeki tarayıcılardan başka bir tarayıcı kullanılıyorsa? (Listede chrome veya chromium yok) Veya hem Epiphany hem de Firefox var, ancak ikincisini kullanmayı mı tercih ediyor? xdg-openBu durumda kullanmak çok daha iyidir. Bu nedenle çözüm, macOS olanı kadar basit olabilir.
m4tx

Windows için başka bir seçenek de rt.exec ("start \" "+ url +" \ ");
Ivan Nikitin

6

Platformlar arası bir çözüm oluşturmak için Runtime'ı da kullanabilirsiniz :

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'ın verdiği cevapta belirtildiği gibi, java.awt.Desktop bu özelliği Java sürüm 6 (1.6) 'dan beri sağlamaktadır, ancak aşağıdaki uyarı ile:

Desktop API'nin kullanılabilir olup olmadığını belirlemek için isDesktopSupported () yöntemini kullanın. Solaris İşletim Sistemi ve Linux platformunda bu API, Gnome kitaplıklarına bağlıdır. Bu kitaplıklar kullanılamıyorsa, bu yöntem yanlış döndürür.

Desteklemeyen veya sağlamayan platformlar java.awt.Desktopiçin BrowserLauncher2 projesine bakın. Orijinal olarak Eric Albert tarafından yazılan ve yayımlanan BrowserLauncher sınıfından türetilmiş ve bir şekilde güncellenmiştir . Orijinal BrowserLauncher sınıfını, 2000'lerin başında bir web tarayıcısı arayüzüyle yerel olarak çalışan çok platformlu bir Java uygulamasında başarıyla kullandım.

BrowserLauncher2'nin GNU Kısıtlı Genel Kamu Lisansı altında lisanslandığını unutmayın. . Bu lisans kabul edilemezse, çok liberal bir lisansa sahip orijinal BrowserLauncher'ın bir kopyasını arayın:

Bu kodun Telif Hakkı 1999-2001 Eric Albert'e aittir (ejalbert@cs.stanford.edu) ve bu yorumun bu paragraftan yorumun sonuna kadar olan kısmı kaldırılmadığı sürece herhangi bir kısıtlama olmaksızın yeniden dağıtılabilir veya değiştirilebilir. . Yazar, bu kodu kullanan herhangi bir uygulama, uygulama veya diğer ikili programlardan haberdar edilmesini ister, ancak bu her şeyden çok meraktan kaynaklanır ve gerekli değildir. Bu yazılım hiçbir garanti içermez. Yazar, herhangi bir veri veya işlevsellik kaybından veya bu yazılımı kullanmanın herhangi bir olumsuz veya beklenmedik etkisinden sorumlu tutulamaz.

Katkıda Bulunanlar: Steven Spencer, JavaWorld dergisi (Java Tip 66) Ron B. Yeh, Eric Shapiro, Ben Engber, Paul Teitlebaum, Andrea Cantatore, Larry Barowski, Trevor Bedzek, Frank Miedrich ve Ron Rabakukk'a da teşekkürler

BrowserLauncher2 dışındaki projeler, 2001'den beri tarayıcı ve varsayılan sistem güvenlik ayarlarındaki değişiklikleri hesaba katmak için orijinal BrowserLauncher'ı da güncellemiş olabilir.


BrowserLauncher2'nin bakım çatalı github.com/rajing/browserlauncher2
koppor

1
Mac'lerde BrowserLauncher2 kullanmak isteyenler için, ne orijinal BrowserLauncher2 ne de @koppor tarafından belirtilen çatal, Mac OS X Sierra ile çalışmaz. Her ikisi de, görünüşe göre artık mevcut olmayan bir "mrj.version" sistem özelliğinin varlığını varsayar. Kod, başlatıcı oluşturulduğunda bir NullPointerException oluşturur. Ek bilgi için sourceforge.net/p/browserlaunch2/bugs/14 sayfasına bakın .
Coren

4

Çok basit, sadece aşağıdaki kodu yazın:

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

veya URL'yi yüklemek istemiyorsanız, tarayıcınızın adını aşağıdaki gibi dize değerlerine yazın:

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

bir programı çalıştırdıktan sonra tarayıcıyı boş URL ile otomatik olarak açacaktır


2

Umarım sakıncası yoktur ama tüm yararlı şeyleri yukarıdan bir araya getirdim ve teste hazır eksiksiz bir sınıf buldum ...

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

Windows'ta "cmd / k start http://www.example.com " u çağırın Infact, start komutunu kullanarak her zaman "varsayılan" programları çağırabilirsiniz. Eski başlangıç ​​için abc.mp3 varsayılan mp3 çaları çağıracak ve istenen mp3 dosyasını yükleyecektir.


Taşınabilir sürümü zaten göndermişsiniz. Sadece varsayılan programlarda açmanız gereken URL'ler değilse, akılda tutulabilecek başka bir çözüm önerdim .
D-canlı

1

Brajesh Kumar'ın yukarıdaki cevabını Clojure'e aşağıdaki gibi yeniden düzenledim :

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

kimse için yararlı olması durumunda.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.