Android从assets目录下读取文件相关
有一个需求是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目录下读取文件相关的更多相关文章
- Android复制Assets目录下的文件到指定目录
package com.android.demo; import java.io.File; import java.io.FileOutputStream; import java.io.Input ...
- Xamarin.Android 如何使用Assets目录下的文件
原文:Xamarin.Android 如何使用Assets目录下的文件 个人原创,转载注明出处:http://blog.csdn.net/supluo/article/details/43672411 ...
- 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 ...
- 安卓:从assets目录下复制文件到指定目录
有些时候我们直接将某些资源文件内置到apk中,便于直接使用. 1.首先将文件放置在项目/app/src/main/assets目录中 2.功能代码: public void copyFile(Stri ...
- 给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息。
1 import java.text.SimpleDateFormat; 2 import org.apache.hadoop.fs.*; 3 4 public class E_RecursiveRe ...
- Android开发之assets目录下资源使用总结
预前知识: Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.Java里面自动生成该资源文件的ID,所以访问 ...
- Android之asset目录下文件的使用
1. 获取AssetManager AssetManager am = context.getAssets(); 2. 列出assets目录下所有文件 String[] filePathList = ...
- Android开发 assets目录
Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.Java里面自动生成该资源文件的ID,所以访问这种资源文件 ...
- Android 之 assets目录和raw目录
Android 中存在assets目录和raw目录,它们既有相似之处又有所不同.一.共同点: 目录下的资源会被原封不动的拷贝到APK中,而不会像其它资源文件那样被编译成二进制的形式. 二.区别 1.最 ...
随机推荐
- Request 、Response 与Server的使用
纯属记录总结,以下图片都是来自 ASP.NET笔记之 Request .Response 与Server的使用 Request Response Server 关于Server.MapPath 方法看 ...
- 2在HTML中使用JavaScript
像HTML页面中插入JavaScrip的主要方法,就是使用<script>元素.HTML4.01为<script>定义了6个属性:async:可选,表示应该立即下载脚本,当不妨 ...
- WebApi接口传参不再困惑(4):传参详解(转载)
WebApi接口传参不再困惑(4):传参详解 前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方 ...
- (js) 输入框只能输入中文、英文、数字、@符号和.符号
只能输入中文.英文.数字.@符号和.符号<input type="text" onkeyup="value=value.replace(/[^\a-\z\A-\Z0 ...
- JMeter学习-031-JMeter 3.0 POST Body Data 中文乱码问题
今天,朋友将 JMeter 的版本由 2.13 升级到了 3.0 发现之前接口脚本 POST 请求主体中的中文无法正确显示,现象如下图所示:
- Java Web学习过程的思维导图
今天找文件,无意中翻到老师前段时间总结的知识点.觉得应该有点用处,所以分享给大家. 第一次在博客园发表,如有错误,还请指正.
- 在Centos6下面安装Python3.4
yum源里头好像没有python3.4 在Python的官网下载Python3.4的源代码 然后: 安装依赖包: yum groupinstall "Development tools&qu ...
- Jesse Livermore的21句投机至理名言
1.优秀的投机家们总是在等待,总是有耐心,等待着市场证实他们的判断.要记住,在市场本身的表现证实你的看法之前,不要完全相信你的判断. 2.要想在投机中赚到钱,就得买卖一开始就表现出利润的 ...
- Android Studio中获取查看签名SHA1证书指纹数据或MD5的方法
原来在Eclipse中获取SHA1或者MD5,在IDE界面上就可以查找到. 切换到Android Studio后,如何查看呢?找了半天没找到.那就老办法命令行. 第一步.打开Android Studi ...
- VSCode+Ionic+Apache Ripple开发环境搭建
vscode作为一个轻量级编辑器,有其独特的魅力. 安装Ionic:npm install -g ionic 安装Apache Ripple模拟器: npm install -g ripple-emu ...