之前一直都是看别人的博客,今天才决定写博客,记录自己学习过程中的问题,知识总结,以和其他朋友分享。
前几天遇到读取Assets中的资源文件的问题,故在这做下总结。
1、assets和res目录有什么不同.
res一般存放的是可编译的资源文件(raw除外,raw资源文件不会被编译)。
这种资源文件系统或在R.java里面自动生产该资源文件的id,所以Res目录下的资源文件访问方式比较简单,通过R.XXX.id即可。
assets目录下存放的是原生的资源文件。系统在编译的时候不会编译assets目录下的资源文件,所以不能通过R.XXX.id直接访问assets目录下的资源文件。
因为apk安装之后会放在/data/app/**.apk目录下,以apk的形式存在,assets/res被绑定在apk里,并不会解压到/data/data/YourApp目录下,
因此,assets目录下的文件也不可以通过资源的绝对路径访问。那么,我们该用何种方式来访问assets目录下的资源文件呢?
系统为我们提供了一个AssetManager工具类来帮助我们使用assets目录下的原始资源文件。
2、AssetManager的介绍
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下的指定文件.
3、怎么在Android studio 工程中向assets文件夹下存放资源
然后点击finish即可自动创建出asstes空文件夹。
然后可以在继续在assets文件夹下创建新的目录,存放资源文件。
注意:如果误将assets空文件夹创建到了res目录下,assets空文件夹会显示不出来。
这时,即使去工程所在的路径下直接将文件复制到assets文件夹下,代码处理正确,也读取不到assets目录下的文件。
4、读取assets目录下的资源文件的例子。
layout文件就只包含了一个ImageView 和一个Button,比较简单在这就不呈现出来了,
package com.outdoors.jinghuang.demo;
import android.app.Activity;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.IOException;
import java.io.InputStream;
public class AssetsDemo extends Activity implements View.OnClickListener {
private ImageView showPictureIv;
private Button nextBt;
private String[] pictures;
private int currentPicture = 0;
private AssetManager assets;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.assets_demo);
loadAssetsData();
initView();
}
private void initView() {
showPictureIv = (ImageView) findViewById(R.id.show_picture_iv);
//设置默认图片
showPictureIv.setImageResource(R.drawable.ic_launcher);
nextBt = (Button) findViewById(R.id.next_bt);
nextBt.setOnClickListener(this);
}
private void loadAssetsData() {
//获取AssetManager
assets = getResources().getAssets();
try {
//获取assets目录下的所有文件及目录名
pictures = assets.list("picture");
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.next_bt) {
//防止越界
if (currentPicture >= pictures.length) {
currentPicture = 0;
}
InputStream inputStream = null;
try {
inputStream = assets.open("picture/" + pictures[currentPicture]);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
showPictureIv.setImageBitmap(bitmap);
currentPicture++;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
inputStream = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}