Android WebView探索 二、Naive拦截Web请求

上一节说到可以使用<a/>超链接标签来定义相应的协议,当用户点击了此标签之后,客户端能拦截到此事件,然后进行拦截并作出相应的处理: 方法是自定义一个WebViewClient,然后给webView设置WebViewClient,这样在点击超链接的时候就能拿到相应的回调。 第一节的地址为 Android WebView探索 一、Naive与WebView的互相调用

因为我们可以拦截到整个超链接标签的uri,所以,我们根据以下三个步骤来进行自定义拦截:
 1、判断uri中的协议,如果协议不是http,即超链接不是跳转到另外一网页我们就可以进行拦截。
2、判断其path,根据path来决定需要执行的动作
3、得到uri中的参数值
下面为代码:
private class Client extends WebViewClient {

        private static final String PROTOCOL_CUSTOM = "heng";

        private static final String PATH_TOAST = "/toast";

        /**
         * 是否应该拦截WebView访问新的URL的方法,返回true表示拦截,返回false表示不拦截
         *
         * @param view
         * @param urlString WebView访问的新的String
         * @return
         */
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String urlString) {

            Uri uri = Uri.parse(urlString);
            String scheme = uri.getScheme();

            //当其协议等于自定义的协议才会进行拦截,如果不等于,那么不做拦截
            if (scheme.equals(PROTOCOL_CUSTOM)) {

                String path = uri.getPath();
                //得到对应的path,可以根据path知道web想要做出的动作是什么
                if (path.equals(PATH_TOAST)){

                    //知道需要作出的动作后,得到参数值,执行相应的动作
                    String parameter = uri.getQueryParameter("arg");
                    Toast.makeText(MainActivity.this,parameter,Toast.LENGTH_SHORT).show();
                }

                Log.d("Main","拦截成功");
                return  true;
            }

            return false;
        }
}


使用此WebViewClient的代码为;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWebView = (WebView) findViewById(R.id.main_wv);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.addJavascriptInterface(this, "naive");

        //为WebView设置相应的回调
        mWebView.setWebViewClient(new Client());
        mWebView.loadUrl("file:///android_asset/demo.html");

}

待拦截的HTML的代码:
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=gb2312">

</head>
<body>
<a href="heng://0.0.0.0/toast?arg=hello web">链接</a>
</body>
</html>

下面为整个MainActivity的源码:
public class MainActivity extends Activity {

    private WebView mWebView;


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

        mWebView = (WebView) findViewById(R.id.main_wv);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.addJavascriptInterface(this, "naive");

        //为WebView设置相应的回调
        mWebView.setWebViewClient(new Client());
        mWebView.loadUrl("file:///android_asset/demo.html");

    }


    private class Client extends WebViewClient {

        private static final String PROTOCOL_CUSTOM = "heng";

        private static final String PATH_TOAST = "/toast";

        /**
         * 是否应该拦截WebView访问新的URL的方法,返回true表示拦截,返回false表示不拦截
         *
         * @param view
         * @param urlString WebView访问的新的String
         * @return
         */
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String urlString) {

            Uri uri = Uri.parse(urlString);
            String scheme = uri.getScheme();

            //当其协议等于自定义的协议才会进行拦截,如果不等于,那么不做拦截
            if (scheme.equals(PROTOCOL_CUSTOM)) {

                String path = uri.getPath();
                //得到对应的path,可以根据path知道web想要做出的动作是什么
                if (path.equals(PATH_TOAST)){

                    //知道需要作出的动作后,得到参数值,执行相应的动作
                    String parameter = uri.getQueryParameter("arg");
                    Toast.makeText(MainActivity.this,parameter,Toast.LENGTH_SHORT).show();
                }

                Log.d("Main","拦截成功");
                return  true;
            }

            return false;
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值