Добавьте прослушиватель событий окна в WebView и вызовите функцию Java - PullRequest
0 голосов
/ 27 января 2020

Я отображаю веб-страницу в моем приложении Android, используя WebView, эта веб-страница вызывает событие сообщения окна и предоставляет некоторые данные через это событие. Я не могу редактировать код сайта. Но мне нужно получить доступ к данным из события сообщения.

Для этого я добавляю прослушиватель события JavaScript с помощью метода evaluateJavascript() и пытаюсь вызвать функцию Java из JavaScript используя addJavascriptInterface().

Мой код пока:

public class MyActivity extends AppCompatActivity {

    @Override
    @SuppressLint("SetJavaScriptEnabled")
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        WebView webView = new WebView(this);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setDomStorageEnabled(true);

        webView.addJavascriptInterface(new JsObject(this), "Android");

        webView.evaluateJavascript("window.addEventListener('message', (e) => {Android.logData('Test String')})", null);

        webView.loadUrl("https://example.com/mypage");

        setContentView(webView);
    }

    private class JsObject {
        Context context;

        JsObject(Context context) {
            this.context = context;
        }

        @JavascriptInterface
        public void logData(String s) {
            Log.v("EEE", s);
        }
    }

}

Но обработчик события не вызывается. Я не уверен, что это правильный подход. Пожалуйста помоги. ТИА.

1 Ответ

0 голосов
/ 27 января 2020

Переключение порядка ваших вызовов loadUrl и evaluateJavascript. loadUrl сбрасывает это состояние. Примечание: для этого может потребоваться изменение кода на странице, чтобы избежать появления условия гонки, вызывающего сообщение.

Из evaluateJavascript документов :

глобальных переменных и функции, определенные до вызова loadUrl (java .lang.String), не будут существовать на загруженной странице

...