Web-Browser [Linux] wird nicht aufgerufen

Issue #233 resolved
xletterx created an issue

[MyMDb-CE 2.1.1, Linux, Debian: buster, XFCE-Desktop]

Fehlerbeschreibung:

Alle Funktionalitäten, die den Start des Webbrowsers benötigen, bringen nur eine Fehlermeldung (siehe unten, Anhang 1). Betroffen sind die Webbrowser-Aufrufe im Menupunkt "Hilfe" und alle OFDb- und IMDb-Links zu den Filmen. Updates und Filmzufügen über OFDb-Links funktionieren (IMDb-Links können momentan wegen noch nicht eingepflegter Änderungen an der IMDb-Struktur nicht getestet werden). Fehler wurde auch unter bullseye mit XFCE-Desktop beobachtet.

Fehler reproduzieren:

Linux-Debian (buster oder bullseye) mit XFCE-Desktop installieren. MyMDb-CE starten, am besten vom Terminal aus, um die Fehlermeldung sehen zu können. Auf "Hilfe-Homepage öffnen" klicken. Erwartetes Verhalten: Default-Browser wird gestartet. Tatsächliches Verhalten: keine Reaktion im Programm, kein Start eines Browsers, auf dem Terminal eine Fehlermeldung (siehe Anhang 1).

Analyse und Vorschläge:

Anscheinend liegt das Verhalten daran, dass der Aufruf von

Desktop.getDesktop().browse(new URI(paramString));

(in mymdbce.af.class) einen Fehler bringt und dann abbricht. Laut Googlen kommt das unter Linux recht oft vor, sobald man keinen Gnome-Desktop hat, weshalb dort bei Problemen regelmässig vorgeschlagen wird, das getDesktop.browse für Linux eher nicht zu nutzen. Da es unter Windows und Mac ja tadellos zu funktionieren scheint, müsste man Änderungen nur für die Linux-Variante durchführen.

Hierbei scheint es nun (mindestens) vier mögliche Ansätze für die Lösung zu geben:

Variante A: wie bisher ohne zusätzliche Einstellungen:

  1. man ersetzt (für Linux) den Aufruf von getDesktop.browse komplett durch ein Verfahren, das auch ohne Gnome-Desktop funktioniert und den Default-Browser aufruft. (Dazu müsste man noch ein wenig im Internet rumgooglen, was die so empfehlen, und wie allgemeingültig deren Vorschläge überhaupt sind).
  2. man behält getDesktop.browse, ändert aber den Aufruf so ab, dass er bei einer Fehlerrückmeldung zuerst noch einen zweiten (anderen) Versuch macht, den Default-Browser zu starten, bevor er das Handtuch wirft. (Ich kenne mich viel zu wenig mit Java aus, um zu beurteilen, wie leicht/schwer es ist, den Default-Browser auf andere Art herauszufinden).
  3. man behält getDesktop.browse, ändert aber den Aufruf so ab, dass er bei einer Fehlerrückmeldung zuerst noch eine vorgegebene Liste von Browsern durchprobiert, bevor er aussteigt. In diesem Szenario wird zwar dann ein fixer Browser aufgerufen, und nicht der Default-Browser, aber das wäre besser als die jetzige Situation. Hierzu könnte man eventuell die Funktion

launchBrowser(String paramString)

(Details siehe unten, Anhang 2) in com.lowagie.tools.Executable.class verwenden/anpassen. (Bei der Gelegenheit könnte man die Liste eventuell auch noch ergänzen, mit zB. chromium).

Variante B: mit einer zusätzlichen Einstellung:

  1. man ergänzt eine Einstellungsmöglichkeit (im Menu), bei der man entweder aus einer Liste von vorgegebenen Browsern einen auswählen kann oder alternativ einen Befehl angeben kann, der ein (beliebiges) Browserprogramm aufruft. Bei einer Fehlerrückmeldung von getDesktop.browse wird dieser dann noch ausprobiert, bevor er aussteigt (oder auf das getDesktop.browse wird in diesem Fall gleich ganz verzichtet).

Bewertungen:

Wenn man mich nun fragen würde, was ich bevorzuge, so wären das ganz klar die Punkte 1 oder 2. Der automatische Aufruf des Default-Browsers ist das Optimum. Allerdings ist das eventuell gar nicht möglich ohne getDesktop.browse, oder nur sehr aufwendig.

Als nächstbeste Lösung scheint mir Variante B-1, da man dort noch Einfluss auf die Wahl des Browsers hat. Wer will schon einen x-beliebigen Browser, der zufällig auf seinem System installiert ist, nutzen müssen... :-)

Bei B-1 wäre dann die Variante mit der Angabe des Befehls vorzuziehen, da eine fixe Liste (auch unter A-3) vermutlich schneller veraltet, als man denkt. Ausserdem ist dann der user selber schuld, wenn der Befehl nicht klappt. :-D

Viele Grüsse
xletterx


Anhang 1: Anfang der Fehlermeldung

[code]

Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: The BROWSE action is not supported on the current platform!
at java.desktop/java.awt.Desktop.checkActionSupport(Desktop.java:380)
at java.desktop/java.awt.Desktop.browse(Desktop.java:524)
at mymdbce.af.x(Utility.java:1564)
at mymdbce.o$c.actionPerformed(GUIButtonMaker.java:2630)

[/code]

Anhang 2: launchBrowser

[code]

public static final void launchBrowser(String paramString) throws IOException {
try {
if (isMac()) {
Class clazz = Class.forName("com.apple.mrj.MRJFileUtils");
Method method = clazz.getDeclaredMethod("openURL", new Class[] { String.class });
method.invoke(null, new Object[] { paramString });
} else if (isWindows()) {
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + paramString);
} else {
String[] arrayOfString = { "firefox", "opera", "konqueror", "mozilla", "netscape" };
String str = null;
for (byte b = 0; b < arrayOfString.length && str == null; b++) {
if (Runtime.getRuntime().exec(new String[] { "which", arrayOfString[b] }).waitFor() == 0)
str = arrayOfString[b];
}
if (str == null)
throw new Exception("Could not find web browser.");
Runtime.getRuntime().exec(new String[] { str, paramString });
}
} catch (Exception exception) {
throw new IOException("Error attempting to launch web browser");
}
}

[/code]

Comments (4)

  1. tbengel

    Dank Deiner Codebeispiele, klappt nun auch bei solche spezielle Linux-Versionen wie Deiner die URL-Verknüpfungen mit dem Standard-Browser.

  2. Log in to comment