Android下的assets目录,res目录访问机制

原文链接:http://www.jianshu.com/p/c5d41272c7e9

Assets资源

assets/和res/raw目录

相同之处

两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制,这些文件将被打包到APK中应用使用。

不同之处

  • res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
  • res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹

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

res/raw目录

访问res/raw目录下文件的原始数据

InputStream is = getResources().openRawResource(R.id.filename);

assets/目录

创建assets/目录

  • 直接在src/main/路径下创建assets文件夹
  • Project选中project模式,选中app文件夹,工具栏选择File > New > Folder > Assets Folder

AssetManager

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

获取AssetManager示例

可以通过Context.getAssets()来获取AssetManager示例。

AssetManager常用方法
public Method 描述
String[] list(String path) 返回指定路径下的所有文件及目录名。
InputStream open(String fileName) 使用 ACCESS_STREAMING模式打开assets下的指定文件。
InputStream open(String fileName, int accessMode) 使用指定的访问模式打开assets下的指定文件.

当调用open()来创建一个InputStream流时,fileName参数必须是文件,不能是文件夹。open方法是以assets目录为根的。

实践

  1. 加载assets/目录下的html文件:webView.loadUrl("file:///android_asset/win8_Demo/index.html");.Android SDK制定了URI:file:///android_asset/ + 文件路径来表示assets/目录下文件的绝对路径。这种方式可以加载assets目录下的网页,并且与网页有关的css,js,图片等文件也会的加载。
  2. String fileNames[] =context.getAssets().list("");来获取assets/跟目录下的所有文件和文件夹。这里发现,安装app之后assets/目录下默认有三个文件夹:images,webkit,sounds。

assets dir.png

注意点

调用close()时机

当我们在项目中调用AssetManager.close()时,程序会终止并报错:Assetmanager has been closed

这是因为,每一个APK文件在进程中都对应有一个全局的Resourses对象以及一个全局的AssetManager对象。其中,这个全局的Resourses对象保存在一个对应的ContextImpl对象的成员变量mResources中,而这个全局的AssetManager对象保存在这个全局的Resourses对象的成员变量mAssets中。

问题

  • URI怎么转换成文件路径
  • res/raw/目录下的资源怎么通过URI来访问
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值