在 android 中对 Web 视图进行 javascript 注入并获取 HTML 到字符串

Make javascript injection to web view in android and get HTML to a string

我已经尝试了很长时间,想找到一种方法来从我在 android 应用程序中加载的 Web 视图中获取 HTML 内容。我发现一些指南指出我需要使用 javascript 界面,并且在某种程度上我已经做到了。现在的问题是我无法完成最后一步,我实际上得到了一个我可以操作的 HTML 的字符串。我需要一个字符串,在我从 Web 视图中检索到它后,我可以在其中使用 java 代码中的 html。到目前为止,这是我的代码:

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

        setContentView(R.layout.activity_login);

    //login button
        Button loginButton = (Button) findViewById(R.id.loginButton);
        final WebView webview = (WebView)(findViewById(R.id.webview));

        loginButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // Call private method

                webview.setWebViewClient(new WebViewClient() {
                    @Override
                    public void onPageFinished(WebView view, String url) {
        /* This call inject JavaScript into the page which just finished loading. */
                        webview.loadUrl("javascript:window.HTMLOUT.processHTML('<head>'+document.getElementsByTagName('body')[0].innerHTML+'</head>');");
                        webview.setVisibility(View.INVISIBLE);

                    }
                });

                webview.setVisibility(View.VISIBLE);

                MyJavaScriptInterface JSInterface = new MyJavaScriptInterface();

                webview.getSettings().setJavaScriptEnabled(true);
                webview.postUrl(url, SAMLreq.getBytes());

                webview.addJavascriptInterface(JSInterface, "HTMLOUT");
                //The html from the webview should be stored here
                String htmlFromWebView = JSInterface.getTheHTMLToGo();


    class MyJavaScriptInterface {

        private String theHTMLToGo = null;

        public String getTheHTMLToGo() {
            return theHTMLToGo;
        }

        public void setTheHTMLToGo(String theHTMLToGo) {
            this.theHTMLToGo = theHTMLToGo;
        }

        @SuppressWarnings("unused")
        @JavascriptInterface
        public void processHTML(String html) {
          theHTMLToGo = html



        }
    }
}

我可以在调试时看到 java 脚本方法中的 'html' 字符串 'processHTML' 实际上包含正确的值,但我仍然不知道如何从那里把它弄出来。

解决方案一直就在我面前。正如我的 post 对这个问题的评论:我基本上是在做正确的事。我的问题是我调用方法 getTheHTMLToGo() 太早了。我将一些代码移到了 processHTML(String html) 中,并确保流程在我继续之前完成。我通过在 processHTML(String html) 方法中调用我需要做的下一件事来做到这一点。