Обработка обещаний из Android WebView с помощью AssessmentJavascript
Я работаю с Android WebView и пытаюсь обработать возврат обещания JavaScript из WebView на стороне Java после его вызова с помощью AssessmentJavascript.
document.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() так, чтобы она не была асинхронной, и вернула строку, все будет работать нормально, поэтому я пытаюсь понять, как обработать это обещание в коде Java, чтобы получить результат.
Я видел несколько похожих вопросов, но в данном случае ни один из ответов не помог.
1 ответ
Как я уже упоминал в комментарии, вы возвращаете обещание из функции async (которую нельзя использовать непосредственно в
onReceiveValue
).
Чтобы «протолкнуть» результат из
getAnnotations
вернувшись к Android, вы должны использовать
JavascriptInterface
:
В своей деятельности вы можете определить:
@JavascriptInterface
public void onAnnotations(String result) {
Toast.makeText(WebViewActivity.this, result, Toast.LENGTH_LONG).show();
}
и зарегистрируйте его с помощью:
webView.addJavascriptInterface(this, "bridge");
В этом случае метод
onAnnotations
сопротивляется в рамках действия, которое также содержит
webView
. Поэтому я использую «это» в качестве первого аргумента. «Мост» - это пространство имен, в котором вы можете найти функцию onAnnotations на стороне JavaScript.
Теперь все, что вам нужно сделать, это позвонить из JavaScript в Android:
function getAnnotations() {
pdfViewer.getAnnotations().then(result => {
bridge.onAnnotations(JSON.stringify(result ,null,2));
});
}