iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android WebView基础应用的示例分析
  • 814
分享到

Android WebView基础应用的示例分析

2023-06-22 03:06:37 814人浏览 八月长安
摘要

小编给大家分享一下Android WEBView基础应用的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、WebView的基础配置WebSettings ws = getS

小编给大家分享一下Android WEBView基础应用的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

一、WebView的基础配置

WebSettings ws = getSettings();ws.setBuiltInZoomControls(true);// 隐藏缩放按钮ws.setLayoutAlGorithm(WebSettings.LayoutAlgorithm.NORMAL);// 排版适应屏幕 ws.setUseWideViewPort(true);// 可任意比例缩放ws.setLoadWithOverviewMode(true);// setUseWideViewPort方法设置webview推荐使用的窗口。setLoadWithOverviewMode方法是设置webview加载的页面的模式。 ws.setSaveFormData(true);// 保存表单数据ws.setjavascriptEnabled(true); // 是否能与js交互【如果业务中无JS交互,建议将此项关闭】ws.setGeolocationEnabled(true);// 启用地理定位【如果业务中无此业务,建议将此项关闭】ws.setDomStorageEnabled(true);ws.setJavaScriptCanOpenwindowsAutomatically(true);//允许JS Alert对话框等打开【如果业务中无此业务,建议将此项关闭】ws.setSupportMultipleWindows(true);// 新加

二、WebView支持播放音乐

//是否支持播放音乐ws.setPluginState(WebSettings.PluginState.ON);ws.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); //是否需要用户点击才播放ws.setMediaPlaybackRequiresUserGesture(true);

三、WebView支持视频播放

Android WebView播放视频(包括全屏播放)

四、WebChromeClient

setWebChromeClient(new XWebChromeClient());

其具体覆盖方法如下: 

public static class XWebChromeClient extends WebChromeClient {                 @Override        public void onProgressChanged(WebView view, int newProgress) {            super.onProgressChanged(view, newProgress);            Log.d(TAG, "onProgressChanged---> newProgress:" + newProgress);        }                 @Override        public void onReceivedTitle(WebView view, String title) {            super.onReceivedTitle(view, title);            Log.d(TAG, "onReceivedTitle---> title:" + title);            if (webTitleCallBack != null) {                webTitleCallBack.onReceived(title);            }            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {                if (title.contains("404") || title.contains("500") || title.contains("Error")) {                    view.loadUrl("about:blank"); // 避免出现默认的错误界面                    // 在这里可以考虑显示自定义错误页                    // showErrorPage();                }            }        }                 @Override        public void onReceivedIcon(WebView view, Bitmap icon) {            super.onReceivedIcon(view, icon);            Log.d(TAG, "icon:" + icon);        }                 @Override        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {            Log.d(TAG, "onJsAlert");            return super.onJsAlert(view, url, message, result);        }                 @Override        public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {            Log.d(TAG, "onJsConfirm");            return super.onJsConfirm(view, url, message, result);        }                 @Override        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {            Log.d(TAG, "onConsoleMessage");            return super.onConsoleMessage(consoleMessage);        }                 @Override        public void onPermissionRequest(PermissionRequest request) {            super.onPermissionRequest(request);            Log.d(TAG, "onPermissionRequest---> request:" + request);        }    }

五、WebViewClient

setWebViewClient(new XWebViewClient());

其具体覆盖方法如下: 

public class XWebViewClient extends WebViewClient {         @Override        public void onPageStarted(WebView view, String url, Bitmap favicon) {            super.onPageStarted(view, url, favicon);            Log.d(TAG, "onPageStarted---> url:" + url);        }         @Override        public void onPageFinished(WebView view, String url) {            super.onPageFinished(view, url);            Log.d(TAG, "onPageFinished---> url:" + url);        }                 //Android6.0之前的方法 【在新版本中也可能被调用,所以加上一个判断,防止重复显示】        @Override        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {            super.onReceivedError(view, errorCode, description, failingUrl);            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {                // 断网或者网络连接超时                showReceivedErrorPage(view, errorCode, description, failingUrl);            }        }                 //6.0新增方法        @Requiresapi(api = Build.VERSION_CODES.M)        @Override        public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {            super.onReceivedHttpError(view, request, errorResponse);            // 这个方法在6.0才出现            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                int statusCode = 0;                if (errorResponse != null) {                    statusCode = errorResponse.getStatusCode();                }                Log.d(TAG, "onReceivedHttpError---> code = " + statusCode);                if (404 == statusCode || 500 == statusCode) {                    view.loadUrl("about:blank");// 避免出现默认的错误界面                    // 在这里可以考虑显示自定义错误页                    // showErrorPage();                }            }        }    }

还有如下方法,在使用时尤其要注意:

1、重定向问题

在 shouldOverrideUrlLoading 方法可进行重定向的判断跟处理:

        //Android7.0之后的方法        @RequiresApi(api = Build.VERSION_CODES.N)        @Override        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {            Log.d(TAG, "shouldOverrideUrlLoading new---> url:" + request.getUrl());             analysisRequest(request);             String url = (request.getUrl()).toString();            boolean hasGesture = request.hasGesture();            boolean isRedirect = request.isRedirect();             return shouldOverride(view, url);        }

其WebView重定向需要考虑的case如下:

是最普通的http url【不含.doc .apk等下载url】

下载的http url【如.doc .apk等】

非http或https自定义url 【如 "weixin:// alipays://等】

【deprecated】如果期望打开web页时不自动唤起app,可通过 request.hasGesture()【是否】点击来判断,如果是true才唤起第三方app。(此种方案有时不太准确,故可采用下面方案)

【recommend】定义一个boolean值如:isClickWeb = false,在onTouchEvent DOWN方法中,将其赋值为true。在必要位置添加判断即可【具体可参考代码】

        private boolean shouldOverride(WebView view, final String url) {            //业务需要可做处理            redirectionJudge(view, url);             if (SchemeUtil.isHttpProtocol(url) && !SchemeUtil.isDownloadFile(url)) {                return false;            }             if (SchemeUtil.isHttpProtocol(url) && SchemeUtil.isDownloadFile(url)) {                if (isClickWeb) {                    openDialog(url);                    return true;                }            }             if (!SchemeUtil.isHttpProtocol(url)) {                boolean isValid = SchemeUtil.isSchemeValid(context, url);                if (isValid && isClickWeb) {                    openDialog(url);                } else {                    Log.d(TAG, "此scheme无效[比如手机中未安装该app]");                }                return true;            }            return false;        }

2、实现预加载

在 shouldInterceptRequest 方法中可实现资源预加载:

        @Nullable        @Override        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {            if (request == null) {                return null;            }            String url = request.getUrl().toString();            Log.d(TAG, "shouldInterceptRequest---> " + url);            return getWebResourceResponse(url);        }
protected WebResourceResponse getWebResourceResponse(String url) {            //此处[tag]等需要跟服务端协商好,再处理            if (url.contains("[tag]")) {                try {                    String localPath = url.replaceFirst("^http.*[tag]\\]", "");                    InputStream is = getContext().getAssets().open(localPath);                    Log.d(TAG, "shouldInterceptRequest: localPath " + localPath);                    String mimeType = "text/javascript";                    if (localPath.endsWith("CSS")) {                        mimeType = "text/css";                    }                    return new WebResourceResponse(mimeType, "UTF-8", is);                } catch (IOException e) {                    e.printStackTrace();                    return null;                }            } else {                return null;            }        }

3、增加错误页面展示限制

在onReceivedError方法中,通过 request.isForMainFrame() || url.equals(getUrl() 判断来尽可能少的减少错误页面的展示。即当错误页面是主页面时才展示错误页,避免整个页面中如某个icon等展示错误,导致影响整个页面的情况【如网易音乐的某些URL,就曾有出现这种情况,通过这种方式可以避免错误页面展示】。

        //Android6.0之后的方法        @RequiresApi(api = Build.VERSION_CODES.M)        @Override        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {            super.onReceivedError(view, request, error);            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                String url = request.getUrl().toString();                int errorCode = error.getErrorCode();                String description = error.getDescription().toString();                Log.d(TAG, "onReceivedError---> " + " url:" + url + "errorCode:" + errorCode + " description:" + description + " failingUrl:" + url + " request.isForMainFrame():" + request.isForMainFrame());                // 如果当前网络请求是为main frame创建的,则显示错误页                if (request.isForMainFrame() || url.equals(getUrl())) {                    showReceivedErrorPage(view, error.getErrorCode(), error.getDescription().toString(), request.getUrl().toString());                }            }        }

4、解决页面白屏问题

SSL证书无效时,会导致白屏问题,可在 onReceivedSslError 方法中添加 handler.proceed();

可解决白屏问题: 

        @Override        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {            //此处处理可避免SSL证书无效的页面白屏            handler.proceed();            super.onReceivedSslError(view, handler, error);            Log.d(TAG, "onReceivedSslError---> error = " + error);        }

看完了这篇文章,相信你对“Android WebView基础应用的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Android WebView基础应用的示例分析

本文链接: https://www.lsjlt.com/news/302064.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android WebView基础应用的示例分析
    小编给大家分享一下Android WebView基础应用的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、WebView的基础配置WebSettings ws = getS...
    99+
    2023-06-22
  • Android中ContentProvider基础应用的示例分析
    小编给大家分享一下Android中ContentProvider基础应用的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、适用场景ContentProv...
    99+
    2023-06-22
  • Java基础的示例分析
    小编给大家分享一下Java基础的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、Java主要特点简单性、跨平台性、分布性、安全性、健壮性、平台独立与可移...
    99+
    2023-06-20
  • MySQL基础的示例分析
    这篇文章给大家分享的是有关MySQL基础的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MySQL入门mySQL (关系型数据库管理系统)MySQL是一个关系型数据库管理...
    99+
    2022-10-18
  • javaScript基础的示例分析
    这篇文章主要为大家展示了“javaScript基础的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javaScript基础的示例分析”这篇文章吧。首先讲...
    99+
    2022-10-19
  • node.js基础的示例分析
    这篇文章给大家分享的是有关node.js基础的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是NodeJSJS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在H...
    99+
    2022-10-19
  • Three.js基础的示例分析
    这篇文章给大家分享的是有关Three.js基础的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、Three.js官网及使用Three.js必备的三个条件1.Three....
    99+
    2022-10-19
  • Mysql基础示例分析
    这篇文章主要介绍了Mysql基础示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。   这段时间,在做一个Web项目,需要使...
    99+
    2022-10-19
  • Android Webview拦截ajax请求的示例分析
    小编给大家分享一下Android Webview拦截ajax请求的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Android Webview虽然提供了页面加载及资源请求的钩子,但是对于h6的ajax请求并没有提供...
    99+
    2023-05-30
  • Android中WebView用法实例分析
    本文实例讲述了Android中WebView用法。分享给大家供大家参考,具体如下: WebView相当于一个迷你浏览器,采用WebKit内核,因此完美支持html,javasc...
    99+
    2022-06-06
    webview Android
  • Java基础之Maven的示例分析
    这篇文章将为大家详细讲解有关Java基础之Maven的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Maven是什么?Maven是一个跨平台的项目管理工具。作为Apache组织的一个颇为成功的...
    99+
    2023-06-15
  • AngularJS基础知识的示例分析
    这篇文章主要介绍了AngularJS基础知识的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。指令AngularJS 指令是扩展的 H...
    99+
    2022-10-19
  • redis基础配置的示例分析
    这篇文章将为大家详细讲解有关redis基础配置的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis的ms主从集群作用:1、主从备份防止宕机2、读写分离,分担...
    99+
    2022-10-19
  • shell基础语法的示例分析
    这篇文章将为大家详细讲解有关shell基础语法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。不论前端还是后端,再学会Linux的基础上,还应该学会写一些简单的Shell。不止是工作,日常中想做一...
    99+
    2023-06-09
  • java数组基础的示例分析
    这篇文章主要介绍java数组基础的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数组数组(Array):相同类型数据的集合。Java 数组初始化的两种方法: 静态初始化: 程序员在初始化数组时为数组每个元素赋...
    99+
    2023-05-30
    java 数组
  • oracle基础语法的示例分析
    这篇文章主要介绍了oracle基础语法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Oracle数据库的初步学习数据库的安装及其配置,使用默认选项进行安装即可ora...
    99+
    2023-06-15
  • Ruby基础代码的示例分析
    Ruby基础代码的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Ruby语言的学习和其他编程语言一样,首先要从基础开始。在这里我们为大家介绍了一下Ruby基础代码中...
    99+
    2023-06-17
  • java基础之this的示例分析
    小编给大家分享一下java基础之this的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、this关键字首先需要提醒的是,在整个Java之中,this是...
    99+
    2023-06-20
  • Android基础知识及线性布局的示例分析
    这篇文章主要介绍Android基础知识及线性布局的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.常见控件的基本属性android:id="@+id/button1":【设置控件id】a...
    99+
    2023-06-26
  • PHP7语言基础示例分析
    这篇文章主要介绍了PHP7语言基础示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。文章目录PHP标记PHP指令分隔符PHP注释常量PHP变量数据类型转换为布尔值转换为整...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作