2016-04-14 3 views
0

Ich habe versucht, ein JavaFX-Projekt mit Netbeans und Gradle in ein Android-APK-Dateiformat portieren und zum größten Teil funktioniert es gut! Das Problem, das ich habe, ist mit der WebView-Komponente von Android insbesondere? Ich kann es bekommen, um eine statische Webseite in Android Webview zu zeigen, ohne dass meine App mit einer FATAL EXCEPTION umkippt. Aber wenn ich eine dynamische Webseite in JavaFX Webview mit JavaScript erstellen, scheint Androids Webview überhaupt nicht zu bewältigen?Wie kompatibel ist JavaFX Webview mit Androids Webview?

Eventhough in JavaFX stelle ich JavaScript auf true aktivieren:

googleMapEngine.setJavaScriptEnabled(true); 

Wie ich bewusst bin, dass in Android Webview - JavaScript standardmäßig ausgeschaltet ist. Ich kann es nicht in Android funktionieren. Kann Android Webview außerdem den JavaFX-Befehl auflösen?

googleMapEngine.executeScript(String); 

Ursache, wenn ich versuche, dies:

googleMapEngine.executeScript(
     "var latlng = new google.maps.LatLng(59.438722, 24.745278);" + 
     "var myOptions = {" + 
      "zoom: 15," + 
      "center: latlng," + 
      "mapTypeId: google.maps.MapTypeId.ROADMAP," + 
      "mapTypeControl: false," + 
      "navigationControl: false," + 
      "streetViewControl: false," + 
      "backgroundColor: '#666970'," + 
      "disableDefaultUI: true" + 
     "};" + 
     "" + 
     "var map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);"); 

ich mit dem Fehler in logcat Ende:

I/System.out( 809): [JVDBG] Error firing event 

W/System.err( 809): java.lang.ClassNotFoundException: com.sun.webkit.NativeWebView 

W/System.err( 809): at java.lang.Class.classForName(Native Method) 

W/System.err( 809): at java.lang.Class.forName(Class.java:309) 

W/System.err( 809): at com.oracle.dalvik.InternalWebView._fireLoadEvent(InternalWebView.java:347) 

W/System.err( 809): at com.oracle.dalvik.InternalWebView.fireLoadEvent(InternalWebView.java:140) 

W/System.err( 809): at com.oracle.dalvik.InternalWebView.access$400(InternalWebView.java:43) 

W/System.err( 809): at com.oracle.dalvik.InternalWebView$MyJavaScriptInterface.processHTML(InternalWebView.java:363) 

W/System.err( 809): at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method) 

W/System.err( 809): at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:39) 

W/System.err( 809): at android.os.Handler.dispatchMessage(Handler.java:102) 

W/System.err( 809): at android.os.Looper.loop(Looper.java:145) 

W/System.err( 809): at android.os.HandlerThread.run(HandlerThread.java:61) 

W/System.err( 809): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.sun.webkit.NativeWebView" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib, /system/lib]] 

W/System.err( 809): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 

W/System.err( 809): at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 

W/System.err( 809): at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 

W/System.err( 809): ... 11 more 

W/System.err( 809): Suppressed: java.lang.ClassNotFoundException: com.sun.webkit.NativeWebView 

W/System.err( 809):  at java.lang.Class.classForName(Native Method) 

W/System.err( 809):  at java.lang.BootClassLoader.findClass(ClassLoader.java:781) 

W/System.err( 809):  at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) 

W/System.err( 809):  at java.lang.ClassLoader.loadClass(ClassLoader.java:504) 

W/System.err( 809):  ... 12 more 

W/System.err( 809): Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available 

E/AndroidRuntime( 809): FATAL EXCEPTION: JavaFX Application Thread 

E/AndroidRuntime( 809): Process: com.SundaeThePugApp, PID: 809 

E/AndroidRuntime( 809): java.lang.UnsupportedOperationException: Not supported yet. 

E/AndroidRuntime( 809): at com.sun.webkit.WebPage.executeScript(WebPage.java:153) 

E/AndroidRuntime( 809): at javafx.scene.web.WebEngine.executeScript(WebEngine.java:860) 

E/AndroidRuntime( 809): at com.SundaeThePugApp.SundaeThePugController$1.changed(SundaeThePugController.java:202) 

E/AndroidRuntime( 809): at com.SundaeThePugApp.SundaeThePugController$1.changed(SundaeThePugController.java:200) 

E/AndroidRuntime( 809): at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:182) 

E/AndroidRuntime( 809): at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81) 

E/AndroidRuntime( 809): at javafx.beans.property.ReadOnlyObjectWrapper$ReadOnlyPropertyImpl.fireValueChangedEvent(ReadOnlyObjectWrapper.java:176) 

E/AndroidRuntime( 809): at javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:142) 

E/AndroidRuntime( 809): at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:112) 

E/AndroidRuntime( 809): at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:146) 

E/AndroidRuntime( 809): at javafx.scene.web.WebEngine$LoadWorker.updateState(WebEngine.java:1023) 

E/AndroidRuntime( 809): at javafx.scene.web.WebEngine$LoadWorker.dispatchLoadEvent(WebEngine.java:1134) 

E/AndroidRuntime( 809): at javafx.scene.web.WebEngine$LoadWorker.access$1000(WebEngine.java:1016) 

E/AndroidRuntime( 809): at javafx.scene.web.WebEngine$PageLoadListener.dispatchLoadEvent(WebEngine.java:1003) 

E/AndroidRuntime( 809): at com.sun.webkit.WebPage.fireLoadEvent(WebPage.java:251) 

E/AndroidRuntime( 809): at com.sun.webkit.NativeWebView$1.run(NativeWebView.java:100) 

E/AndroidRuntime( 809): at com.sun.javafx.application.PlatformImpl.lambda$null$155(PlatformImpl.java:295) 

E/AndroidRuntime( 809): at com.sun.javafx.application.PlatformImpl.access$lambda$18(PlatformImpl.java) 

E/AndroidRuntime( 809): at com.sun.javafx.application.PlatformImpl$$Lambda$19.run(Unknown Source) 

E/AndroidRuntime( 809): at java.security.AccessController.doPrivileged(AccessController.java:52) 

E/AndroidRuntime( 809): at com.sun.javafx.application.PlatformImpl.lambda$runLater$156(PlatformImpl.java:294) 

E/AndroidRuntime( 809): at com.sun.javafx.application.PlatformImpl.access$lambda$5(PlatformImpl.java) 

E/AndroidRuntime( 809): at com.sun.javafx.application.PlatformImpl$$Lambda$6.run(Unknown Source) 

E/AndroidRuntime( 809): at com.sun.glass.ui.monocle.RunnableProcessor.runLoop(RunnableProcessor.java:92) 

E/AndroidRuntime( 809): at com.sun.glass.ui.monocle.RunnableProcessor.run(RunnableProcessor.java:51) 

E/AndroidRuntime( 809): at java.lang.Thread.run(Thread.java:818) 

V/ApplicationPolicy(3468): isApplicationStateBlocked userId 0 pkgname com.SundaeThePugApp 

V/ApplicationPolicy(3468): isApplicationStateBlocked userId 0 pkgname com.SundaeThePugApp 

V/ApplicationPolicy(3468): isApplicationStateBlocked userId 0 pkgname com.sec.android.app.launcher 

Alle erhaltenen Bewertungen werden die meisten begrüßen :)

+0

Java.lang.ClassNotFoundException: com.sun.webkit.NativeWebView Dies bedeutet, dass Sie diese Klasse nicht in Ihrem Projekt befinden, was bedeutet, dass Sie das zugehörige jar importieren müssen. Ich hoffe, dies hilft Ihnen, auf dem richtigen Weg zu sein, da ich nicht sicher bin, was der Rest Ihrer Probleme ist. – XaolingBao

Antwort

1

OK nach reiflicher Versuch und Irrtum Ich bin zu dem Schluss gekommen, dass JavaFXPorts im Großen und Ganzen verdammt gut ist, aber es gibt einige Vorbehalte:

1) Medien- und Audiofunktionen sind derzeit nicht mit Ihrer App möglich, da eine Fatal Exception ausgelöst wird.

2) Webview ist auf das Rendering nicht Javascript Websites beschränkt.

Ich werde erklären, wenn ich benutze:

googleMapEngine.load("http://fxexperience.com/"); 

Perfect, funktioniert alles einwandfrei und die Seite korrekt gerendert.

Aber wenn ich dies tun:

googleMapEngine.setJavaScriptEnabled(true);  
googleMapEngine.load("https://www.openstreetmap.org/"); 

ich NO Karte und alles, was ich in meiner app sehen kann, ist die Open Street Map-Logo und eine Menü-Taste, sonst wird der Rest der Webansicht ist Weiß! Auch die Aktivierung von JavaScript in JavaFX scheint keinen Effekt zu haben auf Androids webview verlassen Androids Standardeinstellung zu false!

Was ist, wenn ich die einfachste Google Map-URL möglich tun:

googleMapEngine.setJavaScriptEnabled(true);  
googleMapEngine.load("https://www.google.com/maps/"); 

ich nichts aber einen weißen Bildschirm bekommen! Auch die Aktivierung von JavaScript in JavaFX scheint keinen Effekt zu haben auf Androids webview verlassen Androids Standardeinstellung zu false!

wenn ich eine lokale HTML-Datei mit ihrem Pfad tun richtig gemacht:

googleMapEngine.setJavaScriptEnabled(true); 
googleMapEngine.load(getClass().getClassLoader().getResource("googleLondonMap.html").toExternalForm()); 

Ich erhalte eine net :: ERR_UNKNOWN_URL_SCHEME im Android Webansicht.

Schließlich, wie Androids Webview Standard-Javascript-Einstellung auf false festgelegt ist. Dies bedeutet, wenn immer Sie versuchen JavaFX-Anweisung zu verwenden:

googleMapEngine.executeScript(foo()); 

Es wird eine FATAL AUSNAHME in Ihrem Android-App verursachen. Es wäre schön, wenn Johan Vos und Co. diese Android-WebView-Portierungsprobleme mit zukünftigen Updates für ihre hervorragende Arbeit an JavaFXPorts überwinden könnten!

+0

Danke für die Berichterstattung. Wir haben ein Problem angemeldet, um herauszufinden, warum 'executeScript()' auf Android fehlschlägt. In der Zwischenzeit können Sie sich diese [post] (http://gluonhq.com/announcing-gluon-maps/) als Alternative ansehen, die weder WebView noch JavaScript benötigt. –

+0

Vielen Dank, Jose, für Ihre Hilfe und den von Ihnen geposteten Link. Ich werde es mir ansehen. Ich denke auch, dass ein Problem auftreten sollte, warum 'webEngine.setJavaScriptEnabled (true);' nicht funktioniert oder die gewünschte Wirkung auf die Android-Webansicht hat. – zermatt