Android/Java:将数据库从/data/data复制到sdcard |错误:没有这样的文件或目录
我的应用程序将数据库从/data/data复制到外部存储器的子目录中。效果很好,但过了一段时间就不起作用了 我也尝试过使用Stericson的RootTools库,但也有同样的错误 错误消息:Android/Java:将数据库从/data/data复制到sdcard |错误:没有这样的文件或目录,java,android,copying,Java,Android,Copying,我的应用程序将数据库从/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/emula
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\u外部存储
android.permission.ACCESS\u超级用户
奇怪的是:
- 首先,它起作用了
- 一段时间后,出现此错误
- 如果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();
}
}
私有类异步扩展异步任务{
homedir=Environment.getExternalStorageDirectory().getAbsolutePath()+“/Folder/”;
Fhomedir=新文件(homedir);
datadir=Environment.getDataDirectory().getAbsolutePath();
sourcefile=“settings.db”;
homefile=“备份”+currentDateandTime+“.db”;
sourcedir=datadir+“/data/com.android.providers.settings/databases/”+sourcefile;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyyMMdd_HHmmss”);
字符串currentDateandTime=sdf.format(new Date());
homefile=“备份”+currentDateandTime+“.db”;
试一试{
File File=新文件(homedir,String.valueOf(System.currentTimeMillis()+“.txt”);
Runtime.getRuntime().exec(“logcat-d-v long-f”+file.getAbsolutePath());
}
捕获(IOE异常){
e、 printStackTrace();
}
Fhomedir=新文件(homedir);
如果(!Fhomedir.exists()){
Fhomedir.mkdirs();
}
dialog.show();
}
@凌驾
受保护的空位背景(空位…空位){
if(RootTools.isAccessGiven()){
Log.e(“ROOTACCESS”、“TRUE”);
}
else Log.e(“ROOTACCESS”、“FALSE”);
if(RootTools.remount(homedir,“rw”)){
if(isExternalStorageWritable()){
//copyFile(sourcedir,homedir+homefile,true,true);
copyToDirectory(sourcedir、homedir+homefile);
//exportDB();
}
else Toast.makeText(mContext,“无法写入SD卡”,Toast.LENGTH_LONG.show();
}
else Toast.makeText(mContext,“无法写入SD卡”,Toast.LENGTH_LONG.show();
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
意向更新=新意向(“com.flextrick.update”);
mContext.sendBroadcast(更新);
dialog.dismise();
文件homefilex=新文件(homedir+homefile);
if(homefilex.exists()){
Toast.makeText(mContext,resources.getString(R.string.success_保存),Toast.LENGTH_LONG.show();
}
else Toast.makeText(mContext,resources.getString(R.string.failed),Toast.LENGTH_LONG.show();
}
}
我找到了我的问题的答案:不知何故,Android避免了将新文件写入SD卡上我的文件夹
方法Environment.getExternalStorageDirectory将/storage/emulated/0作为路径返回。在我看来,写入外部存储的权限仅对旧路径有效
因此,返回写入外部存储器的正确路径的方法是Environment.getLegacyExternalStorageDirectory,它返回/storage/simulated/legacy。。当然,其他设备可能会有所不同。这是否在根设备上?数据库是否属于应用程序?每个应用程序都可以通过几行代码将其数据库文件复制到外部或可移动媒体,无需root权限。是的,它是root。不,我需要将其他应用程序的数据库复制到设备的存储器中。你可以开始发帖说明这一切。