2013年12月10日 星期二

將Android webview的內容轉換成 string 的方法

最近與學弟妹準備一項比賽,其中需要連到特定網站將其HTML內容轉換成String儲存下來,具體實現的方法及遇到的問題描述如下: 
1. 於layout.xml新增一webview元件
2. 將 <uses-permission android:name="android.permission.INTERNET" /> 加入專案設定檔 Manifest.xml中
3. 在主程式碼中建立各種網路的設定, 主要程式碼如下

@SuppressLint("JavascriptInterface")
public class MainActivity extends Activity {

private WebView _webview;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

findviews();
webviewsetting();
_webview.loadUrl("http://tw.yahoo.com/");
}

private void findviews()
{
_webview = (WebView) findViewById (R.id.webView1);
}

@SuppressLint("SetJavaScriptEnabled")
private void webviewsetting()
{
WebSettings webSettings = _webview.getSettings();
webSettings.setSavePassword(false);
webSettings.setJavaScriptEnabled(true);
_webview.addJavascriptInterface(new MyJavaScriptInterface(this), "HTMLOUT");
_webview.setWebChromeClient(new WebChromeClient());
_webview.setWebViewClient(new WebViewClient() {

@Override
public void onPageFinished(WebView view, String url) {

_webview.loadUrl("javascript:window.HTMLOUT.showHTML" +
                        "('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
}
});
}

class MyJavaScriptInterface {

        private Context ctx;

        MyJavaScriptInterface(Context ctx) {
            this.ctx = ctx;
        }

        @JavascriptInterface
        public void showHTML(String html) {
            new AlertDialog.Builder(ctx).setTitle("HTML").setMessage(html)
                    .setPositiveButton(android.R.string.ok, null).setCancelable(false).create().show();
        }

    }
}


說明:
利用getSettings()方法取得webview的設定元件

webSettings.setJavaScriptEnabled(true);
_webview.addJavascriptInterface(new MyJavaScriptInterface(this), "HTMLOUT");
這兩行可以想成是讓webview元件可以執行javascript,並且加入MyJavaScriptInterface此一類別所建立的javascript介面


在onPageFinished此一方法中,是當webview將網頁載入完成後會執行的方法,因此我們就是要在這個地方將webview的內容轉換成string 儲存起來
透過_webview.loadUrl("javascript:window.HTMLOUT.showHTML" +
                        "('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
便可呼叫MyJavaScriptInterface 此一類別中的 showHTML方法將webview內容已AlertDialog已顯示出來,android call javascript 便是透過 javascript:xxx  來進行使用。

筆者的手機是LG Optimus G,可以正常使用



但強者我同學的Z1卻在網頁載入完成後遲遲沒有對話視窗跳出來,在筆者多方嘗試下後發現在public void showHTML(String html) 此一方法上方加入@JavascriptInterface可解決這個問題,而如果是用模擬器的話似乎怎麼樣都不會有反應。

以上提供給各位參考,歡迎提出問題指教喔~













沒有留言:

張貼留言