WebViewのJavascriptインターフェースを使用して、ページの読み込みが完了したときにHTMLソース全体を返すことができます。これを行うには、独自のWebViewClientをWebViewに割り当てる必要があります。
これを行うには、Activityクラスで次のようなものを使用します-ActivityがObserverを実装していることを確認します。
public void onCreate(Bundle savedInstanceState) {
// ...
webView.setWebViewClient(new MyWebViewClient());
HtmlJSInterface htmlJSInterface = new HtmlJSInterface();
webView.addJavascriptInterface(htmlJSInterface, "HTMLOUT");
htmlJSInterface.addObserver(this);
// ...
}
// Called when our JavaScript Interface Observables are updated.
@Override
public void update(Observable observable, Object observation) {
// Got full page source.
if (observable instanceof HtmlJSInterface) {
html = (String) observation;
onHtmlChanged();
}
}
private void onHtmlChanged() {
// Do stuff here...
}
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
// When each page is finished we're going to inject our custom
// JavaScript which allows us to
// communicate to the JS Interfaces. Responsible for sending full
// HTML over to the
// HtmlJSInterface...
isStarted = false;
isLoaded = true;
timeoutTimer.cancel();
view.loadUrl("javascript:(function() { "
+ "window.HTMLOUT.setHtml('<html>'+"
+ "document.getElementsByTagName('html')[0].innerHTML+'</html>');})();");
}
}
}
次に、HtmlJSInterfaceクラスを次のように作成します。
public class HtmlJSInterface extends Observable {
private String html;
/**
* @return The most recent HTML received by the interface
*/
public String getHtml() {
return this.html;
}
/**
* Sets most recent HTML and notifies observers.
*
* @param html
* The full HTML of a page
*/
public void setHtml(String html) {
this.html = html;
setChanged();
notifyObservers(html);
}
}