Android通过WebView获取解析html内容

混合开发

概述

在Android开发过程中,我们可能需要做一些模拟操作,可能需要获取HTML页面的一些信息,此时就需要借助重写WebViewClientonPageFinished方法,在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);
        }
    }

}

推荐阅读更多精彩内容