gpt4 book ai didi

javascript - Android 在 WebView 中调用 API <= 18 的 JavaScript 函数

转载 作者:行者123 更新时间:2023-11-28 05:57:27 24 4
gpt4 key购买 nike

这个问题在这里并不新鲜,但我仍然无法弄清楚我出错的地方。我只是想评估一些 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 breakquotes missing (可能被感染,在手机上观看),等等...)

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

<小时/>

编辑

嗯,我在 JS 内部添加了处理错误的代码,以防万一我错过了一些东西。

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

最佳答案

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

我必须将我的 js 注入(inject)到 html 页面中。所以我的 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"); 

此组合具有所需的相同结果。

关于javascript - Android 在 WebView 中调用 API <= 18 的 JavaScript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37541677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com