gpt4 book ai didi

android - 使用 evaluateJavascript 处理来自 Android WebView 的 Promise

转载 作者:行者123 更新时间:2023-12-04 14:50:15 24 4
gpt4 key购买 nike

我正在使用 Android WebView,并尝试在使用 evaluateJavascript 调用它后,在 Java 端处理从 WebView 返回的 JavaScript promise。

文档.java

Button buttonAnnotations = findViewById(R.id.buttonAnnotations);
buttonAnnotations.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
wv.evaluateJavascript("javascript:getAnnotations();", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Toast.makeText(getApplicationContext(), value, Toast.LENGTH_SHORT).show();
}
});
}
});

index.html

async function getAnnotations() {
await pdfViewer.getAnnotations().then(result => {
return JSON.stringify(result ,null,2);
});
}

如果我将 getAnnotations() 函数更改为不是 async 并返回一个字符串,一切正常,所以我试图弄清楚如何在 java 代码中处理这个 promise 以获得结果。

我见过几个类似的问题,但在这种情况下似乎没有一个答案有效。

最佳答案

正如我在评论中提到的,您正在从异步函数 getAnnotations 返回一个 Promise(不能直接在 onReceiveValue 中使用)。

为了将 getAnnotations 的结果“推送”回 Android,您必须使用 JavascriptInterface:

在您的 Activity 中,您可以定义:

@JavascriptInterface
public void onAnnotations(String result) {
Toast.makeText(WebViewActivity.this, result, Toast.LENGTH_LONG).show();
}

并注册:

webView.addJavascriptInterface(this, "bridge");

在这种情况下,onAnnotations 方法在还包含 webView 的 Activity 中运行。因此,我使用“this”作为第一个论点。“桥”是命名空间,您可以在其中找到 JavaScript 端的 onAnnotations 函数。

现在您所要做的就是从 JavaScript 调用 Android:

function getAnnotations() {
pdfViewer.getAnnotations().then(result => {
bridge.onAnnotations(JSON.stringify(result ,null,2));
});
}

关于android - 使用 evaluateJavascript 处理来自 Android WebView 的 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69185210/

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