JavaFX Webview与Android的Webview的兼容性如何? [英] How compatible is JavaFX Webview with Android's Webview?

查看:231
本文介绍了JavaFX Webview与Android的Webview的兼容性如何?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I've been trying to port a JavaFX project using Netbeans and Gradle into an Android APK file format and for the most part it works well! The issue I'm having is with the WebView component of Android in particular? I can get it to show a static webpage in Android Webview without my app falling over with a FATAL EXCEPTION. But if I create a dynamic webpage in JavaFX Webview using JavaScript, Androids Webview doesn't appear to cope at all?

尽管在JavaFX中我将JavaScript设置为true:

Eventhough in JavaFX I set enable JavaScript to true:

googleMapEngine.setJavaScriptEnabled(true);

我知道在Android Webview中 - 默认情况下JavaScript已关闭。
我无法让它在Android中运行。此外,Android Webview是否知道如何解析JavaFX命令?

As I'm aware that in Android Webview - JavaScript is switched off by default. I cannot get it to work in Android. In addition, does Android Webview know how to resolve the JavaFX command?

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 end up with error in 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整体上非常好,但它们有一些警告:

OK after much trial and errors I have come to the conclusion that JavaFXPorts on the whole is damn good, but their are some caveats:

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

1) Media and Audio capabilities are not possible with your app at present as it throws a Fatal Exception.

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

2) Webview is limited to rendering non javascript websites.

我会解释,如果我使用:

I'll explain, if I use:

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

完美,一切正常,页面也能正常呈现。

但如果我这样做:

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

我得到 NO 地图,我在我的应用中看到的就是打开街道地图徽标和菜单按钮,否则webview的其余部分为白色!同样在JavaFX中启用JavaScript似乎对Androids webview 无影响,将 Androids默认设置设置为false!

I get NO map and all I can see in my app is the open street map logo and a menu button, otherwise the rest of the webview is white! Also enabling JavaScript in JavaFX seems to have no effect on Androids webview leaving Androids default setting to false!

什么关于我是否可以使用最简单的Google地图网址:

What about if I do the most simplest Google Map url possible:

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

我得到没有但是白屏!同样在JavaFX中启用JavaScript似乎对Androids webview 无影响,将 Androids默认设置保留为false!

I get nothing but a white screen! Also enabling JavaScript in JavaFX seems to have no effect on Androids webview leaving Androids default setting to false!

如果我做了一个正确的路径的本地html文件:

if I do a local html file with its path correctly made:

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

我在Android网页浏览中收到 net :: ERR_UNKNOWN_URL_SCHEME

I receive a net::ERR_UNKNOWN_URL_SCHEME in the Android webview.

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

Finally, as Androids Webview default javascript setting is set to false. This means if ever you try to use JavaFX statement:

googleMapEngine.executeScript(foo());

这会在您的Android应用中导致致命异常。如果Johan Vos和Co能够克服这些Android WebView移植问题以及将来对JavaFXPorts的出色工作的更新,那将是很好的!

It will cause a FATAL EXCEPTION in your android app. It would be sweet if Johan Vos and Co can overcome these Android WebView porting issues with future updates to their excellent work on JavaFXPorts!

这篇关于JavaFX Webview与Android的Webview的兼容性如何?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆