我们读取apk里assets文件夹下的文件,通过context.getAssets().open(路径) InputStream获取,只能获取到输入流。通过context.getAssets().openFd() AssetFileDescriptor获取,可以得到对应的File对象,但是要求文件不能压缩。 这里我选择获取输入流。那么就要把输入流转为对象,再交给findObbFile。 处理方式为读取apk/assets/obb文件夹中的唯一一个文件作为数据包,先将文件写入/data/data/包名/files文件夹,再将写入后的文件的File对象返回。 点击展开代码static public File setTmpObb(Context ctx) throws IOException {
Log.d("exagear", "setTmpObb: 进入生成临时数据包的函数 ");
try{
File destDir = ctx.getFilesDir();
if (!destDir.exists()) {
boolean b = destDir.mkdir();
assert b;
}
String[] list = ctx.getAssets().list("obb");
//如果目录下没有文件或者多个文件,返回null,让exagear显示报错
if (list.length != 1)
return null;
//获取asstes的inputstream
InputStream is = ctx.getAssets().open("obb/" + list[0]);
//复制到files文件夹
// File.createTempFile("exa","obb",destDir);
File newFile = new File(destDir.getAbsolutePath() + "/" + list[0]); //创建新文件
//如果已经存在(一般不会,但是如果在第一次解压的时候强制关掉的话,第二次启动)
if (newFile.exists()) {
boolean b = newFile.delete();
assert b;
}
//vm正常关闭(程序退出时)会删掉此文件。
newFile.deleteOnExit();
//创建该文件
if (!newFile.createNewFile()) {
return null;
}
FileOutputStream fos = new FileOutputStream(newFile); //新文件输出流
int len = -1;
byte[] buffer = new byte[4096];
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.close();
is.close();
return newFile;
}catch (IOException e){
Log.d("Exagear", "setTempObbFile: 出错:"+e.getMessage());
throw e;
}
}
files里的obb用完后应该删除。 点击展开代码static public void delTmpObb(Context ctx){
Log.d("exagear", "setTempObbFile: 进入删除临时数据包的函数 ");
try{
File destDir = ctx.getFilesDir();
String[] list = ctx.getAssets().list("obb");
if(list.length == 1){
File newFile = new File(destDir.getAbsolutePath() + "/" + list[0]); //创建新文件
//如果存在,就删除
if (newFile.exists()) {
boolean b = newFile.delete();
assert b;
}
}
}catch (IOException e){
Log.d("Exagear", "delTmpObb: 出错:"+e.getMessage());
}
}
|