Advertisement

Android WebView 重定向问题的小研究

阅读量:
最近在工作中,遇到了一些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;
        }
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-13/g8bvulhVB3FkQHdyrDRsiSwcfGUZ.png)

下面是代码结果

[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();
                }
            }
        }
    };
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-13/BnkxpKf9rTvmzX2ZsylOLNwaMIS5.png)

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;
        }
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-13/asdpHX2rNZ0VQjECSex9znI37bKi.png)
通过上面的代码,判断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
    
    
类似这样的情况分开。顾使用如上重定向代码的时候,特别需要判定当前的情况是否能够通过该方法达到效果。
希望本篇文章对亲有用,如果您对本篇博客有不同的看法,或者对效果有质疑,亲可以直接私信本人欧。

全部评论 (0)

还没有任何评论哟~