我的应用程序将数据库从/data/data复制到外部存储到子目录中。工作很好,但过了一段时间就不工作了。
我也尝试了Stericson的RootTools库,但有同样的错误。
错误信息:
Executing: cp -fp /data/data/file.db /storage/emulated/0/Folder/19700820_135043.db
[ 08-20 13:50:43.559 1959: 2206 D/Command ]
ID: 0, cp: /storage/emulated/0/Folder/19700820_135043.db: No such file or directory
manifest.xml中包含以下权限:
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.ACCESS_SUPERUSER
奇怪的事情是:
- 首先它工作
- 一段时间后出现此错误
- 如果SD卡上文件夹的内容被删除,它又工作了!
我的代码是
private class Async extends AsyncTask<Void, Void, Void> {
homedir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Folder/";
Fhomedir = new File(homedir);
datadir = Environment.getDataDirectory().getAbsolutePath();
sourcefile = "settings.db";
homefile = "backup_" + currentDateandTime + ".db";
sourcedir = datadir + "/data/com.android.providers.settings/databases/" + sourcefile;
@Override
protected void onPreExecute() {
super.onPreExecute();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String currentDateandTime = sdf.format(new Date());
homefile = "backup_" + currentDateandTime + ".db";
try {
File file = new File(homedir, String.valueOf(System.currentTimeMillis() + ".txt"));
Runtime.getRuntime().exec("logcat -d -v long -f " + file.getAbsolutePath());
}
catch (IOException e){
e.printStackTrace();
}
Fhomedir = new File(homedir);
if(!Fhomedir.exists()){
Fhomedir.mkdirs();
}
dialog.show();
}
@Override
protected Void doInBackground(Void... voids) {
if(RootTools.isAccessGiven()){
Log.e("ROOTACCESS", "TRUE");
}
else Log.e("ROOTACCESS", "FALSE");
if(RootTools.remount(homedir, "rw")) {
if (isExternalStorageWritable()) {
//RootTools.copyFile(sourcedir, homedir + homefile, true, true);
FileUtils.copyToDirectory(sourcedir, homedir + homefile);
//exportDB();
}
else Toast.makeText(mContext, "Can't write to SDCARD", Toast.LENGTH_LONG).show();
}
else Toast.makeText(mContext, "Can't write to SDCARD", Toast.LENGTH_LONG).show();
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Intent update = new Intent("com.flextrick.UPDATE");
mContext.sendBroadcast(update);
dialog.dismiss();
File homefilex = new File(homedir + homefile);
if(homefilex.exists()){
Toast.makeText(mContext, resources.getString(R.string.success_saved), Toast.LENGTH_LONG).show();
}
else Toast.makeText(mContext, resources.getString(R.string.failed), Toast.LENGTH_LONG).show();
}
}
我找到了我的问题的答案:不知怎么的,Android是避免新文件写入我的sd卡上的文件夹。
方法Environment。getExternalStorageDirectory返回/storage/emululated/0作为路径。在我看来,WRITE_EXTERNAL_STORAGE权限只对遗留路径生效。
因此,返回写入外部存储的正确路径的方法是Environment。getLegacyExternalStorageDirectory返回/storage/emululated/legacy ..当然每个人都不一样