由于项目需求,对webview要进行大量运用,所以对webview进行了一番学习与研究。废话不多说,直接按流程进行。
首先,关于webview的基本的内容,简单描述一下,作为记录。
1、关于返回上个页面:重写一下 onKeyDown() 或者 onKeyUp() ,处理 keyCode == KeyEvent.KEYCODE_BACK 的情况,判断一下 webview.canGoBack(),根据需要处理即可。
2、关于 setWebViewClient() 和 setWebChromeClient() 的运用。
WebViewClient主要帮助WebView处理各种通知和事件,可以根据提供的一些方法加载我们需要的展示以及错误时的处理。常用到的方法:onPageStart(),onPageFinish(),onReceiveError(),shouldOverrideUrlLoading()等。
WebChromeClient主要帮助WebView处理Javascript的对话框、网站图标、当前页面的title、加载进度等。常用的方法:onReceivedTitle,onJsAlert(WebView view, String url, String message, JsResult result) /** 覆盖默认的window.alert展示界面,避免title里显示为“:来自file:////” */ , onJsConfirm(), onJsPrompt() onProgressChanged()等,都是重写的,参数没加。
其他,说一些用到的新东西(对我来说是新的)。
第一,webview通过特定的url加载本地内容,包括与第三方浏览器合作的一些功能,(之前合作用到,记录一下),下面是希望的效果:
实现,根据自定义协议,比如:test://abc,然后通过shouldOverrideUrlLoading()拦截处理即可。比如自定义的:test://gotosearch?input=123,可以加载本地的搜索功能,并把用户在html里输入的内容 123 带过来。
第二,关于加载本地图片的问题,这个问题让我纠结了好久,下面简单描述下。
webview加载本地图片功能,网上搜索有很多,不过说的都差不多,都是WebChromeClient 下的 openFileChooser(),针对不同的版本重构了几个出来而已。但是经过我反复的测试和网上资料的查阅,发现在4.4以后,这个方法不能被使用了,(也可能是我没找到,如果有遇到的可以给我留言,感激),后来进过一段时间的研究,只能采用了先通过js调用选择图片功能,然后上传图片的方法实现期望的功能。这个涉及到一个js调用的细节问题,也是困扰了我们好长时间,在js调用选取图片的时候,刚开始都成功了,没什么问题,后来服务器的兄弟改了一下js方法(这个是后来发现的,原来就是方法名的问题),导致js调用无效。后来反复的撤销更改,发现是服务器的js里,调用的方法名必须是onClick()。这样的事情真的让人恼火。=至于java调用html,就很简单了。
第三,关于cookie的问题。由于我们涉及到账号的切换,在服务器的同事清除了cookie后,但是app上依然保留,经过查找相关资料,记录一下cookie清除的方法。
@SuppressWarnings("unused")
CookieSyncManager cookieSyncMngr = CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
经过我的测试,好像需要webview destroy()一下才能起作用,暂时没有比较好的处理,能解决问题,但是不够完美,回头要在研究下。(希望对此有研究的朋友可以说一下)。
第四,关于混淆的问题。
当这一切都搞定了,我们准备上线的时候,发现又不能用了,瞬间有种疯掉的感觉。通过查看日志,发现不能调用的原因很简单,找不到对应的方法,那肯定是混淆的问题了,关于混淆,这个不赘述,随便查一下就一大堆。我这里只作为我用到的记录一下。
-keep class com.yourpackagename.WebActivity$*{*;}
至此,基本问题都搞定,可以上线了。
( 此篇文章只作为个人总结,里面如果有不对的地方,还请各位大神指正,感激不尽 )