浅析:Android WebView 常见的九个问题

目前Android WebView问题越来越多,接下来由爱内测(www.ineice.com)的技术工程师为我们介绍几种常见的Android WebView问题:

1.为WebView自定义错误显示界面:

/**

* 显示自定义错误提示页面,用一个View覆盖在WebView

*/

protectedvoid showErrorPage() {

LinearLayout webParentView = (LinearLayout)mWebView.getParent();

initErrorPage();

while (webParentView.getChildCount() > ) {

webParentView.removeViewAt( );

}

LinearLayout.LayoutParams lp = newLinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);

webParentView.addView(mErrorView, , lp);

mIsErrorPage = true ;

}

protectedvoid hideErrorPage() {

LinearLayout webParentView = (LinearLayout)mWebView.getParent();

mIsErrorPage = false ;

while (webParentView.getChildCount() > ) {

webParentView.removeViewAt( );

}

}

protectedvoid initErrorPage() {

if (mErrorView == null ) {

mErrorView = View.inflate( this , R.layout.online_error, null );

Button button = (Button)mErrorView.findViewById(R.id.online_error_btn_retry);

button.setOnClickListener( new OnClickListener() {

publicvoid onClick(View v) {

mWebView.reload();

}

});

mErrorView.setOnClickListener( null );

}

}

2.WebView cookies清理:

CookieSyncManager.createInstance( this );

CookieSyncManager.getInstance().startSync();
CookieManager.getInstance().removeSessionCookie();

3.清理cache 和历史记录:

webView.clearCache( true );
webView.clearHistory();

4.判断WebView是否已经滚动到页面底端:

getScrollY()方法返回的是当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离.
    getHeight()或者getBottom()方法都返回当前WebView这个容器的高度
    getContentHeight 返回的是整个html 的高度,但并不等同于当前整个页面的高度,因为WebView 有缩放功能, 所以当前整个页面的高度实际上应该是原始html 的高度再乘上缩放比例. 因此,更正后的结果,准确的判断方法应该是:
    if (WebView.getContentHeight*WebView.getScale()== (webview.getHeight()+WebView.getScrollY())){ //已经处于底端 }

5.URL拦截:

Android WebView是拦截不到页面内的fragment跳转的。但是url跳转的话,又会引起页面刷新,H5页面的体验又下降了。只能给WebView注入JS方法了。

6.处理WebView中的非超链接请求(如Ajax请求):

有时候需要加上请求头,但是非超链接的请求,没有办法再shouldOverrinding中拦截并用webView.loadUrl(Stringurl,HashMap headers)方法添加请求头

目前用了一个临时的办法解决:

首先需要在url中加特殊标记/协议, 如在onWebViewResource方法中拦截对应的请求,然后将要添加的请求头,以get形式拼接到url末尾

在shouldInterceptRequest()方法中,可以拦截到所有的网页中资源请求,比如加载JS,图片以及Ajax请求等等

Ex:
    @SuppressLint ("NewApi" )
    @Override
    public WebResourceResponseshouldInterceptRequest(WebView view,String url) {
    // 非超链接(如Ajax)请求无法直接添加请求头,现拼接到url末尾,这里拼接一个imei作为示例
    String ajaxUrl = url;
    // 如标识:req=ajax
    if (url.contains("req=ajax" )) {
    ajaxUrl +="&imei=" + imei;
    }
    return super.shouldInterceptRequest(view, ajaxUrl);
    }

7.在页面中先显示图片:

@Override
    public voidonLoadResource(WebView view, String url) {
   mEventListener.onWebViewEvent(CustomWebView. this ,OnWebViewEventListener.EVENT_ON_LOAD_RESOURCE, url);
    if (url.indexOf(".jpg" ) > ) {
    hideProgress(); //请求图片时即显示页面
   mEventListener.onWebViewEvent(CustomWebView. this ,OnWebViewEventListener.EVENT_ON_HIDE_PROGRESS, view.getUrl());
    }
    super .onLoadResource(view,url);
    }

8.屏蔽掉长按事件因为webview长按时将会调用系统的复制控件:

mWebView.setOnLongClickListener(new OnLongClickListener() {
    
    @Override
    public booleanonLongClick(View v) {
    return true ;
    }
    });

9.在WebView加入 flash支持:

String temp = "<html><bodybgcolor=/"" + "black"
    + "/"><br/><embed src=/"" + url + "/"width=/"" + "100%"
    + "/"height=/"" + "90%" + "/" scale=/"" +"noscale"
    + "/"type=/"" + "application/x-shockwave-flash"
    + "/"></embed></body></html>" ;
    String mimeType ="text/html" ;
    String encoding ="utf-8" ;
    web.loadDataWithBaseURL("null" , temp, mimeType, encoding, "" );

时间: 2024-10-12 20:11:10

浅析:Android WebView 常见的九个问题的相关文章

Android WebView 常见的九个问题

目前Android WebView问题越来越多,接下来由爱内测(www.ineice.com)的技术工程师为我们介绍几种常见的Android WebView问题: 1.为WebView自定义错误显示界面: /** * 显示自定义错误提示页面,用一个View覆盖在WebView */ protected void showErrorPage() { LinearLayout webParentView = (LinearLayout)mWebView.getParent(); initErrorP

android WebView详解,常见漏洞详解和安全源码

这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析. 由于博客内容长度,这次将分为上下两篇,上篇详解 WebView 的使用,下篇讲述 WebView 的漏洞和坑,以及修复源码的解析. 下篇:android WebView详解,常见漏洞详解和安全源码(下) 转载请注明出处:http://blog.csdn.net/self_study/article/details/54928371. 对技术感兴趣的同鞋加群 54

android WebView详解,常见漏洞详解和安全源码(下)

上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑. 上篇:android WebView详解,常见漏洞详解和安全源码(上) 转载请注明出处:http://blog.csdn.net/self_study/article/details/55046348 对技术感兴趣的同鞋加群 544645972 一起交流. WebView 常见漏洞 WebView 的漏洞也是不少,列举一些常见的漏洞,实时更新,如果有其他的常见漏洞,知会一下我-- WebView

Android WebView File域同源策略绕过漏洞浅析

0x00 我们首先讲一个webView这个方法的作用: webView.getSettings().setAllowFileAccessFromFileURLs(false); 为了讲解这个方法,我们还是看一个实际的例子.代码地址还是参考https://github.com/jltxgcy/AppVulnerability/tree/master/WebViewFileDemo. 代码如下,和Android WebView远程代码执行漏洞简析一文中的代码主要区别在于这次加载的attack_fil

手把手教你构建 Android WebView 的缓存机制 &amp; 资源预加载方案

前言 由于H5具备 开发周期短.灵活性好 的特点,所以现在 Android App大多嵌入了 Android Webview 组件进行 Hybrid 开发 但我知道你一定在烦恼 Android Webview 的性能问题,特别突出的是:加载速度慢 & 消耗流量 今天,我将针对 Android Webview 的性能问题,提出一些有效解决方案. 目录 1. Android WebView 存在什么性能问题? Android WebView 里 H5 页面加载速度慢 耗费流量 下面会详细介绍. 1.

Android WebView 开发教程

1.WebView的使用 (a). 创建WebView的实例加入到Activity中 WebView webview = new WebView(this); setContentView(webview); 或者在xml中配置WebView <Webview android:layout_width="match_parent" android:layout_height="match_parent" > </Webview> (b). 访

屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能加载页面

发现在家里的时候用Android App里的WebView打开网站很慢,会有十几秒甚至更长时间的卡住. 但是在电脑上打开同样的网页却很快. 查找这个问题的过程比较曲折,记录下来. 抓取Android网络数据 为了调试这个问题,首先要抓取Android的网络包数据.开始时,是想用Wireshark来抓包的,但是很麻烦,tcpdump在手机要root权限. 于是转换思路,能不能在Android上设置代理,来抓包? 但是fiddler没有linux版本,于是转用BurpSuite了. 设置Androi

Android WebView 输入框键盘不弹出

问题 在Android中使用内嵌的WebView加载HTML网页时,如果html页面中存在输入框.那么在有些手机设备中,当输入框获取焦点时,系统输入法键盘无法正确弹出,从而无法完成正常的输入要求 在做APP时,自己也遇到了这个问题,以下是自己解决的方法,有可能不适合大家所遇到的情况,但值得借鉴~ WebView设置问题 有些时候我们设计的html页面并不能够很好的适应WebView,尤其我们的html页面是为PC浏览器设计的时候,当使用WebView来加载时,界面很可能会发生错乱,当input输

android webview 通过html5播放在线视频 切换大屏

1.添加网络访问权限 <uses-permission android:name="android.permission.INTERNET" /> 2.webview添加全屏支持 developer官方文档关于html5支持视频播放描述如下:In order to support inline HTML5 video in your application, you need to have hardware acceleration turned on, and set