典型应用之——将数据打进 apk

1. 介绍
需要安装一些资源到系统中,比如多媒体文件,配置文件或者某种数据文件,可以把它打包放在资源 raw 目录中,然后在程序中读取解包,并安装在指定目录下

2. android 框架对多媒体的支持
apk 包中的数据一般都放在 res/raw 目录下,只有它的拥有者能通过 openRawResourceFd 的方式访问,如果不在 java

层访问,或者要将其安装在其它位置,就需要在 java 程序中对其进行处理

3. 例程

  1. 功能
    把多媒体及数据文件打在 zip 包放在 res/raw 下,并将其打在安装包 apk 中,在程序中点击按钮时将其安装在指定目录下

  2. 可从此处下载可独立运行的代码
    [http://download.csdn.net/source/2841538

](http://download.csdn.net/source/2841538)

  1. 核心代码及说明
    ** package com.android.mydata;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.content.res.AssetFileDescriptor;
import android.content.res.Resources;
import android.view.View.OnClickListener;
import android.view.View;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class MyDataActivity extends Activity {
String rootDirectory = "/data/data/com.android.mydata/data/"; // ** ** 安装的目录


TextView status;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button) findViewById(R.id.button);
status = (TextView) findViewById(R.id.status);
btn.setText("install"); // ** ** 点击此按钮开始安装 ** **
status.setText("wait...");
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
unpack();
status.setText("okey...");
}
});
}

boolean unpack() {
FileOutputStream out;
byte buf[] = new byte[16384];
try {
Resources res = getResources(); // ** ** 获得资源句柄 ** **
AssetFileDescriptor fd = res.openRawResourceFd(R.raw.test); // ** ** 压缩文件为

** ** test.zip
InputStream stream = fd.createInputStream();
ZipInputStream zis = new ZipInputStream(stream);
ZipEntry entry = zis.getNextEntry();
while (entry!= null) {
if (entry.isDirectory()) { // ** ** 对文件夹处理 ** **
File newDir = new File(rootDirectory + entry.getName());
newDir.mkdir();
} else { // ** ** 对文件处理 ** **
String name = entry.getName();
File outputFile = new File(rootDirectory + name);
String outputPath = outputFile.getCanonicalPath();
name = outputPath
.substring(outputPath.lastIndexOf("/") + 1);
outputPath = outputPath.substring(0, outputPath
.lastIndexOf("/"));
File outputDir = new File(outputPath);
outputDir.mkdirs();
outputFile = new File(outputPath, name);
outputFile.createNewFile();
out = new FileOutputStream(outputFile);

int numread = 0;
do {
numread = zis.read(buf);
if (numread <= 0) {
break;
} else {
out.write(buf, 0, numread);
}
} while (true);
out.close();
}
entry = zis.getNextEntry();
}
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
} **

  1. 注意:打包数据不能太小,否则会出错。数据打包使用如下命令
    zip -r../test.zip *

4. 参考

  1. 源代码语音合成 external/svox/picolanginstaller 对语音数据的安装

  2. [http://cnmsdn.com/html/201010/1287296527ID8341.html

](http://cnmsdn.com/html/201010/1287296527ID8341.html)