2014-07-18 34 views
0

我的應用程序將數據庫從/ data/data複製到外部存儲到一個子目錄中。運作良好,但過了一段時間後,它不再工作。Android/Java:將數據庫從/ data/data複製到sdcard |錯誤:沒有這樣的文件或目錄

我也試過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(); 
      } 

} 
+0

這是根植設備嗎?將數據庫歸於應用程序?每個應用程序都可以使用幾行代碼將數據庫文件複製到外部或可移動媒體,而無需root權限。 – greenapps

+0

是的,它的根源。不,我需要將其他應用程序的數據庫複製到設備的存儲空間 – user3853024

+0

您可以開始撰寫您的文章,說明所有這些。 – greenapps

回答

1

我發現一個回答我的問題:不知怎的,Android是避免新文件寫入到我的Micro-SD卡的文件夾。

Environment.getExternalStorageDirectory方法返回/ storage/emulated/0作爲路徑。根據我的見解,權限WRITE_EXTERNAL_STORAGE只對傳統路徑有效。

因此,返回寫入外部存儲器的正確路徑的方法是Environment.getLegacyExternalStorageDirectory,它返回/存儲/模擬/遺留..當然可以不同。

相關問題