有一个需求是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动态加载显示。代码如下

  1. public void setWebViewListener() {
  2. //不调用系统浏览器
  3. webView.setWebViewClient(new WebViewClient() {
  4. @Override
  5. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  6. view.loadUrl(url);
  7. return true;
  8. }
  9.  
  10. @Override
  11. public void onPageStarted(WebView view, String url, Bitmap favicon) {
  12. super.onPageStarted(view, url, favicon);
  13. }
  14.  
  15. @Override
  16. public void onLoadResource(WebView view, String url) {
  17. super.onLoadResource(view, url);
  18. }
  19.  
  20. @Override
  21. public void onPageFinished(WebView view, String url) {
  22. super.onPageFinished(view, url);
  23. }
  24.  
  25. @Override
  26. public void onPageCommitVisible(WebView view, String url) {
  27. super.onPageCommitVisible(view, url);
  28. }
  29.  
  30. @Override
  31. public WebResourceResponse shouldInterceptRequest(WebView view, String request) {//主要是用的这个方法,这个方法会在每次读取图片的时候回调,
    //只要在这个时候返回要的图片即可,之前之所以把图片的名字命名成跟html中一样的是为了少写代码
  32. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  33. LogUtils.logInfoStar(request+"返回的request");
  34. }
  35. AssetManager am = getResources().getAssets();
  36. InputStream is = null;
  37. // String[] helpimgs = GetAssetsFiles.getfilesFromAssets(mContext, "helpimg");
  38. String substring = request.substring(request.lastIndexOf("/")+1,request.lastIndexOf("."));
  39. try {
  40. is = am.open("helpimg/"+substring+".png");
  41. WebResourceResponse res=new WebResourceResponse("text/html","utf-8",is);
  42. return res;
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }
  46. return super.shouldInterceptRequest(view, request);
  47. }
  48. });

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

  1. package com.create.bicdroid.utils;
  2.  
  3. import android.content.Context;
  4. import android.content.res.AssetManager;
  5. import android.graphics.Bitmap;
  6. import android.graphics.BitmapFactory;
  7.  
  8. import com.create.utilslibrary.LogUtils;
  9.  
  10. import java.io.File;
  11. import java.io.FileOutputStream;
  12. import java.io.IOException;
  13. import java.io.InputStream;
  14.  
  15. /**
  16. * Created by Administrator on 2016/11/21.
  17. */
  18. public class GetAssetsFiles {
  19. /**
  20. * 获取assets目录下的图片
  21. *
  22. * @param context
  23. * @param fileName
  24. * @return
  25. */
  26. public static Bitmap getImageFromAssetsFile(Context context, String fileName) {
  27. Bitmap image = null;
  28. AssetManager am = context.getResources().getAssets();
  29. try {
  30. InputStream is = am.open(fileName);
  31. image = BitmapFactory.decodeStream(is);
  32. is.close();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36.  
  37. return image;
  38. }
  39.  
  40. /**
  41. * 获取assets目录下的单个文件
  42. *
  43. * @param context
  44. * @param fileName
  45. * @return
  46. */
  47. public static File getFileFromAssetsFile(Context context, String fileName) {//这种方式不能用,只能用于webview加载,直接取路径是不行的
  48.  
  49. String path = "file:///android_asset/" + fileName;
  50. File file = new File(path);
  51. return file;
  52.  
  53. }
  54.  
  55. /**
  56. * 获取所有文件
  57. *
  58. * @param path
  59. * @return
  60. */
  61. public static String[] getfilesFromAssets(Context context, String path) {
  62. AssetManager assetManager = context.getAssets();
  63. String[] files = null;
  64. try {
  65. files = assetManager.list(path);
  66. } catch (IOException e) {
  67. // TODO Auto-generated catch block
  68. e.printStackTrace();
  69. }
  70. for (String str : files) {
  71. LogUtils.logInfoStar(str);
  72. }
  73. return files;
  74.  
  75. }
  76.  
  77. /**
  78. * 将assets下的文件放到sd指定目录下
  79. *
  80. * @param context 上下文
  81. * @param assetsPath assets下的路径
  82. * @param sdCardPath sd卡的路径
  83. */
  84. public static void putAssetsToSDCard(Context context, String assetsPath,
  85. String sdCardPath) {
  86. try {
  87. String mString[] = context.getAssets().list(assetsPath);
  88. if (mString.length == 0) { // 说明assetsPath为空,或者assetsPath是一个文件
  89. InputStream mIs = context.getAssets().open(assetsPath); // 读取流
  90. byte[] mByte = new byte[1024];
  91. int bt = 0;
  92. File file = new File(sdCardPath + File.separator
  93. + assetsPath.substring(assetsPath.lastIndexOf('/')));
  94. if (!file.exists()) {
  95. file.createNewFile(); // 创建文件
  96. } else {
  97. return;//已经存在直接退出
  98. }
  99. FileOutputStream fos = new FileOutputStream(file); // 写入流
  100. while ((bt = mIs.read(mByte)) != -1) { // assets为文件,从文件中读取流
  101. fos.write(mByte, 0, bt);// 写入流到文件中
  102. }
  103. fos.flush();// 刷新缓冲区
  104. mIs.close();// 关闭读取流
  105. fos.close();// 关闭写入流
  106.  
  107. } else { // 当mString长度大于0,说明其为文件夹
  108. sdCardPath = sdCardPath + File.separator + assetsPath;
  109. File file = new File(sdCardPath);
  110. if (!file.exists())
  111. file.mkdirs(); // 在sd下创建目录
  112. for (String stringFile : mString) { // 进行递归
  113. putAssetsToSDCard(context, assetsPath + File.separator
  114. + stringFile, sdCardPath);
  115. }
  116. }
  117. } catch (
  118. Exception e
  119. )
  120.  
  121. {
  122. e.printStackTrace();
  123. }
  124. }
  125.  
  126. }

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. Request 、Response 与Server的使用

    纯属记录总结,以下图片都是来自 ASP.NET笔记之 Request .Response 与Server的使用 Request Response Server 关于Server.MapPath 方法看 ...

  2. 2在HTML中使用JavaScript

    像HTML页面中插入JavaScrip的主要方法,就是使用<script>元素.HTML4.01为<script>定义了6个属性:async:可选,表示应该立即下载脚本,当不妨 ...

  3. WebApi接口传参不再困惑(4):传参详解(转载)

    WebApi接口传参不再困惑(4):传参详解   前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方 ...

  4. (js) 输入框只能输入中文、英文、数字、@符号和.符号

    只能输入中文.英文.数字.@符号和.符号<input type="text" onkeyup="value=value.replace(/[^\a-\z\A-\Z0 ...

  5. JMeter学习-031-JMeter 3.0 POST Body Data 中文乱码问题

    今天,朋友将 JMeter 的版本由 2.13 升级到了 3.0 发现之前接口脚本 POST 请求主体中的中文无法正确显示,现象如下图所示:

  6. Java Web学习过程的思维导图

    今天找文件,无意中翻到老师前段时间总结的知识点.觉得应该有点用处,所以分享给大家. 第一次在博客园发表,如有错误,还请指正.

  7. 在Centos6下面安装Python3.4

    yum源里头好像没有python3.4 在Python的官网下载Python3.4的源代码 然后: 安装依赖包: yum groupinstall "Development tools&qu ...

  8. Jesse Livermore的21句投机至理名言

    1.优秀的投机家们总是在等待,总是有耐心,等待着市场证实他们的判断.要记住,在市场本身的表现证实你的看法之前,不要完全相信你的判断.        2.要想在投机中赚到钱,就得买卖一开始就表现出利润的 ...

  9. Android Studio中获取查看签名SHA1证书指纹数据或MD5的方法

    原来在Eclipse中获取SHA1或者MD5,在IDE界面上就可以查找到. 切换到Android Studio后,如何查看呢?找了半天没找到.那就老办法命令行. 第一步.打开Android Studi ...

  10. VSCode+Ionic+Apache Ripple开发环境搭建

    vscode作为一个轻量级编辑器,有其独特的魅力. 安装Ionic:npm install -g ionic 安装Apache Ripple模拟器: npm install -g ripple-emu ...