JavaFX Webview与Android的兼容性如何'的Web视图

How compatible is JavaFX Webview with Android's Webview?

本文关键字:视图 Web Webview Android 兼容性 JavaFX      更新时间:2024-06-09

我一直在尝试将一个使用Netbeans和Gradle的JavaFX项目移植到Android APK文件格式中,在大多数情况下,它运行良好!我遇到的问题尤其是安卓的WebView组件?我可以让它在Android Webview中显示静态网页,而不会让我的应用程序出现致命异常。但是,如果我使用JavaScript在JavaFX Webview中创建一个动态网页,Androids Webview似乎根本无法处理?

尽管在JavaFX中我设置了启用JavaScript为true:

googleMapEngine.setJavaScriptEnabled(true);

正如我所知,在Android Webview中,JavaScript默认关闭。我无法让它在安卓系统中工作。此外,Android Webview知道如何解析JavaFX命令吗?

googleMapEngine.executeScript(String);

因为如果我尝试这个:

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

我最终在logcat中出现错误:

    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

欢迎所有反馈:)

好吧,经过多次尝试和错误,我得出的结论是JavaFXPorts总体上非常好,但它们有一些注意事项:

1) 您的应用程序目前无法提供媒体和音频功能,因为它会引发致命异常

2) Webview仅限于渲染javascript网站。

如果我使用,我会解释

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

完美,一切正常,页面呈现正常

但如果我这样做:

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

我得到了NO地图,我在应用程序中只能看到开放的街道地图徽标和菜单按钮,否则网络视图的其余部分都是白色的!在JavaFX中启用JavaScript似乎对Androids网络视图没有任何影响,将Androids默认设置设置为false!

如果我做最简单的谷歌地图网址可能:

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

我什么都没有得到,只有一个白色屏幕!在JavaFX中启用JavaScript似乎对Androids网络视图没有任何影响,将Androids默认设置设置为false!

如果我用正确的路径创建本地html文件:

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

我在Android网络视图中收到net::ERR_UNKNOWN_URL_SCHEME

最后,作为Androids Webview的默认javascript设置被设置为false。这意味着,如果您尝试使用JavaFX语句:

googleMapEngine.executeScript(foo());

它将在您的android应用程序中导致致命异常。如果Johan Vos和Co能够通过未来在JavaFXPorts上的出色工作更新来克服这些Android WebView移植问题,那将是一件好事!