修复android下webView控件的总结
游戏中有一个收集玩家问题反馈的网页,很早之前就有同事反映说android在游戏无法上传附件,在浏览器中是可以正常使用的。最近能腾出手来的时候,就仔细看了一下这个问题,发现很里藏着不少问题,这里一一记录下来,希望能其它人有用,因为很多问题跟网上反映出来可能有点不太一样。
既然是网页,而且只在游戏中才出现,那第一步你要先会使用Fiddler来拦截请求,定位出问题的代码在哪里。你可以参考这篇文章,抓包已经讲的已经非常详细了,Step By Step Fiddler (四) 实现手机的抓包
在Fiddler中找到请求的网页链接,点击查看后将响应的文本使用文本工具(我是使用的EditPlus)保存,然后修改它,再用Fiddler的AutoResponder进行请求拦截,就能进行动态调试了
不过开了Fiddler中的HTTPS请求后,使用 Chrome访问HTTPS链接时都会提示此网站身份未认证,手机安装证书之后,我的设备就必须设定手势密码了,设置之后还不能取消手势必须先删除证书才能恢复以前的无手势访问。

而且开启了代理之后,360的SDK点击登录时提示“无法连接到网络,请检测您的手机网络设置”,其实是可以上网的,只是这个提示误导性比较强,先不使用代理登录SDK,进入游戏后再开启代理即可。
问题一:部分Android设备无法输入字母、数字,但是可以输入中文,返回按钮点击无效(网页不会后退)
网上很多,包括stackflow也会有很多结果,我试了很多,没有一个能解决我所遇到的问题,还有人说是一个bug,最后我是在一篇文章中猛然发现可能我目前使用的代码写的有问题(离职人员留下的),这篇文章链接在这里:

老的代码,红色标注的地方是直接返回true,改成super.onKeyDown(keyCode, event)就正常了
问题二:Android设备点击网页的input[file]控件无效的问题
我是通过这篇文章找到解决方案的:Android WebView上传文件

搜索出来的答案,我记不得那个网址了,是在stackoverflow上的,但是它的那个参数有点问题,上面三个函数中好像有一个函数的参数它写的是“ValueCallback”没有后面的<Uri>,这个其实是有问题的,统一为ValueCallback<Uri> uploadMsg,只是它后面参数长度的问题
问题三:上传附件可能遇到失败的情况,上传成功时调用history.go(-1)不起作用
一个选择问题类型页面A,一个问题详情表单页B。通过webView的loadUrl方法调用时,传入的url有很多。比如:当前游戏的角色、服务器啊、游戏产品标识、设备mac等很长的一串信息,点击表单页B时,又多带上了一个type。
在页面B中,用户点击一个A元素的超链接(href=”javascript:history.go(-1);”)它能正常返回,但是在点击提交问题按钮之后,ajax接口成功后用js调用history.go(-1)页面变成空白了,居然空白了!!!
网上搜索了很多方法,也尝试了很多,结果都失败了,尝试的几种方案:
Android : Detect history.back() in WebView
Why is javascript:history.go(-1); not working on mobile devices?
WebView back history without redirects
首先排除Java中设置的问题,因为JavaScript是起作用的,证明mWebView.getSettings().setJavaScriptEnabled(true);是生效了的。
然后我尝试直接本地修改代码,页面载入完成时调用history.go(-1)是能正常工作的。原本我尝试使用location.href = document.referrer,结果发现获取不到referrer,关于document.referrer可以参考这篇文章>>
然后我就在想要不要动态创建form表单,然后通过document.location.search.substr(1),获取参数列表,再将所有参数填写input中然后提交表单就页面跳转呢?但又要写一些代码,所以又想先再找找有没有其它办法…
之后我仔细查看了http的上传请求,尝试在ajax.ajaxFileUpload的success方法中延时调用history.go(-1),发现界面错位了。这时候我突然会不会提交表单时它里面动态创建了一个iframe导致调用history.go(-1)失效了呢?

文件上传ajaxFileUpload插件使用的是Content-Disposition来实现的,关于Content-Disposition的详情可以参数这篇文章:正确处理下载文件时HTTP头的编码问题(Content-Disposition)
源码我就没仔细看过了,然后我换了一种写法:history.go(1 - history.length);就搞定了,页面也能正常返回了
图片上传失败的问题,需要与后台一起联调,比较费时,也不是必定会遇到。也比较麻烦,所以暂时就搁置了,感觉是编码问题造成的,有待进一步确认…
希望以上三个问题能给遇到类似问题的人一些帮助吧,通过搜索来处理完全未知的问题时,确实需要细心和耐心,特别是在时间比较紧张的情况下,一定不能急躁,一躁思路就可能乱了
修复android下webView控件的总结的更多相关文章
- Android的WebView控件载入网页显示速度慢的究极解决方案
Android的WebView控件载入网页显示速度慢的究极解决方案 [转载来源自http://hi.baidu.com/goldchocobo/] 秒(甚至更多)时间才会显示出来.研究了很久,搜遍了国 ...
- 【转】Android的WebView控件载入网页显示速度慢的究极解决方案
秒(甚至更多)时间才会显示出来.研究了很久,搜遍了国外很多网站,也看过PhoneGap的代码,一直无解. 一般人堆WebView的加速,都是建议先用webView.getSettings().setB ...
- Android 使用WebView控件展示SVG图
1.添加布局界面代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...
- android 调用webview控件,为逆向h5app做准备
activity对应layout文件加入: <WebView android:id="@+id/main_web" android:layout_width="ma ...
- Android下实现控件的叠加显示
<FrameLayout android:layout_width="fill_parent" android:layout_height="match_paren ...
- (转载)android控件之WebView控件缩小
android控件之WebView控件缩小 作者: 字体:[增加 减小] 类型:转载 时间:2013-05-16我要评论 发现这个控件挺好用,能自已控制进度条,而且这个控件的功能非常壮大,先上个简单的 ...
- Android中通过WebView控件实现与JavaScript方法相互调用的地图应用
在Android中通过WebView控件,可以实现要加载的页面与Android方法相互调用,我们要实现WebView中的addJavascriptInterface方法,这样html才能调用andro ...
- 安卓开发学习笔记(五):史上最简单且华丽地实现Android Stutio当中Webview控件https/http协议的方法
一.我们先在XML当中自定义一个webview(Second_layout.xml) 代码如下: <?xml version="1.0" encoding="utf ...
- Android学习笔记50:使用WebView控件浏览网页
在Android中,可以使用Webview控件来浏览网页.通过使用该控件,我们可以自制一个简单的浏览器,运行效果如图1所示. 图1 运行效果 1.WebView 在使用WebView控件时,首先需要在 ...
随机推荐
- android4.0后无法向Servlet发送请求解决办法
从4.0开始,强制性地规定网络堵塞任务都不能放在ui线程,不然直接报错. 个办法,在oncreate下面加入 StrictMode.setThreadPolicy(new StrictMode.Thr ...
- ruby语言学习笔记2
ruby学习笔记2 (摘自<ruby程序设计语言教程(中文版)>.pdf,全书25页) 1.同一个问题ruby有多个解决方案,途径 ruby之父:松本行弘(Matz),1993年创立 r ...
- php中empty()、isset()、is_null()和变量本身的布尔判断区别
<?php//预定义变量数组:空字符,字符0,数组0,null,布尔false,空数组$arr_var = array('', '0', 0, null, false, array()); fo ...
- 在 Vim 中优雅地查找和替换
原文更好看链接http://harttle.com/2016/08/08/vim-search-in-file.html 总有人问我 Vim 中能不能查找,当然能!而且是超级强的查找! 这篇文章来详细 ...
- django 的用户验证及登录状态保持
一.用户验证功能 Django自带用户验证及登录功能,引入模块为: from django.contrib.auth import authenticate 其中方法authenticate()的接收 ...
- 必读,sql加索引调优案例和explain extended说明
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 昨天分享了Mysql中的 explain 命令,使用 explain 来分析 select 语句的运行效果,如 :expl ...
- 运行程序,解读this指向---case4
var param = 'window'; var obj1 = { param: 'obj1', fn1: function () { console.log(this.param); }, fn2 ...
- Ubuntu 18.04 安装 virtualbox
1.安装包下载地址 [https://www.virtualbox.org/wiki/Linux_Downloads] 2.进入软件包的文件夹 sudo dpkg -i 安装包的名字.deb [注]如 ...
- android 流行框架的使用
=== OKHttp主要功能 1.联网请求文本数据 2.大文件下载 3.大文件上传 4.请求图片 get请求 Request request = new Request.Builder() ...
- P4811 C’s problem(c)
P4811 C’s problem(c)From: admin 时间: 1000ms / 空间: 65536KiB / Java类名: Main 背景 清北NOIP春季系列课程 描述 题目描述 小C是 ...