2012年6月24日 星期日

取出 WebView 中的原始碼

手上的 Android 專案需碰到一種使用不太方便的會員認證機制…
某公司開發的會員認證機制是提供我們一個網頁…
用戶自行輸入帳號密碼按了確定後…網頁再經過一連串的 Redirect
最後將資訊直接印在網頁的 body 裡面並做 hidden 處理…

也就是說 App 在介接時必須觀察該 WebView Redirect 的過程…
並在某個 URL 或網頁 body 內出現了某個 id 的 div 時將內容拿出來做處理…
而 Android 的 WebView 有提供 loadData 但卻沒提供 readData 這種 Method
想要把網頁中的原始碼讀出來必需很繞路的配合 External Object 才能實現…
以下是一個小範例…當 WebView Redirect 到某個 URL 時將網頁原始碼讀出來…
並將讀出來的字串設值給類別的字串成員做後續處理…

public class LoginActivity extends Activity
{
    private WebView wv;
    public String htmlSourceCode = "";
 
    public void LoginActivity()
    {
    }
 
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        wv = (WebView) findViewById(R.id.wv);
        WebSettings webSettings = wv.getSettings();
        webSettings.setJavaScriptEnabled(true);
        wv.addJavascriptInterface(new  AppExt(), "ExtObj"); // 新增 JavaScript 方法
    }
 
    @Override
    public void onStart()
    {
        super.onStart();
        wv.setWebViewClient(new LoginWebViewClientImpl());
        wv.loadUrl("會員認證的網址");
    }
 
    private class AppExt
    {
        public void readHTML(String html)
        {
            htmlSourceCode = html; // 拿到網頁原始碼嘍
            // ParseWebCode(); // 拿原始碼做處理看看認證結果
        }
    }
 
    private final class LoginWebViewClientImpl extends WebViewClient
    {
        public void LoginWebViewClientImpl()
        {
        }
     
        @Override
        public void onPageFinished(WebView view, String url)
        {
            if (url.contains("某個代表認證完成的 URL"))
            {
                view.loadUrl("javascript:window.ExtObj.readHTML(document.getElementsByTagName('html')[0].innerHTML);");
            }
        }
    }
}

沒有留言:

張貼留言