Android/Java:从/data/data拷贝数据库到sd卡|错误:没有这样的文件或目录



我的应用程序将数据库从/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 ..当然每个人都不一样

最新更新