Android WebView でリンクを押した時、javascript なら location.href がセットされた時、
インターセプトするなら、WebViewClient の
shouldOverrideUrlLoading(WebView view,String url)
を使うが、FORM送信、POST 用のインターセプト目的のメソッドは WebViewClient には存在しない。
WebViewClient の onPageStarted と、javascript インターフェースを組み合わせるしかないみたい。
onPageStarted で、HTMLの form タグと input タグの情況を WebView # loadUrl("javascript:
の実行で javascript インターフェースでセットすることで読み込む。
WebView webview = (WebView)findViewById(R.id.webView);
webview.getSettings().setJavaScriptEnabled(true);
// jsRelay = form と input タグの情況を納めるインターフェース
final JsRelay jsRelay = new JsRelay();
webview.addJavascriptInterface(jsRelay,"android");
webview.setWebViewClient(new WebViewClient(){
@Override
public void onPageStarted(WebView view,String url,Bitmap favicon){
// form , input 取得リスト初期化、フラグ初期化
jsRelay.init();
StringBuilder sb = new StringBuilder();
sb.append("javascript:var f=document.getElementsByTagName('form');");
sb.append("for(i=0;i < f.length;i++){");
sb.append(" android.steelForm(f[i].getAttribute('method'),f[i].getAttribute('action'));");
sb.append("}");
sb.append("var p=document.getElementsByTagName('input');");
sb.append("for(i=0;i < p.length;i++){");
sb.append(" android.steelInput(p[i].getAttribute('name'),p[i].value);");
sb.append("}");
sb.append("android.steelEnd();");
webview.loadUrl(sb.toString());
while(!jsRelay.isSteelEnd()){
try{Thread.sleep(100);}catch(InterruptedException e){}
}
// jsRelay から情況GETして処理を。。
// onPageStarted の url が、form の action とマッチする点で処理を記述
}
}
-------
public class JsRelay{
private boolean steelend;
public void init(){
steelend = false:
// form,input情況の蓄積リストを初期化
}
public void steelForm(String method,String action){
// リストなどに蓄積する
}
public void steelInput(String name,String value){
// リストなどに蓄積する
}
public boolean isSteelEnd(){
return this.steelend;
}
public void steelEnd(){
this.steelend = true;
}
}