求助:android webview加载网页,对网页中资源(如图片、css等)重定向问题

流星叶雨 2012-08-20 10:29:51
RT,公司开发了一款手机网页游戏,页面用到了很多图片,考虑加载速度以及流量消耗,现在要将html上面的图片、swf等放在本地,求高手解答,Android的WebView如何在加载这些资源时进行判断,并中止加载请求,直接从本地加载呢?
sdk3.0以上开放了这样的一个接口,但是3.0以下就纠结了,研究这个问题已经半个月,目前觉得好像除了改页面、或者探究webkit框架的实现外,完全找不到解决办法……
这款游戏在ios方已经上架,改页面工作量太大,公司老总直接否定了(另外,将整个网页读出来保存在本地,然后自行修改其中的图片路径,因为当时页面设计没考虑到这个问题,页面上的东西很乱,这个方案是行不通的)。
现在的解决方案就只剩下研究框架和底层、探究webview的缓存实现机制(缓存的原理也是将图片放在本地,然后在加载时判断是否使用缓存,然后再根据判断结果替换网络资源),缓存能实现,程序也一定能实现,看了下android源码,webview加载资源涉及到的东西太多了(单单webview一个类的源码都有上万行,而涉及到的类有几十个……),看了半个月,愣是没看出一点头绪。
在这个问题上已经卡了半个多月,老总甚至已经暂停了这款游戏的移植,让我抽时间好好研究下这个东西,这让人很纠结,感觉自己在老总的眼里下降了一个层次。
各路大神们,对webview很熟的大神们,帮帮忙吧,或者谁做过这方面的东西,给在下提供一个思路吧。
拜谢!
...全文
6421 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
技术小黑屋 2014-11-25
  • 打赏
  • 举报
回复
现在回答这个两年前的问题,目前根据Android版本分布,如果可以忽略掉3.0以下这部分功能的支持,可以使用shouldInterceptRequest。
WebView webView = new WebView(this);
webView.setWebViewClient(new WebViewClient() {

  @Override
  public WebResourceResponse shouldInterceptRequest(WebView view,  String url) {
      Log.i(LOGTAG, "shouldInterceptRequest url=" + url + ";threadInfo" + Thread.currentThread());
      WebResourceResponse response = null;
      if (url.contains("logo")) {
          try {
              InputStream localCopy = getAssets().open("droidyue.png");
              response = new WebResourceResponse("image/png", "UTF-8", localCopy);
          } catch (IOException e) {
              e.printStackTrace();
          }        
      }
      return response;
  }    
});
setContentView(webView);
webView.loadUrl("http://m.sogou.com");
具体可以参考这篇文章http://droidyue.com/blog/2014/11/23/block-web-resource-in-webview/
起个名字好难 2014-08-19
  • 打赏
  • 举报
回复
LZ解决了么。
zrhomer123 2014-01-10
  • 打赏
  • 举报
回复
有试过phonegap没有?
liuxun349 2013-11-14
  • 打赏
  • 举报
回复
引用 8 楼 knxw0001 的回复:
你这个问题最后的解决方案是什么?
辞职?
knxw0001 2013-08-29
  • 打赏
  • 举报
回复
你这个问题最后的解决方案是什么?
muyu7823 2013-03-08
  • 打赏
  • 举报
回复
在用替换查找时,还可以有第三方包比较容易找,jsoup.jar
muyu7823 2013-03-08
  • 打赏
  • 举报
回复
可以把要求替换的图片url和要替换的图片地址保存到数据库,以后在html中数据直接查数据库,得到要替换的图片地址,如果没有查询到就直接用html里的url.
流星叶雨 2012-08-20
  • 打赏
  • 举报
回复
顶上去,别沉了~~在线等待大神!!
流星叶雨 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
先用get方式获取网页数据,从网页数据里面找出对应的图片、swf的路径,将这些路径替换成你本地的文件路径,并将这个替换好的内容保存到本地网页文件,然后再让webView加载这个本地的网页文件。
[/Quote]
谢谢,这个方法已经试过,然后排除了,因为涉及到的问题很多,这样做的话甚至比改服务器页面更复杂:
1、如何筛选页面的图片标签,是个大问题,要将网页存下来慢慢判断,还不如直接修改页面,相信那样工作量要小得多(可能android有筛选机制,但页面设计时没考虑会遇到这个问题,所以页面设计很混乱,比如很多标签写在一行,这也增大了筛选的难度)

2、就算第一个问题解决了,但项目中,并不是所有的图片都要放在本地,如何判断要替换哪些图片又是问题

这两个是最大的问题,还有很多小问题、细节等……所以,现在只能想办法不去动页面(不论是服务器还是将页面保存再改),同时实现这个功能
流星叶雨 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
就按缓存原理尝试设计试试,源码是强大而复杂的,需要慢慢摸索,不要着急,都是边做边学的
[/Quote]缓存涉及到的东西太多了,完全看不明白,当时想的是看懂这个机制,然后重写webview,但是一看下来,发现涉及到的类远不止webview这么简单,webview加载网页,是很多类、模块协同操作的,单单重写webview根本无事于补,感觉只能将webview加载页面这一块完全重写……就算花几个月弄明白了缓存机制,也没法把它用到项目中来,因为我做的是应用不是系统定制,就算修改了源码,也影响不到用户的机器……纠结啊
AMinfo 2012-08-20
  • 打赏
  • 举报
回复
先用get方式获取网页数据,从网页数据里面找出对应的图片、swf的路径,将这些路径替换成你本地的文件路径,并将这个替换好的内容保存到本地网页文件,然后再让webView加载这个本地的网页文件。
franzhong 2012-08-20
  • 打赏
  • 举报
回复
就按缓存原理尝试设计试试,源码是强大而复杂的,需要慢慢摸索,不要着急,都是边做边学的

80,441

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧