Android webview通过http get下载文件下载两次的问题及解决方法

  次阅读 作者:智能小宝 来源:互联网 2015-10-02 21:27 我要评论(0)

一、现象

一般通过Android webview进行下载文件的方法是

1.重写DownloadListener的onDownloadStart方法,在onDownloadStart方法中弹出对话框提示用户有新的文件需要下载

2.用户点击确定之后,通过http get下载文件

由于Android webview的实现,以上的下载文件步骤涉及到了两次get的操作。第一次是用户在webview中点击下载链接时,webview自动发送http get请求,这个时候服务器除了将文件信息发送过来之外,会同时将文件的内容发送给webview。第二次是在步骤2,由自己设计的程序发起的。

为了验证如上结论,我在Android 4.4系统中的自带浏览器通过访问并下载这个测试链接,并用wireshark进行抓包查看结果。通过如下三张图,我觉得可以验证同一份文件确实被传了两次。因为两个不同http get请求之后都可以看到服务器向客户端发送的连续的TCP数据包。

二、解决方法

针对这个问题,我觉得比较完美的解决办法是webview在进行get的时候能够缓存相应的文件内容,并且开放相应的接口给应用进行缓存的读龋但是我并没有发现相应的api。

于是便有了如下的解决办法:在webview加载url之前,通过链接中的一些特定字段发现进行下载操作。然后通过http head请求获取文件名和大小等相关信息。由于http head只是请求文件相关信息,所以服务器只是通过http response将文件信息返回而不通过tcp发送文件具体内容。

2.1 在继承自WebViewClient的类的shouldOverrideUrlLoading方法中检查链接类型,并通过http head获取文件大小,名称信息。在以下代码基础上需要增加合适的获取文件名称代码和handler的代码

if (url.contains("可能会进行下载的链接字段")) {

new Thread() {

public void run() {

HttpHead httpGet = new HttpHead(mUrl);

boolean success = true;

String filename="";

Integer fileLength=100;

try {

HttpParams httpParameters = new BasicHttpParams();

HttpConnectionParams.setConnectionTimeout(httpParameters, 8000);

HttpConnectionParams.setSoTimeout(httpParameters, 8000);

DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);<br>

//需要的话可能得增加cookie<br>

HttpResponse httpResponse = httpClient.execute(httpGet);

if (httpResponse.getStatusLine().getStatusCode() == 200) {//如果文件名保存在Content-Disposition中,并且用的是gb2312编码方式可以参考这段代码

String nameString=httpResponse.getFirstHeader("Content-Disposition").getValue();

char [] nameChar=new char[nameString.length()];

byte [] nameBytes=new byte[nameString.length()];

nameString.getChars(0, nameString.length(), nameChar, 0);

for (int i = 0; i < nameChar.length; i++) {

nameBytes[i]=(byte)nameChar[i];

}

filename=EncodingUtils.getString(nameBytes, "gb2312");

Log.d(TAG, "file name is "+filename);

String contentLength=httpResponse.getFirstHeader("Content-Length").getValue();

fileLength=Integer.parseInt(contentLength);

success=true;

}else {

success=false;

}

} catch (Exception e) {

success = false;

e.printStackTrace();

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...