Android Resources之assets
https://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目录为根的。
实践
加载assets/目录下的html文件:
webView.loadUrl("file:///android_asset/win8_Demo/index.html");
.Android SDK制定了URI:file:///android_asset/ + 文件路径来表示assets/目录下文件的绝对路径。这种方式可以加载assets目录下的网页,并且与网页有关的css,js,图片等文件也会的加载。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来访问
参考
java.lang.RuntimeException: Assetmanager has been closed
作者:狮_子歌歌
链接:https://www.jianshu.com/p/c5d41272c7e9
来源:简书
著作权归作者所有。非商业转载请注明出处。