前言
Android有assets和resources两大资源系统。resources资源系统设计有良好的检索系机制,但它无法应付图形和声音文件这样的大文件,因此这些资源实际是保存在assets系统里的。
/res和/assets的不同点是,Android不为/assets下的文件生成ID。如果使用/assets下的文件,需要指定文件的路径和文件名。
assets和res/raw的对比
res/raw和assets的相同点:
两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
res/raw和assets的不同点:
- res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
- res/raw不可以有目录结构,而assets则可以有目录结构(在其目录下可以再建文件夹)
- 读取res/raw下的文件资源,通过以下方式获取输入流:InputStream is = getResources().openRawResource(R.raw.filename); 读取assets下的文件资源,通过以下方式获取输入流:InputStream is = getAssets().open("filename");
访问assets文件
由于asset文件是不会生成资源id,因此不能通过getresource()获取。
Android给我们AssetManager来访问assets中的内容。
//获取AssetManager AssetManager mAssetManager = getAssets();
list
AssetsManager.list(String)方法能列出指定目录中的所有文件和文件夹。
/** * * @param assetManager * @param folderPath [assets中的目录,根目录“”(空字符串),其他的写目录名image] */ private void findALlFile(AssetManager assetManager, String folderPath) { if (null == assetManager || null == folderPath) { Log.d(TAG, "findALlFile null..."); return; } try { String[] files = assetManager.list(folderPath); if (null != files && files.length > 0) { for (int i = 0; i < files.length; i++) { //打印查询内容 Log.d(TAG, "assetsUsed [" + i + "]: " + files[i]); } } } catch (IOException e) { e.printStackTrace(); } return; }
open
AssetsManager.open(String)方法能标准的InputStrem数据流,然后就随便你怎么处理。
/** * * @param assetManager * @param imageView * @param fileName [是在assets根目录中的"abc.png"或者"image/test.png"] */ private void updateAssetImage(AssetManager assetManager, ImageView imageView, String fileName){ if (null == assetManager || null == imageView || null == fileName) { Log.d(TAG, "updateAssetImage null..."); return; } InputStream mInputStream = null; try { mInputStream = assetManager.open(fileName); if (null != mInputStream) { Drawable mDrawable = Drawable.createFromStream(mInputStream, null); imageView.setImageDrawable(mDrawable); } } catch (IOException e) { e.printStackTrace(); } finally { if (null != mInputStream) { try { mInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return; }
openNonAssetFd
mAssetManager出了处理获取assets内的文件,还可以获取res中的指定文件。
可以使用openNonAssetFd()
代码片段
/** * * @param assetManager * @param imageView * @param resPath 注意格式为[res/drawable/ic_launcher.png] */ private void updateResImage(AssetManager assetManager, ImageView imageView, String resPath){ if (null == assetManager || null == imageView || null == resPath) { Log.d(TAG, "updateResImage null..."); return; } InputStream mInputStream = null; AssetFileDescriptor mAssetFileDescriptor= null; try { mAssetFileDescriptor = assetManager.openNonAssetFd(resPath); if (null != mAssetFileDescriptor) { mInputStream = mAssetFileDescriptor.createInputStream(); if (null != mInputStream) { Drawable mDrawable = Drawable.createFromStream(mInputStream, null); if (null != mDrawable) { imageView.setImageDrawable(mDrawable); } } } } catch (IOException e) { e.printStackTrace(); }finally { if(null!= mInputStream){ try { mInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if(null!=mAssetFileDescriptor){ try { mAssetFileDescriptor.close(); } catch (IOException e) { e.printStackTrace(); } } } return; }
上面的resPath必须写res开头的,其他的就会出现java.io.FileNotFoundException。
参考文章
历史上的今天
暂无评论...
随机推荐
博尔赫斯:我用什么才能留住你
我用什么才能留住你?我给你瘦落的街道、绝望的落日、荒郊的月亮。我给你一个久久地望着孤月的人的悲哀。 我给你我已死去的祖辈,后人们用大理石祭奠的先魂:我父亲的父亲,阵亡于布宜诺斯艾利斯的边境,两颗子弹射穿了他的胸膛,死的时候蓄着胡子,尸体被士兵们用牛皮裹起; ...
You must not call setTag() on a view Glide is targeting
前言记录一下,在使用Glide 老的版本(相对于4之前的)出现如下一下,记录于此,方便自己查阅。正文异常日志:AndroidRuntime( 4299): FATAL EXCEPTION: mainAndroidRuntime( 4299): Process: com.biumall.v...
Service的Context介绍
前言对于Application,Activity和Service这几个类,我们是很[熟悉]的。确实[熟悉],作为App开发这基本都要面对这几个类。几天记录一下Service的Context创建,其实也就是简单的说说。正文Context的使用场景使用Context调用方法,比如启动A...
Android之Back键和HOME键拦截处理
一、拦截BACK键一般的应用有两种方法可以获取,当然你也可以修改Framework层代码进行拦截,但这个真的没必要修改。方法1、重写Activity的onKeyDown方法@Overridepublic boolean onKeyDown(int keyCode, KeyEvent...
Android 语言切换相关问题记录
前言Android切换语言是很常用的功能,项目中一般都会要做做英文和中文两种语言的切换,这里就简单的记录一下改变语言相关的问题。正文圆规正传监听语言切换的广播Intent.ACTION_LOCALE_CHANGED//如下是完整的定义public static final Strin...
常用的Monkey命令
Monkey的概念“猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人(就像猴子一样)不需要知道程序的任何用户交互方面的知识,如果给他一个程序,他就会针对他看到的界面进行操作,其操作是无目的的、乱点乱按的。这种测试方式在产品周期中的早期阶段会找到很多很好的bug,为用户节省不少的时间。...