Android Webview H5资源本地化

一. 创建读取资源项目独立模块

1. 项目依赖的好处

符合模块化的思想,他们相互独立。一个项目持有另一个项目的引用,修改更加方便。

(注:compile project编译引用的项目其内容必须包含有java代码、xml布局文件、AndroidManifest等,而且还要在项目的setting.gradle中用include的形式声明引用)

2. 操作步骤导入项目ProjectR

被依赖的项目ProjectR不需要任何改动!

1. 在需要使用的项目中的settings.gradle添加配置

include ':ProjectR'
project(':ProjectR').projectDir = new File(settingsDir,'../../ProjectR/')
include ':ProjectR:app'

2. 在需要使用的项目中的Module中添加需要引入的library

dependencies {
...
compile project(path: ':ProjectR:app')
...
}

3. 设置正确的被依赖的项目路径

project(':BProject').projectDir = new File(settingsDir,'../../ProjectR/')

其中 new File(settingsDir,'../../ProjectR/')
参数说明:

参数一: settingsDir 指的是相对于 settings.gradle 文件所在路径
参数二: 填写被依赖项目的路径,**../**表示上级目录,所以根据自己的路径修改

3. 坑(注意)

如果你不小心填错了被依赖项目的路径,而且还点了同步项目。那么可能会在Project和Module 目录下生成类似 xxx_xxx.iml 的文件,如果异常文件存在,后面就算你的路径配置正确也可能同步不成功,不断的提示错误。这是你只需要删除上叙文件同步项目即可。

4. Assets资源文件读取和AssetManager

  AssetManager管理对assets文件夹资源的访问,它允许你以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。主要用到list()及open()方法。

  注意:要创建一个assets文件夹和java文件夹同级,然后再asset创建一个文件夹命H5Res,此句不要assets不然会找不到文件异常处理

  InputStream stream = assetManager.open("H5Res/" + resUrl);

  finalString[]        list(Stringpath)     返回指定路径下的所有文件及目录名,path是相对路径,是assets子目录。
  finalInputStream     open(String fileName)      使用 ACCESS_STREAMING模式打开assets下的指定文件,fileName是相对路径,是assets子目录。
  finalInputStream      open(String fileName,int accessMode)   使用显示的访问模式打开assets下的指定文件。

5. ProjectR项目主要代码

import android.app.Activity;
import android.content.res.AssetManager;
import android.webkit.MimeTypeMap;
import android.webkit.WebResourceResponse;
import android.webkit.WebView; import java.io.FileNotFoundException;
import java.io.InputStream; public class LocalAssets{ private static LocalAssets _instance = null; public static LocalAssets getInstance() {
return _instance != null ? _instance : (_instance = new LocalAssets());
} private Activity mainContext = null;   // 用于保存请求链接截取出的本地路径
private String resUrl = ""; /**
* 初始化此类获得上下文
*/
public boolean init(Activity context) {
mainContext = context;
return true;
} /**
* 拦截webview请求地址换成读取本地文件
*/
public WebResourceResponse doLoadRes(WebView view, String url) {
try {
       // 根据url判断是否是需要加载的本地资源进行拦截替换响应资源
        if (url === 'assets') {
AssetManager assetManager = mainContext.getAssets();
InputStream stream = assetManager.open("H5Res/" + resUrl);
WebResourceResponse response = new WebResourceResponse(
MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url))
, "UTF-8", stream
);
return response;
}
} catch (FileNotFoundException e) {
} catch (Exception e) {
e.printStackTrace();
}
return null;
} }

二. 主项目代码

1. 将需要本地化的资源放入assets/H5Res文件夹下。

2. 设置完webview后初始化导入的库:

LocalAssets.getInstance().init(this);

3. 设置webview拦截请求:

@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
  WebResourceResponse resp = LocalAssets.getInstance().doLoadRes(view, url);
  if (resp != null) {
    return resp;
  }
  return super.shouldInterceptRequest(view, url);
} @Override
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
  WebResourceResponse resp = LocaalAssets.getInstance().doLoadRes(view, request.getUrl().toString());
  if (resp != null) {
    return resp;
  }
  return super.shouldInterceptRequest(view, request);
}

Android Webview H5资源本地化的更多相关文章

  1. Atitit.android webview h5运行环境总结

    Atitit.android webview h5运行环境总结 1. WebView 的使用1 2. Js调用java1 3. Js调用java 跟个swt的比较2 3.1. Swt是BrowserF ...

  2. Android WebView H5开发拾遗

    上篇介绍了一些WebView的设置,本篇为一些补充项. 首先加载HTML5的页面时,会出现页面空白的现象,原因是需要开启 DOM storage API 功能: webSettings.setDomS ...

  3. H5静态资源本地化实践

    现在很多app都是通过webview内嵌H5的页面,这种方式的好处就是无需发版就能更新线上的内容,而且可以做到多平台的统一开发,节约开发成本.但是这种模式也带来了一定的问题,web开发很大程度依赖于网 ...

  4. H5 hybrid开发-前端资源本地化方案纪要

    H5 hybrid-前端资源本地化方案纪要 就整个行业来说,大前端是趋势,现阶段,native方面除了一些偏CPU密集型工作与操作系统底层API方面的工作外,H5基本都可以满足需要. 目前的工作更偏向 ...

  5. Android WebView与H5联调技巧

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/78 背景: 突然想写一篇关于Android WebView ...

  6. Android WebView 不支持 H5 input type="file" 解决方法

    最近因为赶项目进度,因此将本来要用原生控件实现的界面,自己做了H5并嵌入webview中.发现点击H5中 标签 不能打开android资源管理器. 通过网络搜索发现是因为 android webvie ...

  7. Android原生和H5交互;Android和H5混合开发;WebView点击H5界面跳转到Android原生界面。

    当时业务的需求是这样的,H5有一个活动商品列表的界面,IOS和Android共用这一个界面,点击商品可以跳转到Android原生的商品详情界面并传递商品ID:  大概就是点击H5界面跳转到Androi ...

  8. 原生+H5开发之:Android webview配置

    在上一篇文章Android 原生开发.H5.React-Native开发特点,我们可以了解到三种Android开发方式的区别和优缺点.[Android开发:原生+H5]系列的文章,将主要讲解Andro ...

  9. Android WebView常见问题及解决方案汇总

    Android WebView常见问题解决方案汇总: 就目前而言,如何应对版本的频繁更新呢,又如何灵活多变地展示我们的界面呢,这又涉及到了web app与native app之间孰优孰劣的争论. 于是 ...

随机推荐

  1. Mixing Milk 混合牛奶 USACO 贪心

    1009: 1.3.1 Mixing Milk 混合牛奶 时间限制: 1 Sec  内存限制: 128 MB提交: 9  解决: 9[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 1. ...

  2. HTML中使用Vue+Dhtmlxgantt制作任务进度图

    HTML中使用Vue+Dhtmlxgantt制作任务进度图 Dhtmlxgantt官网: https://dhtmlx.com/docs/products/dhtmlxGantt/ 参考文章 甘特图配 ...

  3. .net生成荣誉证书

    参考:https://blog.csdn.net/ljk126wy/article/details/84299373 采用生成pdf 方式  效果如下: 用adobe acrobat 制作一个模板  ...

  4. Java动态编译技术原理

    这里介绍Java动态编译技术原理! 编译,一般来说就是将源代码转换成机器码的过程,比如在C语言中中,将C语言源代码编译成a.out,,但是在Java中的理解可能有点不同,编译指的是将java 源代码转 ...

  5. python 学习爬虫教程~

    思路:: (本文没有用xpath定位,xpath需要导入第三方库   from lxml import etree) 1.首先通过urllib类获取到网页的所有内容 2.通过partition获取其中 ...

  6. ChoiceFiled MultipleChoiceField ModelChoiceField ModelMultipleChoiceField

    1.ChoiceFiled 单选 字段 2.MultipleChoiceField 多选 3.ModelChoiceField 单选 query_set 4.ModelMultipleChoiceFi ...

  7. 9.JavaSE之运算符

    Java语言支持如下运算符operator:优先级() 算数运算符 :+ ,- ,* ,/ ,% ,++ ,-- 赋值运算符 := 关系运算符 :> ,< ,>= ,<= ,= ...

  8. 8.JavaSE之变量、常量、作用域

    变量variable: 变量是什么:就是内存中开辟的可以变化的量! Java是一种强类型语言,每个变量都必须声明其类型. Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型,作用域   ...

  9. Go Web 编程之 数据库

    概述 数据库用来存储数据.只要不是玩具项目,每个项目都需要用到数据库.现在用的最多的还是 MySQL,PostgreSQL的使用也在快速增长中. 在 Web 开发中,数据库也是必须的.本文将介绍如何在 ...

  10. EFK教程(5) - ES集群开启用户认证

    基于ES内置及自定义用户实现kibana和filebeat的认证 作者:"发颠的小狼",欢迎转载 目录 ▪ 用途 ▪ 关闭服务 ▪ elasticsearch-修改elastics ...