android那些事--WebView拦截使用

看了篇webview拦截的用法,记录一下

WebView最简单的用法就是loadUrl方法.
常用代码如下.

 demoWv = ((WebView) findViewById(R.id.demoWv));
        WebSettings settings = demoWv.getSettings();
//        网页中含有JavaScript脚本时,需要调用以下方法,参数为true
        settings.setJavaScriptEnabled(true);
        demoWv.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//                是否使用第三方浏览器 返回true不调用 返回false调用
                return true;
            }
        });
        demoWv.loadUrl("https://www.baidu.com");

这里写图片描述

WebView拦截请求

WebView调用loadUrl后,会首先根据传入URL获取响应,然后再将响应显示到页面上,这就是WebView的原理.根据这个原理,那么我们可以在获取响应过程中重新改变请求URL或者直接将响应替换.
而具体的替换在WebViewClient的:

WebResourceResponse shouldInterceptRequest(
WebView view,WebResourceRequest request
)

这个方法中,该方法用于根据请求去获取响应,如果返回null,那么android会根据请求去获取响应并返回,但是如果你重写了该方法并返回了响应,那么WebView就会使用你的响应数据.其中WebResourceRequest封装了请求,WebResourceResponse封装了响应.

使用静态响应

既然知道了原理,就可以写个demo测试一下

        demoWv = ((WebView) findViewById(R.id.demoWv));
        WebSettings settings = demoWv.getSettings();
//        网页中含有JavaScript脚本时,需要调用以下方法,参数为true
        settings.setJavaScriptEnabled(true);
        demoWv.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//                是否使用第三方浏览器 返回true不调用 返回false调用
                return true;
            }
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                String result = "<html>\n" +
                        "<title>千度</title>\n" +
                        "<body>\n" +
                        "<a href=\"www.taobao.com\">千度</a>,比百度知道的多10倍\n" +
                        "</body>\n" +
                        "<html>";
                WebResourceResponse response = new WebResourceResponse("text/html",
                        "utf-8",
                        new ByteArrayInputStream(result.getBytes()));
                return response;
            }
        });
        demoWv.loadUrl("https://www.baidu.com");

这里写图片描述

使用网络资源响应

shouldInterceptRequest方法API还有介绍,该方法是在非UI线程中,所以当需要与View系统交互时需要小心.既然时非UI线程中,那么我们可以放在其中做网络请求.比如可以可以去www.importnew.com的响应数据,将百度替换为importnew.

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        demoWv = ((WebView) findViewById(R.id.demoWv));
        WebSettings settings = demoWv.getSettings();
//        网页中含有JavaScript脚本时,需要调用以下方法,参数为true
        settings.setJavaScriptEnabled(true);
        demoWv.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//                是否使用第三方浏览器 返回true不调用 返回false调用
                return true;
            }
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                return getWebRes();
            }
        });
        demoWv.loadUrl("https://www.baidu.com");
    }

    private WebResourceResponse getWebRes() {
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        try {
            URL url = new URL("http://www.importnew.com/");
            HttpURLConnection httpURLConnection = (HttpURLConnection) url
                    .openConnection();
//            连接主机超时时间
            httpURLConnection.setConnectTimeout(10 * 1000);
//            设置从主机读取数据超时
            httpURLConnection.setReadTimeout(40 * 1000);
            bufferedReader = new BufferedReader(new
                    InputStreamReader(httpURLConnection
                    .getInputStream()));
            String line = "";
            while ((line = bufferedReader.readLine()) != null) {
                            stringBuilder.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (bufferedReader!=null){
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

             }
        }
        WebResourceResponse webResourceResponse = null;
        webResourceResponse=new WebResourceResponse("text/html",
                "utf-8",
                new ByteArrayInputStream(stringBuilder.toString().getBytes()));
        return webResourceResponse;
    }

这里写图片描述

注意:WebView中调用的每个请求都会经过那个拦截器,所以如果一个页面中又有超链接,那么依然会经过那么拦截器.所以上面的Importnew中有些图片没有加载出来.因为是以文本形式响应的,并且是以utf-8做为编码的,所以有时候会出现乱码.

应用

在实际应用中,最好时先判断要加载的URL是否需要拦截,如果不是的话,可以以然交给WebView去实现.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebView拦截非http链接,例如file://、tel://、mailto://等,可以通过重写shouldOverrideUrlLoading方法来实现。以下是示例代码: ```java webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("http") || url.startsWith("https")) { // 如果链接以http或https开头,则继续加载链接 return false; } else { // 如果链接不是以http或https开头,则拦截链接并处理 if (url.startsWith("tel:")) { // 如果链接以tel:开头,则打电话 Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url)); startActivity(intent); } else if (url.startsWith("mailto:")) { // 如果链接以mailto:开头,则发送邮件 Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("message/rfc822"); intent.putExtra(Intent.EXTRA_EMAIL, new String[]{url.substring(7)}); startActivity(Intent.createChooser(intent, "Send Email")); } else if (url.startsWith("file:")) { // 如果链接以file:开头,则打开本地文件 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(url), "application/pdf"); startActivity(intent); } return true; } } }); ``` 在上面的示例中,我们首先检查链接是否以http或https开头。如果是,则继续加载链接。如果链接不是以http或https开头,则根据链接的协议进行相应的处理。例如,如果链接以"tel:"开头,则打电话;如果链接以"mailto:"开头,则发送邮件;如果链接以"file:"开头,则打开本地文件。最后,返回true以拦截链接。 请注意,如果您需要在Android 7.0及更高版本上拦截非HTTP链接,建议您使用shouldOverrideUrlLoading(WebView view, WebResourceRequest request)方法,因为shouldOverrideUrlLoading(WebView view, String url)方法在7.0及更高版本上已经过时。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值