Android webView使用详解(Cookies)

来源:互联网 发布:彩色电纸书 知乎 编辑:程序博客网 时间:2024/06/07 12:35
前段时间的项目关系一直在和android的webview打交道,网上查了很多资料,发现关于webview的详细介绍都比较少,于是决定自己做个小总结。当然因为本人比较懒的缘故,可能这个总结也不会做的太全面,要想详细了解webview的话还是推荐直接去看Android Developer官方网站给的API文档,我在这里只是粗略介绍一下要想开发一个完整的webview需要用到的一些主要的class,以及提一下在使用webview时需要注意的一些point。关于Webview几个比较重要的class是WebView, WebSettings, WebViewClient以及CookieManager。WebView类就相当于一个小型浏览器,使用它就可以根据URL浏览某个网页;但在使用webview之前我们需要先对webview做一些基本的全局配置,这就需要用到WebSettings。然后WebViewClient相当于WebView这个简易浏览器的内核,设置黑白名单,对特定URL,scheme采取哪种响应方式,操作cookie都在(应该在)这个类里面进行相应方法的重载实现。这里不得不吐一下槽就是Android的CookieManager略难用,使用它去获得cookie时,只能得到所有cookie的“key=value”字符串,cookie的有效时间,domain啥的一律取不到,要想取得Cookie对象的话貌似目前只能通过HttpClient(具体我没实践过)。下面是示例代码,具体代码意义请看注释。//假设你已经在Activity或者Fragment对应的layout文件中定义了一个id为webview的WebView组件。WebView webview = (WebView) findViewById(R.id.webview);//设定webview的useragent,这个主要用来服务器端进行验证,如果server端没有特殊要求的话可以不用管。webview.getSettings().setUserAgentString("string");WebSettings webViewSetting = webview.getSettings();//下面这两行代码让webview在打开网页时自动进行大小匹配,让网页大小fit上屏幕大小webview.getSettings().setUseWideViewPort(true);webview.getSettings().setLoadWithOverviewMode(true);//设置webview支持放大缩小功能,try部分的代码可能难理解,这是为了消去我们用手指进行放大缩小时屏幕中出现的“放大缩小按钮”webview.getSettings().setBuiltInZoomControls(true);webview.getSettings().setSupportZoom(true);try {    Field webViewField = webViewSetting.getClass()              .getDeclaredField("mBuiltInZoomControls");    webViewField.setAccessible(true);    webViewField.set(webViewSetting, false);} catch (Exception e) {    e.printStackTrace();    webViewSetting.setBuiltInZoomControls(false);}webview.setWebViewClient(newWebViewClient);//WebViewClient是重头戏,很多自定义的逻辑控制功能都要借助这个类来实现。//定义一个新的WebViewClientprivate WebViewClient newWebViewClient = new WebViewClient() {    @Override    //这个函数用来决定每当webview打开一个新的URL时的动作,    //return true的话表示webview不会继续对URL进行操作,此时你需要指定来对该URL进行操作的应用或是其他组件;    //如果不指定,直接返回true的相当于该条URL不响应;    //return false的话表示webview会继续对该URL进行处理。    //如果要对特定的domain进行限定,也就是我们说的黑白名单,    //就需要重载这个方法,判断URL是否需要过滤,然后直接返回true    public boolean shouldOverrideUrlLoading(        final WebView view, final String url) {            for (int k = 0; k < blockList.length; k++) {                 if (url.contains(blockList[k])) {                     return true;                 }            }            if (url.startsWith("http://")) {                return false;            } else if (url.startsWith("https://")) {                return false;            return true;    }    /**     * 之前我在使用webview时出现了当打开https的link时webview一片空白的情况      * 网上查了一下,说是重载这个函数并让他返回handler.proceed()就行。     * 试了之后确实可以解决问题,但这样子存在安全隐患。     * 因为这个函数的意思是忽略HTTPS错误,即当出现HTTPS错误,比如最常见的     * 没有签名的安全错误,webview也还是照样打开该网站,这就让钓鱼网站有机可乘,     * 所以一般做法时当出现HTTPS错误时,调用cancel()终止网页继续载入。     * 那如何解决HTTPS链接空白的问题呢?参考上面shouldOverrideUrlLoading()的定义     */    @Override    public void onReceivedSslError(final WebView view,                     final SslErrorHandler handler, final SslError error) {        //handler.proceed();        handler.cancel();    }    @Override    //当发生了HTTP错误,比如404错误啊,503错误啊等就调用这个函数,    //可以在这里获得errorCode并对errorCode进行对应处理    public void onReceivedError(final WebView view,                 final int errorCode, final String description, final String url) {    }    /**     * 打开一个URL时会被调用的函数,在这里可以进行一些初始化操作,比如载入cookie等     */    @Override    public void onPageStarted(final WebView view, final String url,                final Bitmap favicon) {        URL realUrl;        try {             realUrl = new URL(url);             host = realUrl.getHost();             domain = host.substring(host.indexOf("."));        } catch (MalformedURLException e) {             e.printStackTrace();        }        CookieManager cookieManager = CookieManager.getInstance();        cookieManager.setAcceptCookie(true);        //注意我们在set cookie时不能直接针对URL进行cookie的set操作,而是应该要针对该URL的domain来进行设置        //domain的格式一定为".google.com"类似。        cookieManager.setCookie(domain, cookieKeyName);        if (cookieManager.hasCookies()) {             //但是在获取cookie时使用的参数是url,这里的区别要注意             String cookies = cookieManager.getCookie(url);        }     }    /**     * 当网页载入完毕时一定会调用的函数,可以在这里进行一些参数保存操作     */    @Override    public void onPageFinished(final WebView view, final String url) {    }