Android WebView加载网页链接遇到的那些坑

本来觉得十分简单的问题,结果遇到了不少坑,到现在都不敢保证不出问题,只是解决了大部分问题。。。
下面是列出几个问题

  • 在webview中跳转别的页面无响应
  • 在webview中下载文件无响应
  • 部分网址链接无法显示
  • 部分网址打开自动跳转到浏览器

1.在webview中跳转别的页面无响应

修改之前代码如下:

 WebSettings webSettings = webView.getSettings();
 //设置WebView属性,能够执行Javascript脚本
 webSettings.setJavaScriptEnabled(true);
 //设置可以访问文件
 webSettings.setAllowFileAccess(true);
 //设置支持缩放
 webSettings.setBuiltInZoomControls(true);
 webView.loadUrl(link);

 webView.setWebViewClient(new webViewClient ());

修改之后加了不少webview的设置包括:

webSettings.setAppCacheEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.supportMultipleWindows();
webSettings.setAllowContentAccess(true);
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setSavePassword(true);
webSettings.setSaveFormData(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setLoadsImagesAutomatically(true);

webView.setWebChromeClient(new WebChromeClient());//这行最好不要丢掉

当然,这些属性可能有些不是必须要添加的,为了尽量满足多种需求,所以我都添加了。
修改完成后就可以在webview中跳转别的url链接了,就算是解决了第一个问题吧。

2.在webview中下载文件无响应

因为本身webview不具备下载功能,所以需要让系统处理或者自定义下载。
webview给我们提供了一个下载监听接口,下面我们来实现下载处理:

class MyDownLoad implements DownloadListener {
     @Override
     public void onDownloadStart(String url, String userAgent,
                                 String contentDisposition, String mimetype, long contentLength) {
         if (url.endsWith(".apk")) {
             /**
              * 通过系统下载apk
              */
             Uri uri = Uri.parse(url);
             Intent intent = new Intent(Intent.ACTION_VIEW,uri);
             startActivity(intent);
         }
     }
 }
然后再设置中添加:
webView.setDownloadListener(new MyDownLoad());

这里是将下载功能交给系统来处理了,并没有特殊需求所以就不自定义了。

3.部分网址链接无法显示,报错net::err_unknown_url_scheme

由于我们有时候自定义了WebViewClient,内容大致如下:

 private class webViewClient extends WebViewClient {
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
           view.loadurl(url)//返回true代表在当前webview中打开,返回false表示打开浏览器
           return super.shouldOverrideUrlLoading(view,url);       }

       @Override
       public void onPageStarted(WebView view, String url, Bitmap favicon) {
           if(!dialog.isShowing()) {
               dialog.show();
           }
           super.onPageStarted(view, url, favicon);
       }

       @Override
       public void onPageFinished(WebView view, String url) {
           if(dialog.isShowing()){
               dialog.dismiss();
           }
           super.onPageFinished(view, url);
       }
   }

注意shouldOverrideUrlLoading方法,平时我们可能会在其中设置view.loadurl(url),正是这句代码导致部分网页打不开,这可能是webview的本身加载网页有限制吧。所以我把这句去掉了,在返回时返回了true(true表示在当前webview中打开网页,false则更倾向于浏览器打开网页)。这样做,发现部分网页仍然打不开。于是直接删掉了webView.setWebViewClient(new webViewClient ()),而webView.setWebChromeClient(new WebChromeClient())不能删,结果网页是打开了,但有的则自动跳转到浏览器打开的。但我们的需求是不要打开浏览器。。。

4.部分网址打开自动跳转到浏览器

接到上面所讲,打开部分网址跳转到浏览器了,如何不让他跳转呢,返回true可以禁止跳转,但部分网址在webview中无法打开,接下来,不给它直接返回true或false了,而是返回super,让它父类处理,结果也并没有调到浏览器并且网页也打开了,现在暂时就这样结尾了做到了大部分网址的兼容。

总结:本人对webview了解也是有限,所以并不深入只是解决部分问题,可能理解也有偏差,如有问题请见谅。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐