WebView 表示中のHTMLソース

WebViewで表示中のページのHTML を参照するのに android.os.AsyncTask
javascriptouterHTML を実行してソース表示のActivityを起動するのがスマートである。

javascript インターフェースを定義

BrowseRelay jsRelay;

webview.getSettings().setJavaScriptEnabled(true);
jsRelay = new BrowseRelay();
webview.addJavascriptInterface(jsRelay,"android");

BrowseRelayの中は、outerHTMLの結果をセットする中で、取得の完了を検知するためのフラグを true にする。

public class BrowseRelay{

   private String htmltxt;
   private boolean htmlget;
   public String getHtmltxt(){
      return htmltxt;
   }
   public void setHtmltxt(String htmltxt){
      this.htmltxt = htmltxt;
      htmlget = true;
   }
   public boolean isHtmlget(){
      return htmlget;
   }
   public void startHtmlget(){
      this.htmlget = false;
   }
}

AsyncTaskを継承してインナークラスで javascript outerHTML を実行する。

class HtmlViewTask extends AsyncTask<String,Integer,String>{
   private Context context;
   protected HtmlViewTask(Context context){
      this.context = context;
   }
   @Override
   protected void onPreExecute(){
      showDialog(2);
   }
   @Override
   protected String doInBackground(String...params){
      webview.loadUrl(params[0]);
      while(!jsRelay.isHtmlget()){
         try{Thread.sleep(100);}catch(InterruptedException e){}
      }
      return jsRelay.getHtmltxt();

   }
   @Override
   protected void onPostExecute(String result){
      dismissDialog(2);
      Intent it = new Intent(this.context,HTMLViewActivity.class);
      it.putExtra("source",result);
      startActivity(it);

   }
}
インナークラスから、HTML取得中のダイアログ表示の為に、Activity に以下を用意

@Override
protected Dialog onCreateDialog(int id){
   Dialog dlg = new Dialog(this);
   dlg.requestWindowFeature(Window.FEATURE_NO_TITLE);
   if (id==0){
      dlg.setContentView(R.layout.webdialog);
   }else if(id==1){
      dlg.setContentView(R.layout.webssldialog);
   }else if(id==2){
      dlg.setContentView(R.layout.loadingdialog);

   }
   dlg.getWindow().setBackgroundDrawable(new ColorDrawable(0));
   return dlg;
}

MENUキーなどで実行する onOptionsItemSelected などで以下を実行する。

jsrelay.startHtmlget();
new HtmlViewTask(this).execute("javascript:android.setHtmltxt(document.documentElement.outerHTML);");