有一个需求是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. JDK环境变量设置

    1,新建JAVA_HOME变量 .  E:\TOOLS\JAVA\JDK1.8.0_111 2,新建CLASSPATH变量 . .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\to ...

  2. Java Basic - Generics

    什么是类型擦除? 类型擦除指的是通过类型参数合并,将泛型类型实例关联到同一份字节码上.编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上.类型擦除的关键在于从泛型类型中清除类型参数的相关信 ...

  3. oracle数据库使用三个月的总结

    存储过程定义,举个例子如下: create or replace procedure test_person(id in Number, Ename In Varchar2, age In Varch ...

  4. Photosohp 2017 已经发布!(下载地址及破解方法在文章底部)

    Adobe Creative Cloud 软件于2016.11.2 全面更新,Adobe Creative Cloud 2017 震撼登场 全新的 2017版本,包含 Photoshop.Illust ...

  5. 用sublime写出的第一个网页

    STEP1 完成语义分析器 我用的vs2013 c语言写的 这个过程会在下一篇文章中详讲 准备好几个编译好的图,放在一个文件夹里,像下面这样 STEP2 规划好html的框架 上代码! (截图版) ( ...

  6. h5网站和好看的动画网址

    http://www.sucai888.com/data/batchzip/unzips/2165/index.html http://www.1000zhu.com

  7. Linux TOP命令 按内存占用排序和按CPU占用排序

    P – 以 CPU 占用率大小的顺序排列进程列表M – 以内存占用率大小的顺序排列进程列表 http://blog.csdn.net/xiliuhu/article/details/6449377

  8. windows环境,idea的Terminal每次输入git命令都要提示输入用户名,密码

    打开本地的这个目录(以上图片所示) 以我本地项目为例: 项目根目录下-->.git-->config文件 找到[remote "origin"]下url,更改其为htt ...

  9. NSSet

    版权声明:本文为博主原创文章,未经博主允许不得转载. 一.NSSet的创建和初始化 创建一个空的NSSet集合:+ (void)set; 用数组来创建NSSet集合:+ (id)setWithArra ...

  10. AngularJS 2.0

    https://angular.io/docs/ts/latest/guide/learning-angular.html QuickStart: git clone https://github.c ...