有一个需求是app的帮助文档是word格式,ios可以直接用webview加载word显示,Android不行。而美工不配合转换成图片,前端没时间把word写成html

没办法,自己搞。

步骤:

1、用第三方靠谱的软件把word文档转成html。

2、放入assets目录下,用webview进行加载。

3、然后你会发现里面的图片显示不了,傻眼了,为什么?? html的image标签中src指向的地址中没有图片资源啊。你的工程中没有图片资源啊,怎么办?

4、可以把图片存入工程中,或者本地等等,然后改html中的src路径。 但是。。。。。俺家的帮助文档有200张图片。一条条改真的好吗。

5、解决方案:把图片放入assets目录下的一个文件夹中。然后命名要跟html中的图片命名相同,然后利用webview动态加载显示。代码如下

 public void setWebViewListener() {
//不调用系统浏览器
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
} @Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
} @Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
} @Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
} @Override
public void onPageCommitVisible(WebView view, String url) {
super.onPageCommitVisible(view, url);
} @Override
public WebResourceResponse shouldInterceptRequest(WebView view, String request) {//主要是用的这个方法,这个方法会在每次读取图片的时候回调,
//只要在这个时候返回要的图片即可,之前之所以把图片的名字命名成跟html中一样的是为了少写代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
LogUtils.logInfoStar(request+"返回的request");
}
AssetManager am = getResources().getAssets();
InputStream is = null;
// String[] helpimgs = GetAssetsFiles.getfilesFromAssets(mContext, "helpimg");
String substring = request.substring(request.lastIndexOf("/")+1,request.lastIndexOf("."));
try {
is = am.open("helpimg/"+substring+".png");
WebResourceResponse res=new WebResourceResponse("text/html","utf-8",is);
return res;
} catch (IOException e) {
e.printStackTrace();
}
return super.shouldInterceptRequest(view, request);
}
});

以下是总结的从assets目录中读取文件的工具类,请看详细注释:

package com.create.bicdroid.utils;

import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import com.create.utilslibrary.LogUtils; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream; /**
* Created by Administrator on 2016/11/21.
*/
public class GetAssetsFiles {
/**
* 获取assets目录下的图片
*
* @param context
* @param fileName
* @return
*/
public static Bitmap getImageFromAssetsFile(Context context, String fileName) {
Bitmap image = null;
AssetManager am = context.getResources().getAssets();
try {
InputStream is = am.open(fileName);
image = BitmapFactory.decodeStream(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
} return image;
} /**
* 获取assets目录下的单个文件
*
* @param context
* @param fileName
* @return
*/
public static File getFileFromAssetsFile(Context context, String fileName) {//这种方式不能用,只能用于webview加载,直接取路径是不行的 String path = "file:///android_asset/" + fileName;
File file = new File(path);
return file; } /**
* 获取所有文件
*
* @param path
* @return
*/
public static String[] getfilesFromAssets(Context context, String path) {
AssetManager assetManager = context.getAssets();
String[] files = null;
try {
files = assetManager.list(path);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (String str : files) {
LogUtils.logInfoStar(str);
}
return files; } /**
* 将assets下的文件放到sd指定目录下
*
* @param context 上下文
* @param assetsPath assets下的路径
* @param sdCardPath sd卡的路径
*/
public static void putAssetsToSDCard(Context context, String assetsPath,
String sdCardPath) {
try {
String mString[] = context.getAssets().list(assetsPath);
if (mString.length == 0) { // 说明assetsPath为空,或者assetsPath是一个文件
InputStream mIs = context.getAssets().open(assetsPath); // 读取流
byte[] mByte = new byte[1024];
int bt = 0;
File file = new File(sdCardPath + File.separator
+ assetsPath.substring(assetsPath.lastIndexOf('/')));
if (!file.exists()) {
file.createNewFile(); // 创建文件
} else {
return;//已经存在直接退出
}
FileOutputStream fos = new FileOutputStream(file); // 写入流
while ((bt = mIs.read(mByte)) != -1) { // assets为文件,从文件中读取流
fos.write(mByte, 0, bt);// 写入流到文件中
}
fos.flush();// 刷新缓冲区
mIs.close();// 关闭读取流
fos.close();// 关闭写入流 } else { // 当mString长度大于0,说明其为文件夹
sdCardPath = sdCardPath + File.separator + assetsPath;
File file = new File(sdCardPath);
if (!file.exists())
file.mkdirs(); // 在sd下创建目录
for (String stringFile : mString) { // 进行递归
putAssetsToSDCard(context, assetsPath + File.separator
+ stringFile, sdCardPath);
}
}
} catch (
Exception e
) {
e.printStackTrace();
}
} }

Android从assets目录下读取文件相关的更多相关文章

  1. Android复制Assets目录下的文件到指定目录

    package com.android.demo; import java.io.File; import java.io.FileOutputStream; import java.io.Input ...

  2. Xamarin.Android 如何使用Assets目录下的文件

    原文:Xamarin.Android 如何使用Assets目录下的文件 个人原创,转载注明出处:http://blog.csdn.net/supluo/article/details/43672411 ...

  3. Android复制assets目录下的图片到内存

    转自:http://www.chenwg.com/android/android%E5%A4%8D%E5%88%B6assets%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84 ...

  4. 安卓:从assets目录下复制文件到指定目录

    有些时候我们直接将某些资源文件内置到apk中,便于直接使用. 1.首先将文件放置在项目/app/src/main/assets目录中 2.功能代码: public void copyFile(Stri ...

  5. 给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息。

    1 import java.text.SimpleDateFormat; 2 import org.apache.hadoop.fs.*; 3 4 public class E_RecursiveRe ...

  6. Android开发之assets目录下资源使用总结

    预前知识: Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.Java里面自动生成该资源文件的ID,所以访问 ...

  7. Android之asset目录下文件的使用

    1. 获取AssetManager AssetManager am = context.getAssets(); 2. 列出assets目录下所有文件 String[] filePathList = ...

  8. Android开发 assets目录

    Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.Java里面自动生成该资源文件的ID,所以访问这种资源文件 ...

  9. Android 之 assets目录和raw目录

    Android 中存在assets目录和raw目录,它们既有相似之处又有所不同.一.共同点: 目录下的资源会被原封不动的拷贝到APK中,而不会像其它资源文件那样被编译成二进制的形式. 二.区别 1.最 ...

随机推荐

  1. 掌握Thinkphp3.2.0----内置标签

    使用内置标签的时候,一定要注意闭合-----单标签自闭合,双标签对应闭合 标签的学习在于记忆和应用 一. 判断比较 //IF 语句的完整格式 <if condition="$user ...

  2. js 表单验证控制代码大全

    js表单验证控制代码大全 关键字:js验证表单大全,用JS控制表单提交 ,javascript提交表单:目录:1:js 字符串长度限制.判断字符长度 .js限制输入.限制不能输入.textarea 长 ...

  3. 【转】C++格式化输出

    在输出数据时,为简便起见,往往不指定输出的格式,由系统根据数据的类型采取默认的格式,但有时希望数据按指定的格式输出,如要求以十六进制或八进 制形式输出一个 整数,对输出的小数只保留两位小数等.有两种方 ...

  4. Linux系统下Nginx安装详解

    该随笔为个人原创,后期会根据项目实践实时更新,如若转载,请注明出处,方便大家获得最新博文! 注:安装Nginx需要Linux系统已经安装   openssl-fips-2.0.2.tar.gz zli ...

  5. web api与webservice(转)

    webservice走HTTP协议和80端口而你说的api,用的协议和端口,是根据开发人员定义的 这么说吧,api类似于cs架构,需要同时开发客户端API和服务器端程序而WebService则类似于b ...

  6. [原创]在Framelayout中放置button控件出现的覆盖问题

    android Framelayout(帧布局)是很常用的布局,主要用来处理需要多个view叠加显示的情况. 然而在使用中,我发现Framelayout中的Button控件,会挡住所有其他控件,而不论 ...

  7. k8s入门系列之guestbook快速部署

    k8s集群以及一些扩展插件已经安装完毕,本篇文章介绍一下如何在k8s集群上快速部署guestbook应用. •实验环境为集群:master(1)+node(4),详细内容参考<k8s入门系列之集 ...

  8. WebView 一直展示加载中。。。

    webview加载html5页面总是一直在加载中,加载很慢或干脆加载不出来, 听浏览器的大牛说可能是 js导致的,尝试在onpause里加入mWebView.pauseTimers(), onResu ...

  9. C# EasyUI树形结构权限管理模块

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本节和大家探讨下C#使用EasyUI树形结构/Tree构 ...

  10. goim socket丢包粘包问题解决。

    -(NSInteger)bytesToInt:(unsigned char*) data { return (data[3]&255)|(data[2]&255)<<8|( ...