安卓WebView问题总汇(持续更新)

来源:互联网 发布:大数据框架hadoop 编辑:程序博客网 时间:2024/05/22 07:08
WebView在现在的项目中使用的频率应该还是非常高的。如果有对webView了解不太多的可以去看我以前写的一个博客,里面有详细的WebView介绍,点击进入

我个人做的项目里面有很多H5界面,并且跟H5交互,在做项目过程中出现了很多问题,下面来总结一下自己遇到的问题:

Android 7.0 WebView加载https出现空白页:


需要重写WebViewClient的onReceivedSslError方法

 @Override        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {            /**             * https  请求 webview 有 证书校验             *  为了适配安卓7.0             *  onReceivedSslError 过滤掉 部分错误             */            if (error.getPrimaryError() == SslError.SSL_DATE_INVALID                    || error.getPrimaryError() == SslError.SSL_EXPIRED                    || error.getPrimaryError() == SslError.SSL_INVALID                    || error.getPrimaryError() == SslError.SSL_UNTRUSTED) {                handler.proceed();            } else {                handler.cancel();            }            super.onReceivedSslError(view, handler, error);        }
用户丢失,登录不通过验证,Cookie丢失问题:

请点击这里进入

怎么用自带的浏览器去打开网页:

mWebView.setWebViewClient(new WebViewClient(){
//给WebView设置自己的WebViewVlient  然后重写shouldOverrideUrlLoading//并且返回值设置为true就可以了      @Override      public boolean shouldOverrideUrlLoading(WebView view, String url) {          view.loadUrl(url);      return true;      }  });
关于缓存方面的:

缓存模式LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。 结合使用(离线加载):if (NetStatusUtil.isConnected(getApplicationContext())) {    webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);//根据cache-control决定是否从网络上取数据。} else {    webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//没网,则从本地获取,即离线加载}webSettings.setDomStorageEnabled(true); // 开启 DOM storage API 功能webSettings.setDatabaseEnabled(true);   //开启 database storage API 功能webSettings.setAppCacheEnabled(true);//开启 Application Caches 功能String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME;webSettings.setAppCachePath(cacheDirPath); //设置  Application Caches 缓存目录注意: 每个 Application 只调用一次 WebSettings.setAppCachePath(),WebSettings.setAppCacheMaxSize()

js调用原生方法:

WebSettings webSettings = mWebView .getSettings();   webSettings.setJavaScriptEnabled(true);   mWebView.addJavascriptInterface(new InsertObj(), "jsObj");//上面这是前提!!!//然后实现上面的类,这个类提供了四个方法,注释的非常清楚。class InsertObj extends Object {    //给html提供的方法,js中可以通过:var str = window.jsObj.HtmlcallJava(); 获取到    @JavascriptInterface    public String HtmlcallJava() {        return "Html call Java";    }} 



关于自定义加载框以及标题的问题:

WebChromeClient mWebChromeClient = new WebChromeClient() {    //获得网页的加载进度,显示在右上角的TextView控件中    @Override    public void onProgressChanged(WebView view, int newProgress) {        if (newProgress < 100) {            String progress = newProgress + "%";        } else {        }    } //获取Web页中的title用来设置自己界面中的title    //当加载出错的时候,比如无网络,这时onReceiveTitle中获取的标题为 找不到该网页,    //因此建议当触发onReceiveError时,不要使用获取到的title    @Override    public void onReceivedTitle(WebView view, String title) {        MainActivity.this.setTitle(title);    }}


 
原创粉丝点击