Обработка обещаний из 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));
    });
}
Другие вопросы по тегам