it-swarm.com.de

So rufen Sie HTML-Inhalte von WebView ab (als Zeichenfolge)

Wie rufe ich alle aktuell in einer WebView angezeigten HTML-Inhalte ab?

Ich habe WebView.loadData() gefunden, konnte aber nicht das entgegengesetzte Äquivalent finden (z. B. WebView.getData ()).

Bitte beachten Sie, dass ich diese Daten für Webseiten abrufen möchte, auf die ich keinen Einfluss habe (d. H. Ich kann in diese Seiten keine Javascript-Funktion einfügen, sodass in WebView eine JavaScript-Schnittstelle aufgerufen würde).

36
JohnK

Leider ist dies nicht einfach.

Siehe Wie erhalte ich den Webseiteninhalt aus einer WebView?

Sie können einfach ein HttpRequest auf derselben Seite wie Ihr WebView erstellen und die Antwort erhalten.

17
brendan

Sie können dies erreichen durch:

final Context myApp = this;

/* An instance of this class will be registered as a JavaScript interface */
class MyJavaScriptInterface
{
    @SuppressWarnings("unused")
    public void processHTML(String html)
    {
        // process the html as needed by the app
    }
}

final WebView browser = (WebView)findViewById(R.id.browser);
/* JavaScript must be enabled if you want it to work, obviously */
browser.getSettings().setJavaScriptEnabled(true);

/* Register a new JavaScript interface called HTMLOUT */
browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");

/* WebViewClient must be set BEFORE calling loadUrl! */
browser.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url)
    {
        /* This call inject JavaScript into the page which just finished loading. */
        browser.loadUrl("javascript:window.HTMLOUT.processHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
    }
});

/* load a web page */
browser.loadUrl("http://lexandera.com/files/jsexamples/gethtml.html");

Sie erhalten den gesamten HTML-Contnet in der processHTML-Methode . Und stellen keine weitere Anforderung für eine Webseite. Dies ist auch eine effizientere Methode.

Vielen Dank.

32
webView.evaluateJavascript("(function(){return window.document.body.outerHTML})();", 
      new ValueCallback<String>() {
          @Override
          public void onReceiveValue(String html) {

          }
      });
10
noamtcohen

Sie können die von WebView gestellten HTTP-Anforderungen abfangen und den HTML-Code so ändern, dass er die JavaScript-Funktionen enthält, die Sie zur Kommunikation mit der HTML-Seite benötigen. Sie fangen HTTP-Anforderungen über die WebViewClient-Methode ShouldInterceptRequest () ab.

Mit diesem Mechanismus können Sie auf die geladene Seite zugreifen, indem Sie sie selbst laden, ändern, bevor Sie sie an WebView übergeben, und sie sogar lokal zwischenspeichern, wenn Sie möchten.

1
Jakob Jenkov

Fügen Sie dies Ihrem Code hinzu:

private String getUrlSource(String site) throws IOException {
    //GNU Public, from ZunoZap Web Browser
    URL url = new URL(site);
    URLConnection urlc = url.openConnection();
    BufferedReader in = new BufferedReader(new InputStreamReader(
    urlc.getInputStream(), "UTF-8"));
    String inputLine;
    StringBuilder a = new StringBuilder();
    while ((inputLine = in.readLine()) != null)
    a.append(inputLine);
    in.close();

    return a.toString();
}

dann sagen wir Ihnen, was Sie von Googles Quelle bekommen würden:

getURLSource("http://google.com");
1
Isaiah Patton

sie können Daten über JavaScriptInterface von Webview aus übergeben. Ich habe dies getan. Speichern Sie die Daten in einer statischen Variablen und verarbeiten Sie sie anschließend unter Android-Anwendung

0
Ryan