webview资源本地化的一种实现方式

  最近接手了一个crosswalk的任务,需要将Xwalkview的视频资源放到sd卡里面,以后每次遇到相同的视频就直接读取sd卡里面的内容。

  刚开始想的使用crosswalk的webResourceClient,利用其中提供的‘shouldInterceptLoadRequest’方法进行url的拦截和资源重新返回。起初使用这个替换图片,html页面都是可以的,但是替换视频的时候就出现了问题,发现拦截成功,但是返回资源的时候就失败了,仍然是从html中video的src中读取的。之后查找了相关的内容,发现webview,包括xwalkview都是加载html中的video标签时,使用的都是mediaplayer,但是mediaplayer不支持重定向,因此使用这个方法进行视屏资源的替换是不行的。

  之后就想着通过js进行video路径的改写,但是由于html是一个web网页,并不是本地的,导致了其域不同,而且不单单是域不同,这是从http协议改到了file协议,因此产生了一个'NOT ALLOWED TO LOAD LOCAL RESOURCE'的错误。

  以上两个路走不通,最后只能通过webserver将本地的资源转换成web资源。webserver实现方式可以使用AndroidAsync这个框架,或者nanohttpd也可以。在本地起一个服务进行webserver的开启,同时在html中将video的路径用js函数进行处理,在android中操作这个js函数进行路径的动态改写。

  webserver在android上路径设为127.0.0.1之后速度接近cpu速度,基本上可以看成直接操作本地文件,同时也解决了跨域问题和安全性的问题,在遇到无法使用api进行替换的资源时,可以考虑使用这种方式。

  另外提示一点,loaddatawithbaseurl,和loaddata,其实也可以实现,不过麻烦的是需要提前将页面的代码拉下来,在本地使用静态页面的方式加载,这样可以直接更改其中的布局,包括视频的链接。我尝试过这种方式,但是麻烦的是现在前端的框架比较复杂,dom什么的比较多,光拉一个页面有时候解决不了问题,可能还需要更改css,这样的方式效率比较低,因此还是推荐本地起一个webserver的方式进行。

原文地址:https://www.cnblogs.com/Sample1994/p/7376337.html