本文主要是介绍android之assets目录下资源使用、res/raw,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
创建src/main/assets文件夹,assets文件夹和java文件夹平级;assets目录下主要存放四种文件:文本文件、图像文件、网页文件(包括html中引用的js/ccs/jpg等资源)、音频视频文件,
Android资源文件大致可以分为两种:
第一种是res目录下存放的可编译的资源文件:
这种资源文件系统会在R.java里面自动生成该资源文件的ID,所以访问这种资源文件比较简单,通过R.XXX.ID即可;
因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通过R.XXX.ID的方式访问它们。那我么能不能通过该资源的绝对路径去访问它们呢?因为apk安装之后会放在/data/app/**.apk目录下,以apk形式存在,asset/res被绑定在apk里,并不会解压到/data/data/YourApp目录下去,所以我们无法直接获取到assets的绝对路径,因为它们根本就没有。
Android系统为我们提供了一个AssetManager工具类。
参考:https://blog.csdn.net/greathfs/article/details/52123984
************AssetManager************
//获取assets目录下的所有文件及目录名,content(当前的上下文如Activity,Service等ContextWrapper的子类的
都可以)
String fileNames[] =context.getAssets().list(path);
AssetManager提供了如下方法用于处理assets: String[] list(String path); //列出该目录下的下级文件和文件夹名称 InputStream open(String fileName); //以顺序读取模式打开文件,默认模式为ACCESS_STREAMING InputStream open(String fileName, int accessMode); //以指定模式打开文件。读取模式有以下几种: //ACCESS_UNKNOWN : 未指定具体的读取模式 //ACCESS_RANDOM : 随机读取 //ACCESS_STREAMING : 顺序读取 //ACCESS_BUFFER : 缓存读取 void close() //关闭AssetManager实例 *************** 使用assets目录下主要存放四种文件:文本文件、图像文件、网页文件(包括html中引用的js/ccs/jpg等资源)、音频视频文件,下面通过具体的案例分别来说下怎么获取 **********加载assets目录下的网页 webView.loadUrl( "file:///android_asset/html/index.htmll"); 说明:这种方式可以加载assets目录下的网页,并且与网页有关的css,js,图片等文件也会的加载。 ************加载assets目录下的图片资源String fileName="assetimage.png";//这个是assets下图片的路径,如果assetimage.png下有文件夹还要加上文件夹 InputStream is = null;try {is = getAssets().open(fileName);} catch (IOException e) {e.printStackTrace();}Bitmap bitmap = BitmapFactory.decodeStream(is);imagev.setImageBitmap(bitmap);*********************** InputStream is = getAssets().open(fileName); bitmap = BitmapFactory.decodeStream(is); ivImg.setImageBitmap(bitmap); *****************加载assets目录下文本文件 InputStream is = getAssets().open(fileName); int lenght = is.available(); byte[] buffer = new byte[lenght]; is.read(buffer); String result = = new String(buffer, "utf8"); ***************** 加载assets目录下音乐 // 打开指定音乐文件,获取assets目录下指定文件的AssetFileDescriptor对象 AssetFileDescriptor afd = am.openFd(music); mPlayer.reset(); // 使用MediaPlayer加载指定的声音文件。 mPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); // 准备声音 mPlayer.prepare(); // 播放 mPlayer.start(); 补充下:Android中还有另外一个文件夹raw,和assets差不多,也不会被R文件编译,但是raw下不能在建文件夹,assets文件下是可以在建文件夹的,下面是获取raw文件夹下资源的方法: InputStream is = getResources().openRawResource(R.id.filename);
********************
*res/raw和assets的相同点:
1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
*res/raw和assets的不同点:
1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
*读取文件资源:
1.读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作
· InputStream is =getResources().openRawResource(R.id.filename);
2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作
· AssetManager am = null;
· am = getAssets();
· InputStream is = am.open("filename");
注意1:Google的Android系统处理Assert有个bug,在AssertManager中不能处理单个超过1MB的文件,不然会报异常,raw没这个限制可以放个4MB的Mp3文件没问题。
注意2:assets 文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像 xml, java 文件被预编译,可以存放一些图片,html,js, css 等文件。
这篇关于android之assets目录下资源使用、res/raw的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!