То, что я в итоге сделал - что решает мою непосредственную проблему - это вызов метода JavaScript через метод WebView.evaluateJavascript. При вызове из WebViewClient.onPageFinished страница закончила загрузку, поэтому все элементы доступны. Хотя этот метод не важен для моего случая, он также может возвращать значение в код Java. Так что, хотя это не общая замена для JavascriptInterface, он решает некоторые из его случаев использования.

e попросил меня обратитьсяhttps://support.google.com/faqs/answer/9095419 в моем приложении для Android, что в основном означает не использовать механизм внедрения JavaScript для веб-страницы, загружаемой через HTTP.

Не использовать этот механизм (вариант 1) не работает для меня. Установка android: используетCleartextTraffic в false также не работает, так как приложение использует не-HTTPS-трафик в других местах. Поэтому у меня остается «вы можете убедиться, что любые затронутые WebViews не загружают какие-либо URL-адреса со схемами HTTP через loadUrl», что я с радостью делаю, поскольку мое приложение использует только URL-адреса file: /// для загрузки содержимого в WebView. , что должно быть хорошо с точки зрения безопасности. Но как мне кодировать метод shouldOverrideUrlLoading, чтобы программа проверки Google распознала, что я использую только URL-адреса file: ///?

Обратите внимание, что вопрос отличается от обоихИсправление уязвимости интерфейса JavaScript (потому что мне понятно, о чем спрашивают) иВ Android уязвимость интерфейса JavaScript (потому что я не использую HTTP, а file: /// URLs).

Редактировать: добавив мой метод shouldOverrideUrlLoading. (Это не весь метод, а его существенная часть.)

    @Override
    public boolean shouldOverrideUrlLoading (WebView browser, String url) {
        if (url.startsWith("file:///")) {
            // This is my web site, so do not override; let my WebView load the page
            browser.loadUrl(url);
            return true;
        }

        // Otherwise, the link is not for a page on my site, or is an entirely different kind of URI
        // (like tel:, geo: or mailto:), so launch another Activity that handles URLs
        act.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
        return true;
    }

Ответы на вопрос(1)

Ваш ответ на вопрос