Android WebView 重定向问题的小研究

来源:互联网 发布:协同过滤推荐php 编辑:程序博客网 时间:2024/06/05 06:12

最近在工作中,遇到了一些webview嵌套其他第三方的html的页面的问题[非本团队开发html]的问题。本人项目,其中头部的返回为原生层自己控制,配置地址为后台配置。项目为html+原生类型。

出现问题的情况

当我们的webView嵌套比如应用宝的时候,当我们点击告诉下载,则发生地址无法识别的问题,这时候IOS的亲说这是第三方重定向的问题,顾本人查找了一些相关信息,但是发现和他的理解有一些偏差,下面是本人的理解,纯属个人简介,如果亲们有不同的看法,可以留言,或者私聊本人,qq:2836093218(cherrychen).

下面是以春播为例子:

下面是出现问题的截图

这里写图片描述这里写图片描述

下面是本人参考了别人的博客,copy下来的代码,并加入到自己的项目中:

代码如下

 @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {            WebView.HitTestResult hitTestResult = view.getHitTestResult();            int hitType = hitTestResult.getType();            if (hitType != WebView.HitTestResult.UNKNOWN_TYPE) {                Logs.e("WebViewManger","没有进行重定向操作");                //这里执行自定义的操作                //return true;            } else{                Logs.e("WebViewManger","进行了重定向操作");                //重定向时hitType为0 ,执行默认的操作                //return false;            }            try {                Logs.e("WebViewManger","shouldOverrideUrlLoading url:"+url);                view.requestFocus();                view.loadUrl(url);                webView.setVisibility(View.VISIBLE);                error_rela_layout.setVisibility(View.GONE);            } catch (Exception e) {            }            return true;        }

下面是代码运行结果

[1]点击普通下载得到的日志:

10-30 10:06:07.843 22695-22695/com.reach.doooly E/WebViewManger: 进行了重定向操作10-30 10:06:07.843 22695-22695/com.reach.doooly E/WebViewManger: shouldOverrideUrlLoading url:http://wxz.myapp.com/16891/9AB3CA1FEA2518D7949ADB8C0A0CDA32.apk?fsname=com.chunbo.chunbomall_3.4.2_53.apk&hsr=4d5s

这里写图片描述

[2]点击安全下载得到的日志:

10-30 10:08:20.183 22695-22695/com.reach.doooly E/WebViewManger: 进行了重定向操作10-30 10:08:20.183 22695-22695/com.reach.doooly E/WebViewManger: shouldOverrideUrlLoading url:tmast://appdetails?r=0.01669793288410526&pname=com.chunbo.chunbomall&oplist=1%3B2&via=ANDROIDWXZ.YYB.OTHERBROWSER&downl_biz_id=991653&appid=12010540&outerCallTime=1509329300027&outerCallType=1&outerCallMode=1

这里写图片描述

问题与解决方案

我们常遇到的嵌入html下载的问题分三类,当然也只是本人现在app开发遇到的情况,亲们如果有其他看法,可以留言或者私聊本人哈。

[1]后台配置url为不可识别地址,如上图的应用宝安全下载页面,android webview无法识别

[2]后台配置url为https://…..name.apk or http://….name.apk 这样,android webview可以识别地址

[3]后台配置url为包含apk文件的落地页,webview会先打开落地页,然后在识别下载apk地址。这样android webview会直接变成空白

下面是本人这次在开发中遇到上面的问题的一些小决绝办法,并不是很perfect,亲们如果有更好的办法可以留言欧。

[1]针对第一种情况,我们可以判断错误的返回码,然后进行操作,可以直接返回前一步等。或者翻译这种特殊定义,并实现相关下载功能,

[2]第二种完全不需要解决

[3]第三种,可以实现下载的同时让webview进行返回

[4]如果[2]和[3]同时存在就比较头疼了,应为完全不知道上一个是什么,当然可以进行标记,但是这样太麻烦,本人并不喜欢,这就要求后端配置的时候一定要注意欧。

下面付贴,如果实现处理检测到下载文件,实现下载:[如果不处理,webview只是点击之后没有效果欧]

   webView.setDownloadListener(downloadListener);   /***     * 下载页面监听加入     */    private DownloadListener downloadListener = new DownloadListener() {        @Override        public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {            if (!StringUtlis.isEmpty(url)) {                Uri uri = Uri.parse(url);                Intent intent = new Intent(Intent.ACTION_VIEW, uri);                context.startActivity(intent);                if(webView.canGoBack()){                    webView.goBack();                }            }        }    };

Android WebView 重定向问题的小研究的小结论:

@Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {            WebView.HitTestResult hitTestResult = view.getHitTestResult();            int hitType = hitTestResult.getType();            if (hitType != WebView.HitTestResult.UNKNOWN_TYPE) {                Logs.e("WebViewManger","没有进行重定向操作");                //这里执行自定义的操作                //return true;            } else{                Logs.e("WebViewManger","进行了重定向操作");                //重定向时hitType为0 ,执行默认的操作                //return false;            }            try {                Logs.e("WebViewManger","shouldOverrideUrlLoading url:"+url);                view.requestFocus();                view.loadUrl(url);                webView.setVisibility(View.VISIBLE);                error_rela_layout.setVisibility(View.GONE);            } catch (Exception e) {            }            return true;        }

通过上面的代码,判断webview重定向,这里的重定向指的是,webview加载的url和前面一个url不同,并不能够达到,加载地址和

on10-30 10:24:37.413 22695-22695/com.reach.doooly E/WebViewManger: 进行了重定向操作10-30 10:24:37.413 22695-22695/com.reach.doooly E/WebViewManger: shouldOverrideUrlLoading url:tmast://appdetails?r=0.24434838060465447&pname=com.chunbo.chunbomall&oplist=1%3B2&via=ANDROIDWXZ.YYB.OTHERBROWSER&downl_biz_id=991653&appid=12010540&outerCallTime=1509330277298&outerCallType=1&outerCallMode=1

类似这样的情况分开。顾使用如上重定向代码的时候,特别需要判定当前的情况是否能够通过该方法达到效果。

希望本篇文章对亲有用,如果您对本篇博客有不同的看法,或者对运行效果有质疑,亲可以直接私信本人欧。

原创粉丝点击