首页 > 代码库 > apk安装时把程序附带文件拷贝到手机指定目录下
apk安装时把程序附带文件拷贝到手机指定目录下
项目已搞定,今天把.apk文件弄到另外一台非调试手机上用,发现一个问题。因为要画图,所以绘图的点的数据保存在一个.txt的文本文件中,上次直接把它用usb传到指定文件夹下的,但是明显不科学,因为用户下载了你的.apk文件,你却告诉他,还要把这个文本文件拷贝到指定的文件夹下,所以,我就要解决这个问题,就是把文本文件打包在apk文件中,安装.apk时就让创建一个程序文件夹,然后把文本文件拷贝到这个目录文件夹里,用户运行程序,就可以绘图,不用再让他拷贝一份绘图的点的坐标的数据。同理,其实我这里还有设计轨廓的数据和标准轨廓的数据也是要初始时就要存在的。
这里就给了一个方法,用来解决这个问题。
首先,你要把运行必须的文件命名好,只能是a-z,0-9这36个字符(它是这么提醒我的)组成的文件名,然后在你的工程下新建一个文件夹raw,一般来说这个文件夹是没有的,因为这个文件夹下的文件是不会经过压缩的,而是直接拷贝到apk文件中,最后把你的文件添加到raw文件夹中,这样就做好了第一步。
类似如上图的创建文件夹,添加文件就可以了。
添加了文件,那么怎么copy这些文件到指定目录下呢?这里有几点,其实都是文件操作那一块的知识点。第一,判断指定的文件目录和文件是否存在,不存在就要先创建;第二,引用raw中的文件;第三,把raw中文件copy到创建的文件中,或者说是raw中文件写到输出流,再把输入流写到手机上创建的文件中。
我这里简单的写了一个函数,函数前两个参数,一个是写入到手机上的文件的目录路径,一个是新创建的文件名字。第三个参数是最重要的,也就是raw中文件是以gen文件夹下的R.java中的id来索引的,就像我们的界面里面的button在程序中引用也是通过id来索引的。这第三个参数是一个int型,就是这个文件的id,R.java中是int型,大家可以看看。这个函数代码如下:
private void copyfile(String fileDirPath,String fileName,int id) { String filePath = fileDirPath + "/" + fileName;// 文件路径 try { File dir = new File(fileDirPath);// 目录路径 if (!dir.exists()) {// 如果不存在,则创建路径名 dir.mkdirs(); } // 目录存在,则将apk中raw文件夹中的需要的文档复制到该目录下 File file = new File(filePath); if (!file.exists()) {// 文件不存在 InputStream is = getResources().openRawResource( id);// 通过raw得到数据资源 FileOutputStream fs = new FileOutputStream(file); byte[] buffer = new byte[1024]; int count = 0;// 循环写出 while ((count = is.read(buffer)) > 0) { fs.write(buffer, 0, count); } fs.close();// 关闭流 is.close(); } } catch (Exception e) { e.printStackTrace(); } }
我们可以在第一个activity的oncreate方法中调运这个函数,这样安装.apk文件后,第一次打开程序,就创建了指定文件,这个文件是从raw中拷贝过去的。
createFile("/sdcard/test/data","TB60.txt",R.raw.tb60); createFile("/sdcard/test/guikuo","设计轨廓.txt",R.raw.sjgk); createFile("/sdcard/test/guikuo","标准轨廓.txt",R.raw.bzgk);
上面的参数都是自己可以修改的。不过,你安装之后,如果没有运行程序,是不会找到这些文件夹的,因为这是在第一运行是才创建,下次运行,判断文件已存在,就不做任何处理了。
其实,这是一个很简单的细节,就是对文件的操作,不过有时还真的用得到,当然,不仅仅是文本文件,音乐文件也是可以放在这里面的,大家可以多尝试一下。