您的位置:首页 > 移动开发

Android WebView 重定向问题的小研究

2017-10-30 10:27 633 查看

最近在工作中,遇到了一些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


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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android webview