Android通過WebView獲取解析html內容
阿新 • • 發佈:2019-01-08
童話美景
概述
在Android開發過程中,我們可能需要做一些模擬操作,可能需要獲取HTML頁面的一些資訊,此時就需要藉助重寫WebViewClient的onPageFinished方法,在onPageFinished中載入一段js程式碼,js程式碼再呼叫本地方法,具體程式碼如下:
/**
* Dmeo說明: 當WebView載入網頁時獲取該網頁中的內容.
*/
public class MainActivity extends Activity
{
private WebView mWebView;
String na;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
@SuppressLint("SetJavaScriptEnabled")
private void init() {
mWebView = (WebView) findViewById(R.id.webView);
// 開啟JavaScript支援
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new InJavaScriptLocalObj(), "java_obj");
// 設定WebView是否支援使用螢幕控制元件或手勢進行縮放,預設是true,支援縮放
mWebView.getSettings().setSupportZoom(true);
// 設定WebView是否使用其內建的變焦機制,該機制集合螢幕縮放控制元件使用,預設是false,不使用內建變焦機制。
mWebView.getSettings().setBuiltInZoomControls(true);
// 設定是否開啟DOM儲存API許可權,預設false,未開啟,設定為true,WebView能夠使用DOM storage API
mWebView.getSettings().setDomStorageEnabled(true);
// 觸控焦點起作用.如果不設定,則在點選網頁文字輸入框時,不能彈出軟鍵盤及不響應其他的一些事件。
mWebView.requestFocus();
// 設定此屬性,可任意比例縮放,設定webview推薦使用的視窗
mWebView.getSettings().setUseWideViewPort(true);
// 設定webview載入的頁面的模式,縮放至螢幕的大小
mWebView.getSettings().setLoadWithOverviewMode(true);
// 載入連結
mWebView.loadUrl("http://m.qiaocat.com/topic-618_topic/topicIndex");
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// 在開始載入網頁時會回撥
super.onPageStarted(view, url, favicon);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 攔截 url 跳轉,在裡邊新增點選連結跳轉或者操作
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
// 在結束載入網頁時會回撥
// 獲取頁面內容
view.loadUrl("javascript:window.java_obj.showSource("
+ "document.getElementsByTagName('html')[0].innerHTML);");
// 獲取解析<meta name="share-description" content="獲取到的值">
view.loadUrl("javascript:window.java_obj.showDescription("
+ "document.querySelector('meta[name=\"share-description\"]').getAttribute('content')"
+ ");");
super.onPageFinished(view, url);
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
// 載入錯誤的時候會回撥,在其中可做錯誤處理,比如再請求載入一次,或者提示404的錯誤頁面
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view,
WebResourceRequest request) {
// 在每一次請求資源時,都會通過這個函式來回調
return super.shouldInterceptRequest(view, request);
}
});
}
public final class InJavaScriptLocalObj
{
@JavascriptInterface
public void showSource(String html) {
System.out.println("====>html=" + html);
}
@JavascriptInterface
public void showDescription(String str) {
System.out.println("====>html=" + str);
}
}
}