【问题标题】:Android calling JavaScript functions in WebView with API <= 18Android 在 WebView 中使用 API <= 18 调用 JavaScript 函数
【发布时间】:2016-06-01 16:25:05
【问题描述】:

这个问题在这里并不新鲜,但我仍然无法在哪里出错。我只是想评估一些 javascript。

我的简单代码如下:

WebView wv = new WebView(context);
WebSettings settings = wv.getSettings();
settings.setJavaScriptEnabled(true);

JavaBridgeToJS bridgeToJS = new JavaBridgeToJS();
wv.addJavascriptInterface(bridgeToJS, "javaCallback");

String src = "javascript: var result= 3 + 3; window.javaCallback.resultOfAdd(result)";

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
        Log.d(TAG, "Newer than JellyBean.");
        ValueCallback<String> result = new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                Log.d(TAG, "Got in onReceiveValue: " + value);
            }
        };
        wv.evaluateJavascript(src, result);
    }else {
        Log.d(TAG, "Older than Kitkat");
        wv.loadUrl(src);
    }

public class JavaBridgeToJS {
    @JavascriptInterface
    public void resultOfAdd(String result) {
        Log.d(TAG, "Here is: " + result);
    }
}

适用于 API 19+,即使没有 if 并检查版本(我的意思是它适用于 loadUrl 以及 evaluateJavascript)

但是当我尝试 API 18 时,java 中的回调没有被调用。 我环顾四周(remove line break,或quotes missing可能被感染,在手机上观看),等等......)

到目前为止,我还没有运气。有什么想法吗?


编辑

好吧,我已经在 J​​S 中添加了处理错误的代码,以防我遗漏了什么。

wv.setWebChromeClient(new CustomWebChromeClient());

作为

public class CustomWebChromeClient extends WebChromeClient {
    private CustomWebChromeClient() {
        super();
    }

    @Override
    public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
        UILog.d(TAG, consoleMessage.message());
        return super.onConsoleMessage(consoleMessage);
    }
}

我很惊讶:

E/dalvikvm: Could not find class 'android.webkit.PermissionRequest', referenced from method com.example.WebViewDoll$CustomWebChromeClient.access$super
VFY: unable to resolve check-cast 1896 (Landroid/webkit/PermissionRequest;) in Lcom/example/WebViewDoll$CustomWebChromeClient;
E/dalvikvm: Could not find class 'android.webkit.WebChromeClient$FileChooserParams', referenced from method com.example.WebViewDoll$CustomWebChromeClient.access$super
VFY: unable to resolve check-cast 1899 (Landroid/webkit/WebChromeClient$FileChooserParams;) in Lcom/example/WebViewDoll$CustomWebChromeClient;
E/dalvikvm: Could not find class 'android.webkit.PermissionRequest', referenced from method com.example.WebViewDoll$CustomWebChromeClient.access$super

D/WebViewDoll: Uncaught TypeError: Cannot call method 'resultOfAdd' of undefined
E/Web Console: Uncaught TypeError: Cannot call method 'resultOfAdd' of undefined at null:1

【问题讨论】:

  • UPDATE 我做了一个新项目,以防万一,但仍然没有。我想这应该可以github repo

标签: javascript android webview


【解决方案1】:

我没有找到为什么这不起作用的答案,但在using js in webview 的帮助下,我能够做出解决方法......

我必须将我的 js 注入到一个 html 页面中。所以我的包装器 arround js 看起来像:

String src = "<html><head><script type=\"text/javascript\">" +
            "function myFunction()" +
            "{" +
            "    javaCallback.resultOfAdd(3+3);" +
            "}" +
            "</script></head><body onload=\"myFunction()\"/>" +
            "</html>";

而不是 wv.loadUrl 我使用的是:

wv.loadData(src, "text/html", "UTF-8"); 

这个组合的结果和需要的一样。

【讨论】:

    猜你喜欢
    • 2013-06-06
    • 2011-05-18
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2019-05-31
    • 2016-11-29
    相关资源
    最近更新 更多