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. php获取本年、本月、本周时间戳和日期格式

    时间戳格式: //获取今日开始时间戳和结束时间戳 $beginToday=mktime(0,0,0,date('m'),date('d'),date('Y')); $endToday=mktime(0 ...

  2. pandas DF去重

    实例 import pandas as pd data=pd.DataFrame({'产品':['A','A','A','A'],'数量':[50,50,30,30]}) 去重 data.drop_d ...

  3. Django admin的常用方法

    一.HTTP 1.主页面 http://127.0.0.1:8000/admin/ 2.查询页面 http://127.0.0.1:8000/admin/app01/book/ 3.增加页面 http ...

  4. 玩转Django2.0---Django笔记建站基础十三(第三方功能应用)

    第13章 第三方功能应用 在前面的章节中,我们主要讲述Django框架的内置功能以及使用方法,而本章主要讲述Django的第三方功能应用以及使用方法.通过本章的学习,读者能够在网站开发过程中快速开发网 ...

  5. Algorithm: 多项式乘法 Polynomial Multiplication: 快速傅里叶变换 FFT / 快速数论变换 NTT

    Intro: 本篇博客将会从朴素乘法讲起,经过分治乘法,到达FFT和NTT 旨在能够让读者(也让自己)充分理解其思想 模板题入口:洛谷 P3803 [模板]多项式乘法(FFT) 朴素乘法 约定:两个多 ...

  6. centos7下redis安全相关

    Centos7下redis安全相关 在使用云服务器时,安装的redis3.0+版本都关闭了protected-mode,因而都遭遇了挖矿病毒的攻击,使得服务器99%的占用率!! 因此我们在使用redi ...

  7. volatile梳理

    volatile 可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值. 在Java中为了加快程序的运行 ...

  8. 数据结构与算法 --- js描述队列

    js描述队列 队列的特性是只能在队尾插入元素,在队首删除元素,先进先出: 队列被用在很多地方,比如提交操作系统执行的一系列进程,打印任务池,模拟现实中的排队: //队列类 function Queue ...

  9. 小程序--->scroll-view组件不能触发相应滚动事件

    小程序scroll-view组件不能触发相应滚动事件 在制作加载更多时会发现不能触发相应事件,一般情况下首先要查看两个必要的属性scroll-view的高度是否设置,第二就是scroll-view的滚 ...

  10. cesium纽约3dtiles数据下载

    cesium示例有纽约的3dtiles数据,下载官方有下载链接,但是下载后为乱码. 因此研究了下,写了个爬虫解码下载,使用办法,安装Python直接运行即可,代码如下: #coding=utf-8 f ...