有时候写程序需要用到sd卡目录下的一些文件,但是出于用户体验的考虑,安装的时候而不需要用户手动拷贝文件到sd卡的相应目录下, 于是如果在文件大小可以的情况下,可以把文件打包到apk中,当然放到assets目录下是最明智的选择;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.content.Context;
public class AssetFile {
private String assetFileName;
private Context context;
public AssetFile(Context context){
this.context = context;
}
public AssetFile fromAsset(String assetFileName){
this.assetFileName = assetFileName;
return this;
}
/**
* @param path "hello.txt" 设置文件大小为10K
*/
public void toSdcard(String filePath){
try {
InputStream inStream = context.getAssets().open(assetFileName);
OutputStream outStream = new FileOutputStream(filePath);
byte[] buffer = new byte[1024*10];
int length = inStream.read(buffer);
outStream.write(buffer, 0, length);
outStream.flush();
inStream.close();
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面的程序中限制了拷贝大小为10K及10K以内的文件,如果需要拷贝更大的文件,可以更改这里的上限值;但是,作为开发者,为了便于更新和安装,当然不希望Apk包过大带来的用户更新安装等待时间长的不良用户体验,所以,尽量不要打包太大的文件到apk中;
使用上面的函数,把assets中的hello.txt文件拷贝到sd卡根目录下;
private boolean checkFileExistOrCopy() {
String sdcardPath = Environment.getExternalStorageDirectory().getPath()
+ File.separator;
File file = new File(sdcardPath+ "hello.txt");
if(!file.exists()){
new AssetFile(this).fromAsset("hello.txt").toSdcard(file.getAbsolutePath());
}
return true;
}
那么相关的sd卡权限请自觉加上即可;上面的sdcardPath输出;/mnt/sdcard/
如果拷贝到某个目录下,则有:
file = new File(sdcardPath+ "MyMusic/");
if(!file.exists()){
file.mkdirs();
}
file = new File(sdcardPath + "MyMusic/wing.mp3");
if (!file.exists()) {
new AssetFile(this).fromAsset("wing.mp3").toSdcard(
file.getAbsolutePath());
}