Android addJavascriptInterace,调用本机函数给我一个类型错误

发布于 2025-01-06 22:23:20 字数 2421 浏览 3 评论 0原文

好的,伙计们。我想做的事情:我有一些用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不甘平庸 2025-01-13 22:23:20

显然,当您尝试将本机函数作为回调传递给其他方法时,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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文