2021@SDUSC
WebView介绍
现在很多APP里都内置了Web网页,比如说很多电商平台、淘宝、京东、聚划算等等,这些都是可以通过Android中的WebView组件实现的。WebView是一个基于webkit引擎、展现web页面的控件。WebView的使用主要包括:WebView
类及其工具类(WebSettings
类、WebViewClient
类、WebChromeClient
类)。WebView 类是 Android 的 View 类的扩展,可让将网页显示为 Activity 布局的一部分。它不会包含功能全面的网络浏览器的任何功能,例如导航控件或地址栏。WebView 默认只显示网页。
作用
1、在Android客户端上显示和渲染Web页面;
2、在本地与HTML页面实现交互和调用;
3、可以对url申请、页面加载、渲染、对话框等进行额外处理。
与JavaScript的交互方式
在WebView使用中会前端h5界面进行较为频繁的交互,Android与JavaScript通过Webview互相调用方法,实际上是Android 去调用JS的代码 + JS去调用Android的代码,二者交互的桥梁就是WebView。
存在的漏洞
WebView虽然功能强大,但是在使用过程中存在许多漏洞,容易造成用户数据泄露等等危险,导致APP被攻击者利用,加载恶意代码,窃取用户信息。主要漏洞有三类:任意代码执行漏洞、密码明文存储漏洞、域控制不严格漏洞,可以针对这些漏洞进行不同的修复。
WebView使用——根据项目代码分析
向应用中添加WebView
<uses-permission android:name="android.permission.INTERNET"/>
首先需要获取互联网访问权限,在清单文件中申请INTERNET权限。android.permission.INTERNET
允许程序访问网络连接,可能产生GPRS流量。
<WebView
android:id="@+id/id_tw"
android:layout_width="match_parent"
android:layout_height="590dp" />
<WebView
android:id="@+id/webview_b"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_editor_absoluteX="206dp"
tools:layout_editor_absoluteY="267dp" />
要向应用中添加WebView,需要在Activity布局中添加<WebView>
元素,或者在onCreate()
中将整个Activity窗口设置为WebView。上面是在.xml文件中添加的<WebView>
元素。
TextView textview1;
WebView webView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview1 = (TextView) findViewById(R.id.id_refresh);
webView = (WebView) findViewById(R.id.id_tw);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view,String url){
webView.loadUrl("javascript:window.HTMLOUT.processHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
}
});
webView.loadUrl("https://www.csdn.net/");
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView.getSettings().setMediaPlaybackRequiresUserGesture(false);
webView.getSettings().setBlockNetworkImage(false);
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
然后在Activity中onCreate()中添加WebView。首先要生成一个WebView组件,有两种方式。一个是直接在Activity中生成WebView webView = new WebView(this)
,另一种是和项目中所写在Activity的layout文件里添加Webview控件webView = (WebView) findViewById(R.id.id_tw);
。
然后利用WebSettings子类对Webview进行配置和管理。WebSettings用于管理WebView状态配置,当WebView第一次被创建时,WebView包含着一个默认的配置,这些默认的配置将通过get方法返回,通过WebView中的getSettings方法获得一个WebSettings对象,如果一个WebView被销毁,在WebSettings中所有回调方法将抛出IllegalStateException异常。
webView.getSettings().setJavaScriptEnabled(true);
如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript,使用如上方法。WebSettings对象方法如下:
setPluginsEnabled(true)
支持插件;
setUseWideViewPort(true)
将图片调整到适合WebView的大小;
setLoadWithOverviewMode(true)
缩放至屏幕大小,与上面两者合用可以设置自适应屏幕;setSupportZoom(true)
设置支持缩放,默认为true;
setBuiltInZoomControls(true)
设置内置的缩放控件,前面为true该方法才有用;setDisplayZoomControls(false)
可以隐藏原生的缩放控件;
setAllowFileAccess(true)
设置可以访问文件;
setJavaScriptCanOpenWindowsAutomatically(true)
支持通过JS打开新窗口;setLoadsImagesAutomatically(true)
支持自动加载图片;
setDefaultTextEncodingName("utf-8")
设置编码格式;
setMediaPlaybackRequiresUserGesture(false)
该方式是设置WebView是否需要用户手势才能播放媒体,默认true;
setBlockNetworkImage(false)
设置WebView是否不应从网络加载图像资源,主要指通过http和https URI方案访问的资源,同时,除非getLoadsImagesAutomatically()
加载图片方法返回true,否则此方法不起作用,默认false;
setJavaScriptEnabled(false)
设置WebView是否允许执行JavaScript脚本,默认false,不允许;
setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW)
设置当一个安全站点企图加载来自一个不安全站点资源时WebView的行为;
MIXED_CONTENT_ALWAYS_ALLOW:允许从任何来源加载内容,即使起源是不安全的;
MIXED_CONTENT_NEVER_ALLOW:不允许Https加载Http的内容,即不允许从安全的起源去加载一个不安全的资源;
MIXED_CONTENT_COMPATIBILITY_MODE:当涉及到混合式内容时,WebView 会尝试去兼容最新Web浏览器的风格。
还有一个重要的方法用以设置WebView缓存方式setCacheMode()
。当加载 html 页面时,WebView会在/data/data/包名目录下生成 database 与 cache 两个文件夹,而请求的 URL记录保存在 WebViewCache.db,而URL的内容是保存在 WebViewCache 文件夹下。设置缓存的语句如下:
//优先使用缓存:
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//缓存模式如下:
//LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
//LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据,是默认方式。
//LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
//LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
//LOAD_CACHE_NORMAL //API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
//不使用缓存:
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webView.getSettings().setAppCachePath(cacheDirPath); //设置 Application Caches 缓存目录,每个Application 只调用一次 setAppCachePath()。
项目中设置为webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView.setWebViewClient(new WebViewClient());
的作用是当从一个网页跳转到另外一个网页时,可以使目标网页仍然在当前的WebView中显示,而不是在浏览器中打开,这样设置后,点击网页中的链接时,就不会将事件交由系统处理,而是将新的点击事件交由WebViewClient类处理。
WebViewClient是一个事件接口。通过提供自己的WebViewClient实现,可以响应呈现事件。例如,可以检测渲染程序何时开始从特定URL加载图像,或决定是否向服务器重新提交POST请求。
可以重写接口中的方法,实现自己想要的效果。比如,项目中所重写的onPageFinished()
方法,该方法在页面加载结束时调用,可以关闭加载条,切换程序动作。常用的还有onPageStarted()
方法,开始载入页面调用时使用,可以设置加载界面,告诉用户程序在等待网络响应。onLoadResource()
方法在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。onReceivedError()
在加载页面的服务器出现错误时调用,可以自己设置本地的错误提示页面,而不是默认的提示页面。
webView.LoadUrl(String url);
是加载网页的一种方法:
webView.loadUrl("https://www.csdn.net/");//通过访问网络地址获取
webView.loadUrl("file://"+ Environment.getExternalStorageDirectory().getPath()+"/1/index.heml");//通过手机SD卡获取(Environment.getExternalStorageDirectory().getPath()是获取手机SD卡根目录的,后面就是目录的地址)
webView.loadUrl("file:///android_asset/index.html");// //通过项目本地资源获取
webView.loadUrl("http://192.168.252.164:8080");//访问本地html