1.上手机时INSTALL_FAILED_INSUFFICIENT_STORAGE 错误提示
主要原因还是asset文件夹里面的东西太大导致的,开始自己放了几个字体在里面,其中有一个5M大的 安装的时候就悲剧了,删除后问题解决。
如果是模拟器爆这个错误,可以添加参数:-partition-size 1024
在网络上查了下关于这个问题的深入原因:
“在使用Android自带的Res/raw或使用Asset时都需要经过Asset Manager,这将会产生一个比较严重的问题,在Android模拟器测试时不存在问题,但放到真机G1时会面临多个问题,经过查看 UNCOMPRESS_DATA_MAX的取值为1048576字节,除以1024不难发现是1MB。也就是说Android手机在处理资源文件时不能大 于1mb的体积”
目前解决的方法只有将文件放入到sdcard,但这样除了microsd的读取IO效率和耗电量解决不是很好,同时sd卡移除时可能存在问题,解决的方法 如果数据量大的化通过sqlite是一种解决方法,同时openFileOutput方式读取也是不错的选择,看来android操作系统中最安全控制的 严格,但犯了一个不小的错误。
这里涉及到asset文件夹和raw文件夹的一点知识:
*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");
补充一下:在未知目录下有哪些文件,该去和获取这些文件的名称并把文件拷贝到目标目录中呢?(用于内置文件但不知道文件名称,需要筛选出想要的文件然后拷贝到目标目录中,推荐内置在assets文件夹中)
1.res/raw目录:
通过反射的方式得到R.java里面raw内部类里面所有的资源ID的名称,然后通过名称获取资源ID的值来读取我们想要的文件。
2.assets目录:
getAssets().list("");来获取assets目录下所有文件夹和文件的名称,再通过这些名称再读取我们想要的文件。