微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将文件打包在/data/data/PackageName/files 文件夹内,如何突破UNCOMPRESS_DATA_MAX 的限制

android可供打包的资源文件,在项目开发时有:assets,不过据说不能写入。

如果希望将需要用到的文件打入apk,比如sqlite的db文件,现在的方法是,在项目中,把文件先存在assets里,然后在程序第一次启动时,将assets中的文件拷贝到/data/data中。

需要注意的是,如果直接使用db做为文件后缀,在拷贝大于1M的文件时时将会出现:

DEBUG/asset(725): Data exceeds UNCOMPRESS_DATA_MAX (1662976 vs 1048576)



出现这个问题的原因是,assetsManager 无法处理大于1M的文件的压缩和解压。

但以下文件类型,因为是已经压缩过的,不会进行压缩处理,如下:

/* these formats are already compressed,or don't compress well */

static const char* kNoCompressExt[] = {

    ".jpg",".jpeg",".png",".gif",".wav",".mp2",".mp3",".ogg",".aac",".mpg",".mpeg",".mid",".midi",".smf",".jet",".rtttl",".imy",".xmf",".mp4",".m4a",".m4v",".3gp",".3gpp",".3g2",".3gpp2",".amr",".awb",".wma",".wmv"

};

参考:http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/

所以,现在的思路是:将sqlite db文件,先改名为.jpg文件,放在assets中,然后在程序第一次启动时,改名拷贝到/data/data中。

参考代码如下:

import android.content.Context;
import android.content.res.AssetManager;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.util.Log;


public class InitResources {
private Context _context;
public InitResources(Context context) {
_context = context;
}

public void copyAssets(String dirname,String renFrom,String renTo) { AssetManager assetManager = _context.getAssets(); String[] files = null; try { files = assetManager.list(dirname); } catch (IOException e) { Log.e("tag",e.getMessage()); } InputStream in = null; OutputStream out = null; for(int i=0; i<files.length; i++) { try { in = assetManager.open(dirname + "/" + files[i]); out = new FileOutputStream(_context.getFilesDir().getAbsolutePath() +"/"+ rename(files[i],renFrom,renTo)); copyFile(in,out); in.close(); in = null; out.flush(); out.close(); out = null; } catch(IOException e) { Log.e("tag",files[i]); Log.e("tag",e.toString()); } } } private void copyFile(InputStream in,OutputStream out) throws IOException { byte[] buffer = new byte[1024]; int read; while((read = in.read(buffer)) != -1){ out.write(buffer,read); } } private String rename(String filename,String renTo) { return filename.replaceAll(renFrom,renTo); } }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐