预前知识:

Android资源文件分类:


Android资源文件大致可以分为两种:

第一种是res目录下存放的可编译的资源文件:

这种资源文件系统会在R.Java里面自动生成该资源文件的ID,所以访问这种资源文件比较简单,通过R.XXX.ID即可;

第二种是assets目录下存放的原生资源文件:

因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通过R.XXX.ID的方式访问它们。那我么能不能通过该资源的绝对路径去访问它们呢?因为apk安装之后会放在/data/app/**.apk目录下,以apk形式存在,asset/res和被绑定在apk里,并不会解压到/data/data/YourApp目录下去,所以我们无法直接获取到assets的绝对路径,因为它们根本就没有。

还好android系统为我们提供了一个AssetManager工具类。

查看官方API可知,AssetManager提供对应用程序的原始资源文件进行访问;这个类提供了一个低级别的API,它允许你以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。

AssetManager类


概述:

提供对应用程序的原始资源文件进行访问;这个类提供了一个低级别的API,它允许你以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。通过getAssets()方法获取AssetManager对象。

AssetManager类常用方法:

Public Methods

final String[]

list(String path)

返回指定路径下的所有文件及目录名。

final InputStream

open(String fileName)

使用 ACCESS_STREAMING模式打开assets下的指定文件。.

final InputStream

open(String fileName, int accessMode)

使用显示的访问模式打开assets下的指定文件.

应用实例


1.加载assets目录下的网页:

//加载assets/win8_Demo/目录下的index.html网页

webView.loadUrl("file:///android_asset/win8_Demo/index.html");

说明:这种方式可以加载assets目录下的网页,并且与网页有关的css,js,图片等文件也会的加载。

2.访问assets目录下的资源文件:

AssetManager.open(String filename),返回的是一个InputSteam类型的字节流,这里的filename必须是文件比如

(aa.txt;img/semll.jpg),而不能是文件夹。

3.获取assets的文件及目录名:

//获取assets目录下的所有文件及目录名,content(当前的上下文如Activity,Service等ContextWrapper的子类的

都可以)

String fileNames[] =context.getAssets().list(path);

4.将assets下的文件复制到SD卡:

  1. /**
  2. *  从assets目录中复制整个文件夹内容
  3. *  @param  context  Context 使用CopyFiles类的Activity
  4. *  @param  oldPath  String  原文件路径  如:/aa
  5. *  @param  newPath  String  复制后路径  如:xx:/bb/cc
  6. */
  7. public void copyFilesFassets(Context context,String oldPath,String newPath) {
  8. try {
  9. String fileNames[] = context.getAssets().list(oldPath);//获取assets目录下的所有文件及目录名
  10. if (fileNames.length > 0) {//如果是目录
  11. File file = new File(newPath);
  12. file.mkdirs();//如果文件夹不存在,则递归
  13. for (String fileName : fileNames) {
  14. copyFilesFassets(context,oldPath + "/" + fileName,newPath+"/"+fileName);
  15. }
  16. } else {//如果是文件
  17. InputStream is = context.getAssets().open(oldPath);
  18. FileOutputStream fos = new FileOutputStream(new File(newPath));
  19. byte[] buffer = new byte[1024];
  20. int byteCount=0;
  21. while((byteCount=is.read(buffer))!=-1) {//循环从输入流读取 buffer字节
  22. fos.write(buffer, 0, byteCount);//将读取的输入流写入到输出流
  23. }
  24. fos.flush();//刷新缓冲区
  25. is.close();
  26. fos.close();
  27. }
  28. } catch (Exception e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. //如果捕捉到错误则通知UI线程
  32. MainActivity.handler.sendEmptyMessage(COPY_FALSE);
  33. }
  34. }



5.使用assets目录下的图片资源:

  1. InputStream is=getAssets().open("wpics/0ZR424L-0.jpg");
  2. Bitmap bitmap=BitmapFactory.decodeStream(is);
  3. imgShow.setImageBitmap(bitmap);



6.播放assets目录下的音乐

首先,获取通过openFd()的方法获取asset目录下指定文件的AssetFileDescriptor对象。

其次,通过MediaPlayer对象的setDataSource (FileDescriptorfd, longoffset, long length)方法加载音乐文件。

最后,调用prepare方法准备音乐,start方法开始播放音乐。

预备知识:

AssetFileDescriptor简介:

在AssetManager中一项的文件描述符。这提供你自己打开的FileDescriptor可用于读取的数据,以及在文件中的

偏移量和长度的该项的数据。

可以通过AssetManager的openFd()的方法获取asset目录下指定文件的AssetFileDescriptor对象。

常用方法:

Public Methods

FileInputStream

createInputStream()

为asset创建并返回一个自动关闭的输入流。

FileOutputStream

createOutputStream()

为asset创建并返回一个自动关闭的输出流。

FileDescriptor

getFileDescriptor()

返回可用于读取文件中的数据的FileDescriptor对象。

long

getLength()

返回该asset中项的数据的总字节数。

long

getStartOffset()

返回asset中项的数据字节开始偏移。

具体代码:

  1. // 打开指定音乐文件,获取assets目录下指定文件的AssetFileDescriptor对象
  2. AssetFileDescriptor afd = am.openFd(music);
  3. mPlayer.reset();
  4. // 使用MediaPlayer加载指定的声音文件。
  5. mPlayer.setDataSource(afd.getFileDescriptor(),
  6. afd.getStartOffset(), afd.getLength());
  7. // 准备声音
  8. mPlayer.prepare();
  9. // 播放
  10. mPlayer.start();

Android开发之assets目录下资源使用总结的更多相关文章

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

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

  2. Android 开发之Windows环境下Android Studio安装和使用教程(图文详细步骤)

    鉴于谷歌最新推出的Android Studio备受开发者的推崇,所以也跟着体验一下. 一.介绍Android Studio  Android Studio 是一个Android开发环境,基于Intel ...

  3. Android开发之assets文件夹中资源的获取

    assets中的文件都是保持原始的文件格式,需要使用AssetManager以字节流的形式读取出来 步骤: 1. 先在Activity里面调用getAssets() 来获取AssetManager引用 ...

  4. Android开发之 Windows环境下通过Eclipse创建的第一个安卓应用程序(图文详细步骤)

    第一篇  windows环境下搭建创建的第一个安卓应用程序 为了方便,我这里只采用了一体包进行演示. 一.下载安卓环境的一体包. 官网下载:安卓官网(一般被墙了) 网盘下载: http://yunpa ...

  5. Android开发之TextView的下划线添加

    如何给TextView添加下划线呢,最近项目中需要这个,于是就用代码添加了下划线功能.主要就是用Paint的setFlags方法来实现,具体如下: ((TextView)mScrollView.fin ...

  6. Android 开发之Windows环境下Android Studio安装和使用教程

    JDK环境配置: http://www.cnblogs.com/liuhongfeng/archive/2015/12/30/5084896.html Android Studio下载地址:http: ...

  7. Android Studio增加assets目录、raw目录

    assets与res/raw不同 assets目录是Android的一种特殊目录,用于放置APP所需的固定文件,且该文件被打包到APK中时,不会被编码到二进制文件. Android还存在一种放置在re ...

  8. Android读取assets目录下的资源

    1.获取资源的输入流 资源文件 sample.txt 位于 $PROJECT_HOME/assets/ 目录下,可以在 Activity 中通过 Context.getAssets().open(“s ...

  9. Android开发之旅2:HelloWorld项目的目录结构

    引言 前面Android开发之旅:环境搭建及HelloWorld,我们介绍了如何搭建Android开发环境及简单地建立一个HelloWorld项目,本篇将通过HelloWorld项目来介绍Androi ...

随机推荐

  1. Java vs C++:子类覆盖父类函数时缩小可访问性的不同设计

    Java 和 C++ 都是面向对象的语言,允许对象之间的继承.两个语言的继承都设置有允许子类覆盖父类的“虚函数”,加引号是因为 Java 中没有虚函数这一术语,但是我们的确可以把 Java 的所有函数 ...

  2. ejs模板引擎的使用

    引入ejs.min.js 创建模板,以<%=jsCode%>包裹起来其余的html和html结构一样 focusTemplateData是模板使用的数据,使用$.each()方法遍历绑定数 ...

  3. IOS上架App Store商店步骤

    苹果官方在2015年05-06月开发者中心进行了改版,网上的APP Store上架大部分都不一样了,自己研究总结一下,一个最新的上架教程以备后用. 原文地址:http://www.16css.com/ ...

  4. 【AtCoder Beginner Contest 074 D】Restoring Road Network

    [链接]h在这里写链接 [题意] 给你任意两点之间的最短路. 让你求出原图. 或者输出原图不存在. 输出原图的边长总和的最小值. [题解] floyd算法. 先在原有的矩阵上. 做一遍floyd. 如 ...

  5. C语言深度剖析-----多维数组和多维指针

    多维数组和多维指针 指向指针的指针 指针变量同样也有传址调用和传值调用 case1:估算要5个字节的空间,实际只用前面3个字节,设计释放空的2字节 case2:扩充到10字节 二维数组与二维指针 二维 ...

  6. 【Codeforces Round #435 (Div. 2) B】Mahmoud and Ehab and the bipartiteness

    [链接]h在这里写链接 [题意] 让你在一棵树上,加入尽可能多的边. 使得这棵树依然是一张二分图. [题解] 让每个节点的度数,都变成二分图的对方集合中的点的个数就好. [错的次数] 0 [反思] 在 ...

  7. SpringBoot日志logback-spring.xml分环境(转)

    springboot按照profile进行打印日志 log4j logback slf4j区别? 首先谈到日志,我们可能听过log4j logback slf4j这三个名词,那么它们之间的关系是怎么样 ...

  8. 【JS学习】-利用谷歌浏览器调试JS代码(转)

    谷歌浏览器是常用来调试JS代码的工具,本文主要介绍如何利用谷歌浏览器来调试JS代码,协助我们进行开发工作. 首先,打开谷歌浏览器,按快捷键F12或者ctrl+shift+j,就可以打开谷歌浏览器的开发 ...

  9. [Phonegap+Sencha Touch] 移动开发72 List列表横向滑动操作(仿QQ列表滑动删除)

    原文链接:http://blog.csdn.net/lovelyelfpop/article/details/50425744 本插件有2个版本号:sencha touch 版本号和 extjs6 m ...

  10. Multivariate Linear Regression

    Multiple Features Linear regression with multiple variables is also known as "multivariate line ...