webview和js互调

package com.daniel.webview;

import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.webkit.ConsoleMessage;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MainActivity extends AppCompatActivity {
    private WebView wv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        wv = (WebView) findViewById(R.id.wv);

        //设置默认的文本编码方式为utf-8
        wv.getSettings().setDefaultTextEncodingName("utf-8");
        //允许执行js代码
        wv.getSettings().setJavaScriptEnabled(true);
//        设置缩放级别
//        这个方法过时了
        wv.getSettings().setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);
        //
        wv.getSettings().setLoadWithOverviewMode(true);


//        避免加载本地html和本地html加载网页图片同时进行
//        if(Build.VERSION.SDK_INT >= 19) {
//            webview.getSettings().setLoadsImagesAutomatically(true);
//        } else {
//            webview.getSettings().setLoadsImagesAutomatically(false);
//        }
        /*
        WebViewClient就是帮助WebView处理各种通知、请求事件的
         */
        wv.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //页面跳转是否在此webview中进行
                view.loadUrl(url);
                return true;
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                //这个方法是页面开始加载的时候调用
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                //页面加载完成后调用的方法

//                避免加载本地html和本地html加载网页图片同时进行
//                if (!view.getSettings().getLoadsImagesAutomatically()) {
//                    view.getSettings().setLoadsImagesAutomatically(true);
//                }
                super.onPageFinished(view, url);
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                //通过这里我们可以得到错误码,然后自定义错误的显示界面
                super.onReceivedError(view, request, error);
            }
        });

        /**
         * WebChromeClient主要处理解析,渲染网页等浏览器做的事情
         */
        wv.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onReceivedTitle(WebView view, String title) {
                //收到标题
                super.onReceivedTitle(view, title);
            }

            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                //网页的加载进度
                //显示progre 控件
                super.onProgressChanged(view, newProgress);
            }

            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                //监听js的弹框
                return super.onJsAlert(view, url, message, result);
            }

            @Override
            public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
                //监听js的日志信息
                //js里面有个console对象,里面有输出日志的方法,相当于android里面的log,console.log("some log");
                return super.onConsoleMessage(consoleMessage);
            }
        });
    }


    /**
     * 首次进入页面的时候webview加载网页能成功,但是以后每次进入该页面的时候,webview加载的进度总是卡在99
     */
    public void setLayerType() {
        if (Build.VERSION.SDK_INT >= 11) {
            wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
    }

    /**
     * 跨域问题
     * 本地html,在通过ajax做网络请求的时候获取不到数据报错提示跨域问题的解决方案
     * setAllowUniversalAccessFromFileURLs这个方法没有对外暴露
     */
    public void setCrossDomain() {
        try {
            if (Build.VERSION.SDK_INT >= 16) {
                Class<?> clazz = wv.getSettings().getClass();
                Method method = clazz.getMethod(
                        "setAllowUniversalAccessFromFileURLs", boolean.class);
                if (method != null) {
                    method.invoke(wv.getSettings(), true);
                }
            }
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    /**
     * 开启允许本地存储
     */
    public void setLocalStorage() {
        wv.getSettings().setDomStorageEnabled(true);
    }

    /**
     * 移除android系统本身的风险接口
     * 系统本身提供的部分接口存在漏洞,可能会被黑客编写的恶意程序利用
     */
    public void setWebviewSecurityConfig() {
        wv.removeJavascriptInterface("searchBoxJavaBridge_");
        wv.removeJavascriptInterface("accessibility");
        wv.removeJavascriptInterface("accessibilityTraversal");
    }



    @Override
    public void onBackPressed() {
        // 这里是后退,还有前进forward
        if (wv.canGoBack()) {
            wv.goBack();
        } else {
            super.onBackPressed();
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值