我正在开发一款安卓游戏。我想在用户第一次安装游戏时将文本文件复制到外部SD卡。文本文件对于正确运行游戏很重要。
我该怎么做?我应该将文本文件放在eclipse源项目中,这样当我构建apk文件时,我的文本文件也被捆绑在其中,当一个用户从该apk文件安装应用程序时,文本文件被复制到“SDcard \ data”文件夹?
我应该编写什么代码以及在哪里编写代码,以便在安装时只执行一次。
提前致谢
答案 0 :(得分:6)
这是我在首次安装应用时将文件复制到SD卡的方法:
public class StartUp extends Activity {
/**
* -- Called when the activity is first created.
* ==============================================================
**/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FirstRun();
}
private void FirstRun() {
SharedPreferences settings = this.getSharedPreferences("YourAppName", 0);
boolean firstrun = settings.getBoolean("firstrun", true);
if (firstrun) { // Checks to see if we've ran the application b4
SharedPreferences.Editor e = settings.edit();
e.putBoolean("firstrun", false);
e.commit();
// If not, run these methods:
SetDirectory();
Intent home = new Intent(StartUp.this, MainActivity.class);
startActivity(home);
} else { // Otherwise start the application here:
Intent home = new Intent(StartUp.this, MainActivity.class);
startActivity(home);
}
}
/**
* -- Check to see if the sdCard is mounted and create a directory w/in it
* ========================================================================
**/
private void SetDirectory() {
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
extStorageDirectory = Environment.getExternalStorageDirectory().toString();
File txtDirectory = new File(extStorageDirectory + "/yourAppName/txt/");
// Create
// a
// File
// object
// for
// the
// parent
// directory
txtDirectory.mkdirs();// Have the object build the directory
// structure, if needed.
CopyAssets(); // Then run the method to copy the file.
} else if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED_READ_ONLY)) {
AlertsAndDialogs.sdCardMissing(this);//Or use your own method ie: Toast
}
}
/**
* -- Copy the file from the assets folder to the sdCard
* ===========================================================
**/
private void CopyAssets() {
AssetManager assetManager = getAssets();
String[] files = null;
try {
files = assetManager.list("");
} catch (IOException e) {
Log.e("tag", e.getMessage());
}
for (int i = 0; i < files.length; i++) {
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open(files[i]);
out = new FileOutputStream(extStorageDirectory + "/yourAppName/txt/" + files[i]);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch (Exception e) {
Log.e("tag", e.getMessage());
}
}
}
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, 0, read);
}
}
答案 1 :(得分:0)
对于此目标,最好的方法是使SharedPreferences或您的文件必须添加到android项目的“assets”目录中。
答案 2 :(得分:0)
根据link
有ACTION_PACKAGE_ADDED广播意图,but the application being installed doesn't receive this.
所以看起来使用SharedPreferences是最简单的方法......
SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(this);
boolean firstRun = p.getBoolean(PREFERENCE_FIRST_RUN, true);
p.edit().putBoolean(PREFERENCE_FIRST_RUN, false).commit();
答案 3 :(得分:0)
将文件放在assets文件夹中。然后,使用您提出的任何逻辑,当您的应用程序启动时确定它是否是应用程序的第一次运行。
如果是,您可以使用Activity中的getAssets()来访问资产文件,并将其复制到必要的位置。
答案 4 :(得分:0)
由于SD卡上的文件可能会被用户意外删除,因此您应该直接检查其存在(并可能验证内容),而不是尝试使用独立的内容(如共享首选项)来判断是否存在是活动的第一次运行。
出于潜在应用升级的目的,您可能应该在文件中添加版本号,然后检查。
如果您想让高级用户手动编辑文件(更改专家选项),那么升级时可能会遇到一些挑战。