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. TCP/IP协议与HTTP协议(二)

    TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据. 1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过 ...

  2. django 建立安全索引

    上篇记录使用“CONCURRENTLY” 命令行执行不锁表索引,对于django, 如何执行呢?这里记录一种方法,修改django迁移文件. 在执行完迁移后,为了方便找到该迁移文件,可以采用指定命名迁 ...

  3. 机器学习- Sklearn (交叉验证和Pipeline)

    前面一节咱们已经介绍了决策树的原理已经在sklearn中的应用.那么这里还有两个数据处理和sklearn应用中的小知识点咱们还没有讲,但是在实践中却会经常要用到的,那就是交叉验证cross_valid ...

  4. python打包成可执行文件

    1 最开始我直接把在Windows上打包的run.exe文件上传到Linux以为可以直接用了.但是./run后报错.百度后知道,Windows上的程序不能在Linux上运行 Linux下文件是否可执行 ...

  5. # 团队项目-Beta冲刺2(七个小矮人)

    团队项目-Beta冲刺2(七个小矮人) 一.格式描述 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScien ...

  6. C# winform 弹框提示内存不足

    看了下面一片博文解决的 Winform 内存不足Winform,我给PictureBox 赋值 picBox_One.BackgroundImage = Image.FromFile("图片 ...

  7. Dubbo入门到实战

    前沿:在当下流行的分布式架构中Dubbo是非常流行的一门技术,借着这几天有空学习学习,并在后面的项目中进行实战,为后面的分布式项目做铺垫. Dubbox简介 Dubbox 是一个分布式服务框架,其前身 ...

  8. Java程序员学习Go指南(终)

    我的博客:https://www.luozhiyun.com/archives/215 context.Context类型 Context类型可以提供一类代表上下文的值.此类值是并发安全的,也就是说它 ...

  9. PMP——项目管理的价值观与方法论

    关于项目管理的十个成语: 未雨绸缪(计划.风险):识别风险.做出计划.并指定负责人: 防微杜渐(监控.纠正):持续的实时的监控计划,监控和发现偏差,并进行纠正: 资源集成(整合.采购):把最专业的资源 ...

  10. Unicode标准以及其常见的编码方案

    目录 基本概念 码位 码位的类型 编码方案 UTF-32 UTF-16 UTF-8 参考资料 Unicode标准为每一个字符提供一个唯一的数字,而不用区分平台.语言等因素. The Unicode S ...