Android addJavascriptInterace,调用本机函数给我一个类型错误
好的,伙计们。我想做的事情:我有一些用 javascript 编写的后端代码(该项目最初应该是一个网络应用程序),并且我已经在我的 android web 视图中添加了一个 javascript 接口,当我按 a我的 ui 中的按钮,javascript 代码做了一些事情,然后在完成后调用我的 javascript 界面中的函数...来自我的 javascript 界面的代码:
public void onReady() {
backend.loadUrl("javascript:dokus.backend.onLoginStatusChange(Bridge.onLoginStatusChange);");
backend.loadUrl("javascript:dokus.backend.onProjectsChange(Bridge.onProjectsChange);");
backend.loadUrl("javascript:dokus.backend.onLatestEntriesChange(Bridge.onLatestEntriesChange);");
}
public void onLoginStatusChange (boolean loggedIn, String error) {
Toast.makeText(mainActivity, "LoginStatusChange", Toast.LENGTH_SHORT).show();
}
...
我已经验证了 onReady 函数被调用,所以这不是问题。 调用 onLoginStatusChange 的 javascript 函数如下:
function _login_callback(loggedIn, msg) {
if (loggedIn) {
_get_projects();
_get_latest_entries();
}
console.log(_login_status_changed_callback);
if (_login_status_changed_callback !== undefined)
_login_status_changed_callback (loggedIn, msg);
}
我得到的错误是这样的:“行:180,类型错误”。这就是我从 WebChromeView 函数中获得的所有内容,该函数打印从 console.log() 到 toast 消息的所有内容。
console.log(_login_status_changed_callback) 打印出以下内容:
function onLoginStatusChange () {
[native code]
}
我已经验证了函数调用了正确的参数(布尔值和字符串),所以这也不应该是错误......我在损失,我该怎么办?
Web 视图的设置代码:
private void setupBackend () {
final DokusActivity that = this;
backend = new WebView(this);
BackendBridge.getInstance().initInstance(this, backend);
backend.getSettings().setJavaScriptEnabled(true);
backend.getSettings().setDomStorageEnabled(true);
backend.addJavascriptInterface(BackendBridge.getInstance(), "Bridge");
backend.setWebViewClient(new WebViewClient() {
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Toast.makeText(that, "Oh no! " + description, Toast.LENGTH_SHORT).show();
}
});
backend.setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage (ConsoleMessage consoleMessage) {
Toast.makeText(that, "Oh no! " + consoleMessage.lineNumber() + ": " + consoleMessage.message(), Toast.LENGTH_SHORT).show();
return false;
}
});
backend.loadUrl("file:///android_asset/index.html");
}
Ok guys. What I'm trying to do: I've got some backend code written in javascript (the project was originally supposed to be a web-app) and I've added a javascript interface to my android web view, and when I press a button in my ui, the javascript code does some stuff, then calls a function in my javascript interface when it is done... The code from my javascript interface:
public void onReady() {
backend.loadUrl("javascript:dokus.backend.onLoginStatusChange(Bridge.onLoginStatusChange);");
backend.loadUrl("javascript:dokus.backend.onProjectsChange(Bridge.onProjectsChange);");
backend.loadUrl("javascript:dokus.backend.onLatestEntriesChange(Bridge.onLatestEntriesChange);");
}
public void onLoginStatusChange (boolean loggedIn, String error) {
Toast.makeText(mainActivity, "LoginStatusChange", Toast.LENGTH_SHORT).show();
}
...
I've already verified that the onReady function is called, so that's not the problem.
The javascript function which calls onLoginStatusChange is this following:
function _login_callback(loggedIn, msg) {
if (loggedIn) {
_get_projects();
_get_latest_entries();
}
console.log(_login_status_changed_callback);
if (_login_status_changed_callback !== undefined)
_login_status_changed_callback (loggedIn, msg);
}
The error i get is this: "Line: 180, type error". That's all i get from my WebChromeView function, that prints everything from console.log() to a toast message.
the console.log(_login_status_changed_callback) prints out the following:
function onLoginStatusChange () {
[native code]
}
I've verified that the correct arguments are called to the function (a bool and a string), so that shouldn't be the error either... I'm at a loss, what do i do?
setup code for the web view:
private void setupBackend () {
final DokusActivity that = this;
backend = new WebView(this);
BackendBridge.getInstance().initInstance(this, backend);
backend.getSettings().setJavaScriptEnabled(true);
backend.getSettings().setDomStorageEnabled(true);
backend.addJavascriptInterface(BackendBridge.getInstance(), "Bridge");
backend.setWebViewClient(new WebViewClient() {
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Toast.makeText(that, "Oh no! " + description, Toast.LENGTH_SHORT).show();
}
});
backend.setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage (ConsoleMessage consoleMessage) {
Toast.makeText(that, "Oh no! " + consoleMessage.lineNumber() + ": " + consoleMessage.message(), Toast.LENGTH_SHORT).show();
return false;
}
});
backend.loadUrl("file:///android_asset/index.html");
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
显然,当您尝试将本机函数作为回调传递给其他方法时,Web 视图会出现问题。我所做的是创建一个新的 .js 文件,该文件用作回调,所有 js 回调所做的就是调用本机方法。
Apparently, the webview has issues when you try to pass native functions as callbacks to other methods. What I did was create a new .js file which works as callbacks, all the js callbacks do, is calling the native method.