`

Android WebView使用

 
阅读更多

本文主要对WebView进行介绍,包括webView 4个可以定制的点设置WebView back键响应控制网页的链接仍在webView中跳转显示页面加载进度处理https请求利用addJavascriptInterface实现android程序和javascript交互等等

 

WebView基于webkit引擎展现web页面的控件,使用前需要在Android Manifest file中配置internet访问权限,否则提示页面无法访问

<uses-permission android:name="android.permission.INTERNET" />

WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。

WebView有几个可以定制的点:

(1)设置WebChromeClient子类,WebChromeClient会在一些影响浏览器ui交互动作发生时被调用,比如WebView关闭和隐藏、页面加载进展、js确认框和警告框、js加载前、js操作超时、webView获得焦点等等,详见WebChromeClient

 

(2)设置WebViewClient子类,WebViewClient会在一些影响内容喧嚷的动作发生时被调用,比如表单的错误提交需要重新提交、页面开始加载及加载完成、资源加载中、接收到http认证需要处理、页面键盘响应、页面中的url打开处理等等,详见WebViewClient

 

(3)设置WebSettings类,其中包含多项配置。WebSettings用来对WebView的配置进行配置和管理,比如是否可以进行文件操作、缓存的设置、页面是否支持放大和缩小、是否允许使用数据库api、字体及文字编码设置、是否允许js脚本运行、是否允许图片自动加载、是否允许数据及密码保存等等,详见WebSettings

 

(4)设置addJavascriptInterface方法,将java对象绑定到webView中,以方便从页面js中控制java对象,实现用本地java代码和html页面进行交互,甚至可以进行页面自动化。但如此做存在安全隐患,所以若设置了此方法,请确保webView的代码都是自己完成,详细使用addJavascriptInterface进行自动化见本文5使用addJavascriptInterface完成和js交互

 

1、back键控制网页后退

Activity默认的back键处理为结束当前Activity,webView查看了很多网页后,希望按back键返回上一次浏览的页面,这个时候我们就需要覆盖onKeyDown函数,告诉他如何处理,如下:

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            webView.goBack();
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }

 其中webView.canGoBack()在webView含有一个可后退的浏览记录时返回true

webView.goBack();表示返回webView的上次访问页面

 

2、当前网页的链接仍在webView中跳转

                webView.setWebViewClient(new WebViewClient() {

                    @Override
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {
                        view.loadUrl(url);
                        return true;
                    }
                });

 shouldOverrideUrlLoading表示当前webView中的一个新url需要加载时,给当前应用程序一个处理机会,如果没有重写此函数,webView请求ActivityManage选择合适的方式处理请求,就像弹出uc和互联网让用户选择浏览器一样。重写后return true表示让当前程序处理,return false表示让当前webView处理

Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView. If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url. If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url.

参考:

http://developer.android.com/reference/android/webkit/WebViewClient.html#shouldOverrideUrlLoading(android.webkit.WebView, java.lang.String)

 

问题分析:

今天在用webView load腾讯的OAuth页面http://open.t.qq.com/cgi-bin/authorize

时,突然弹出选择uc还是互联网浏览器的确认框,很奇怪,其他页面都能正常load,而这个却无法在webView中load,后来用火狐看了下是因为load这个页面的时候会重定向到另外一个页面http://open.t.qq.com/oauth_html/login.php?oauth_token=xxx&type=0,而webView没有设置shouldOverrideUrlLoading,导致url交给了ActivityManage去处理,解释如上,后添加后可正常load页面

 

3、页面加载进度

代码如下

webView.setWebChromeClient(new WebChromeClient() {

    public void onProgressChanged(WebView view, int progress) {
        setTitle("页面加载中,请稍候..." + progress + "%");
        setProgress(progress * 100);

        if (progress == 100) {
            setTitle(R.string.app_name);
        }
    }
});

onProgressChanged通知应用程序当前页面加载的进度

progress表示当前页面加载的进度,为1至100的整数

参考:

http://developer.android.com/reference/android/webkit/WebChromeClient.html#onProgressChanged(android.webkit.WebView, int)

 

4、处理https请求

webView默认是不处理https请求的,页面显示空白,需要进行如下设置:

    webView.setWebViewClient(new WebViewClient() {

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            handler.proceed();
//            handler.cancel();
//            handler.handleMessage(null);
        }
    });

onReceivedSslError为webView处理ssl证书设置

其中handler.proceed();表示等待证书响应

handler.cancel();表示挂起连接,为默认方式

handler.handleMessage(null);可做其他处理

参考:

http://developer.android.com/reference/android/webkit/WebViewClient.html#onReceivedSslError(android.webkit.WebView, android.webkit.SslErrorHandler, android.net.http.SslError)

 

5、使用addJavascriptInterface完成和js交互

5.1 javascript中调用java对象及方法

设置webView的addJavascriptInterface方法,该方法有两个参数,第一个参数为被绑定到js中的类实例,第二个参数为在js中暴露的类别名,在js中引用java对象就是用这个名字

ClassBeBindedToJS classBeBindedToJS = new ClassBeBindedToJS();
webView.addJavascriptInterface(classBeBindedToJS, "classNameBeExposedInJs"); 

 

实现绑定到js的类,其中的javaMethod方法我们将在页面前端js中调用,用于返回一段内容。showHtml用来使用AlertDialog显示一段html代码,稍后将使用到

private class ClassBeBindedToJS{
    public void showHtml(String html){
    	 new AlertDialog.Builder(UpdateStatusActivity.this) 
                     .setTitle("HTML").setMessage(html)
                     .setPositiveButton(android.R.string.ok, null)
                     .setCancelable(false).create().show();
    }
    public String javaMethod() {
        return "use java method";
    }
};

如此我们就可以在前端调用java对象,如下:

<html>
	<body>        
		<div id="displayDiv">Test page.</div>
		<input type="button" value="use java object" onclick="document.getElementById('displayDiv').innerHTML=classNameBeExposedInJs.javaMethod()" />
	</body>
</html>

 这段html作用为点击button按钮,改变div内容为java对象方法中的内容,其中classNameBeExposedInJs为java对象在js中的别名,javaMethod为java对象的方法

 

5.2 java中调用js方法

用webView的loadUrl实现,比如现在我们想在页面加载完成后调用js中的hello函数,实现如下:

webView.setWebViewClient(new WebViewClient() {  
    @Override
    public void onPageFinished(WebView webView, String url){
        webView.loadUrl("javascript:hello()");
    }
});

怎么样,很简单吧^_^,直接loadUrl("javascript:hello()")就可以了 

利用这一点我们可以很方便的实现WebView的自动化,如网页自动化登录。举个栗子,实现http://m.renren.com/ 的自动登录啊,代码如下

webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://m.renren.com");
webView.requestFocus();

ClassBeBindedToJS classBeBindedToJS = new ClassBeBindedToJS();
webView.addJavascriptInterface(classBeBindedToJS, "classNameBeExposedInJs");    
webView.setWebViewClient(new WebViewClient() {  
	@Override
	public void onPageFinished(WebView webView, String url){ 
		webView.loadUrl("javascript:document.getElementsByName('email')[0].value='userName'"); 
		webView.loadUrl("javascript:document.getElementsByName('password')[0].value='userPassword'"); 
		webView.loadUrl("javascript:document.getElementsByName('login')[0].click()");
	}
});

从中可以看出先加载http://m.renren.com页面,在页面加载完成onPageFinished后,调用js实现自动登录

其中三句js分别表示设置用户名文本框内容、设置用户密码文本框内容、点击登录按钮,如此登录成功喽

 

5.3 java和js混用实现一些效果

5.3.1 WebView用AlertDialog显示页面的html代码

之前5.1中的showHtml方法现在派上用场啦,在页面加载完成后显示页面html内容,如下:

webView.setWebViewClient(new WebViewClient() {  
    @Override
    public void onPageFinished(WebView webView, String url){
        webView.loadUrl("javascript:window.classNameBeExposedInJs.showHtml(document.getElementsByTagName('html')[0].innerHTML);");
    }
});

 其中webView.loadUrl表示调用页面中的js,而页面中的js window.classNameBeExposedInJs.showHtml调用了程序中的java对象的方法,方法参数为一段js。

首先webView会执行这一段js document.getElementsByTagName('html')[0].innerHTML。含义即为取得页面中html标记的innerHTML,及网页主要内容;

然后将得到的网页内容当作字符串参数传入showHtml方法

最后调用showHtml函数实现,即用AlertDialog显示字符串,如此得到了整个网页的大部分html代码

 

5.3.2 WebView显示当前页面的url地址

获得WebView当前页面url使用webView.getUrl()即可,如下:

webView.loadUrl("javascript:window.classNameBeExposedInJs.showHtml('" + webView.getUrl() + "');");

参考:

http://developer.android.com/reference/android/webkit/WebView.html

http://android.tgbus.com/Android/tutorial/201103/347674.shtml

 

 

 
 
分享到:
评论
3 楼 yanyuetian 2014-09-15  
这有些我开发过程遇到的最新问题及优化方案http://www.pedant.cn/2014/09/10/webview-optimize-points/#e ,欢迎一起探讨交流
2 楼 Trinea 2011-08-29  
andrewhunter 写道
文章不错,要是能有些更高级点的就更好了。

呵呵,也是刚学不久,就写了些用到的
1 楼 andrewhunter 2011-08-29  
文章不错,要是能有些更高级点的就更好了。

相关推荐

    Android WebView 去除标题

    总的来说,去除Android WebView的标题可以通过调整布局、禁用内置工具栏和使用JavaScript操作网页内容等方式实现。同时,JavaScript交互为开发者提供了更多定制化网页体验的可能性。在实际项目中,应根据具体需求...

    Android webview使用方法总结

    Android WebView 使用方法总结 Android WebView 是一个非常强大的控件,允许开发者在 Android 应用程序中嵌入 Web 内容。下面是 Android WebView 使用方法总结的一些重要知识点: 一、WebViewClient 的使用 在 ...

    Android Webview视频播放器

    在Android平台上,Webview是一个非常重要的组件,它允许开发者在原生应用中嵌入网页内容。这个项目"Android Webview视频播放器"是利用Webview来实现HTML5视频播放功能的示例。以下是对这个项目的详细解读: 1. **...

    实例详解Android Webview拦截ajax请求

    Android Webview 拦截 Ajax 请求的详细讲解 Android Webview 提供了页面加载及资源请求的钩子,但是对于 H5 的 Ajax 请求并没有提供干涉的接口。这意味着我们不能在 Webview 中干涉 JavaScript 发起的 HTTP 请求,...

    Android webview调用摄像头扫描二维码

    1. Android Webview的使用与配置,包括加载本地HTML、启用JavaScript。 2. 自定义WebViewClient实现URL拦截,调用原生相机API。 3. 使用ZXing库进行二维码扫描,包括Intent接口的使用和AndroidManifest配置。 4. ...

    Android Webview滑动监听

    在Android开发中,Webview是一个非常重要的组件,它允许开发者在原生应用中嵌入网页内容,实现网页与原生应用的交互。本篇将详细讲解如何在Android Webview中实现滑动监听以及图片的放大缩小功能。 首先,我们要...

    Android webview 内存泄露的解决方法

    Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...

    android webview 版本69.0

    总的来说,这个“android webview 版本69.0”是AOSP的一个组件,基于Chromium,适合那些希望在没有Google服务的情况下使用WebView的应用开发者。开发者在使用时应考虑其更新策略和安全性,同时充分利用其提供的API来...

    android webview播放网页视频

    在Android开发中,Webview是一个非常重要的组件,它允许我们加载和展示网页内容。当涉及到在Webview中播放网页视频时,这个问题可能会变得稍微复杂,因为Android原生的Webview并不总是支持所有现代HTML5视频特性。...

    Android webview加载网页.zip

    这个“Android webview加载网页.zip”文件可能包含了一个示例项目或者教程,帮助开发者理解如何在Android应用中有效地使用WebView。 WebView的使用涉及到以下几个关键知识点: 1. **WebView组件引入**:在...

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

    在Android应用开发中,WebView是一个非常重要的组件,它允许开发者在应用程序内嵌入网页内容,实现类似浏览器的功能。本文将详细讲解如何在Android的WebView中播放视频,包括全屏播放的实现方法。以下是对该主题的...

    通过css注入实现android webview的夜间模式

    然后,在Android应用中,我们需要在Webview加载网页之前或之后,使用`evaluateJavascript()`方法注入这段CSS代码。以下是一个简单的示例: ```java String nightModeCss = "document.head.innerHTML += '&lt;style&gt;...

    Android WebView 缓存详解

    Android WebView 缓存详解 一. 两种缓存类型: 页面缓存:加载一个网页时的html、JS、CSS等页面或者资源数据,这些缓存资源是由于浏览器 的行为而产生,开发者只能通过配置HTTP响应头影响浏览器的行为才能间接地...

    Android WebView H5调用拍照

    在Android应用开发中,WebView是一个非常重要的组件,它允许开发者在原生应用中展示网页内容。混合开发(Hybrid Development)结合了Web技术与原生应用的优势,使得开发者可以使用HTML5、CSS3和JavaScript来构建应用...

    Android WebView另类实现 自由复制进入选择文字模式

    在Android开发中,WebView是一个非常重要的组件,它允许我们在原生应用中展示网页内容,提供了一种混合式应用开发的解决方案。本篇文章将深入探讨如何在Android WebView中实现自由复制和选择文字的功能,这对于增强...

    动态设置android webview字体大小DEMO

    为了确保安全性,使用`addJavascriptInterface`时应启用`@JavascriptInterface`注解,这会禁用WebView中的跨域脚本,防止恶意JavaScript代码访问Android应用的内部数据。 在`WebViewTest1`这个项目中,应该包含了...

    Android WebView加载网页以及本地图片缓存问题

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容,而无需离开应用。WebView不仅能够加载远程HTTP/HTTPS网址,还能处理本地HTML、CSS和JavaScript资源,极大地增强了应用...

    Android-AndroidWebView加载PDF文件实现

    Android WebView 加载 PDF 文件实现。其原理就是在 app 本地搭建一个 website ,然后利用 WebView 加载这个站点,站点去实现加载显示 PDF 的目的,站点其原理也是采用 js 框架去实现的。

Global site tag (gtag.js) - Google Analytics