读写Android中assets目录下的文件的方法详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
读写Android中assets⽬录下的⽂件的⽅法详解
Android资源⽂件⼤致可以分为两种:
第⼀种是res⽬录下存放的可编译的资源⽂件:
这种资源⽂件系统会在R.java⾥⾯⾃动⽣成该资源⽂件的ID,所以访问这种资源⽂件⽐较简单,通过R.XXX.ID即可;
第⼆种是assets⽬录下存放的原⽣资源⽂件:
因为系统在编译的时候不会编译assets下的资源⽂件,所以我们不能通过R.XXX.ID的⽅式访问它们。
那我么能不能通过该资源的绝对路径去访问它们呢?因为apk安装之后会放在/data/app/**.apk⽬录下,以apk形式存在,asset/res和被绑定在apk⾥,并不会解压到/data/data/YourApp⽬录下去,所以我们⽆法直接获取到assets的绝对路径,因为它们根本就没有。
还好Android系统为我们提供了⼀个AssetManager⼯具类。
查看官⽅API可知,AssetManager提供对应⽤程序的原始资源⽂件进⾏访问;这个类提供了⼀个低级别的API,它允许你以简单的字节流的形式打开和读取和应⽤程序绑定在⼀起的原始资源⽂件。
Android除了提供/res⽬录存放资源⽂件外,在/assets⽬录也会提供存放资源⽂件,在/assets⽬录下⾯不会在R.java⾥⾯⾃动⽣成ID,所以读取assets⽬录下⾯的资源⽂件需要提供路径,我们可以通过AssetManager类来访问这些⽂件。
作者需要实现从 A.apk(资源apk ,把所有的资源如:so、apk、可执⾏⽂件等放到assets⽬录下⾯,apk没有实现逻辑代码)拷贝资源到指定⽬录下,所以作者创建了⼀个实现资源拷贝逻辑的 B.apk(⼀个Service,也可⽤Activity实现),由于拷贝路径⼀般情况下是不可访问或者创建的(每个apk安装之后只能访问/data/data/⾃⼰包名/下⾯的私有空间),作者需要这个apk能够获取系统权限(System权限),则必须在AndroidManifest.xml声明shareduserid,具体如何操作下⼀节进⾏记录。
⼀、AssetManager读取⽂件常⽤的⼏个API
⼆、相关实现代码
资源APK(A.apk)
具体实现代码⽚段,由于使⽤系统权限,⽣成的路径可以⾃⼰改⼀下B.apk
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(yout.main);
try {
ctxDealFile = this.createPackageContext("com.zlc.ipanel",
Context.CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
btn3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
String uiFileName = "ipanelJoin";
deepFile(ctxDealFile, uiFileName);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
textView.setText("file is wrong");
}
}
});
//
}
public void deepFile(Context ctxDealFile, String path) {
try {
String str[] = ctxDealFile.getAssets().list(path);
if (str.length > 0) {//如果是⽬录
File file = new File("/data/" + path);
file.mkdirs();
for (String string : str) {
path = path + "/" + string;
System.out.println("zhoulc:\t" + path);
// textView.setText(textView.getText()+"\t"+path+"\t");
deepFile(ctxDealFile, path);
path = path.substring(0, stIndexOf('/'));
}
} else {//如果是⽂件
InputStream is = ctxDealFile.getAssets().open(path);
FileOutputStream fos = new FileOutputStream(new File("/data/" + path));
byte[] buffer = new byte[1024];
int count = 0;
while (true) {
count++;
int len = is.read(buffer);
if (len == -1) {
break;
}
fos.write(buffer, 0, len);
}
is.close();
fos.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}。