2013-06-07 16 views
9

Chciałbym skopiować dość duży katalog z folderu zasobów mojej aplikacji do folderu danych przy pierwszym uruchomieniu aplikacji. Jak to zrobić? Próbowałem już kilku przykładów, ale nic nie działało, więc nie mam nic. Moim celem jest Android 4.2.kopiowanie katalogu z zasobów do folderu danych

Dzięki, yannik

+0

Dlaczego miałbyś to zrobić? Jeśli się nie mylę, dane i folder zasobów będą działać tak długo, jak aplikacja jest zainstalowana. – gunar

+0

Sprawdź to Może ci się przydać http://stackoverflow.com/questions/4447477/android-how-to-copy-files-from-assets-folder-to-sdcard/25988337#25988337 – DropAndTrap

Odpowiedz

19

spróbuj tego kodu instancji aplikacji (należy wpisać klasę w manifeście): Ten kod jest kopiowanie zawartości aktywów/pliki do folderu cache aplikacji (można umieścić inna ścieżka w funkcji copyAssetFolder()). Tylko po uruchomieniu aplikacji po raz pierwszy

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.app.Application; 
import android.content.Context; 
import android.content.res.AssetManager; 
import android.preference.PreferenceManager; 

public class MyApplication extends Application { 
    private static Context s_sharedContext; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     if (!PreferenceManager.getDefaultSharedPreferences(
       getApplicationContext()) 
      .getBoolean("installed", false)) { 
      PreferenceManager.getDefaultSharedPreferences(
        getApplicationContext()) 
       .edit().putBoolean("installed", true).commit(); 

      copyAssetFolder(getAssets(), "files", 
        "/data/data/com.example.appname/files"); 
     } 
    } 

    private static boolean copyAssetFolder(AssetManager assetManager, 
      String fromAssetPath, String toPath) { 
     try { 
      String[] files = assetManager.list(fromAssetPath); 
      new File(toPath).mkdirs(); 
      boolean res = true; 
      for (String file : files) 
       if (file.contains(".")) 
        res &= copyAsset(assetManager, 
          fromAssetPath + "/" + file, 
          toPath + "/" + file); 
       else 
        res &= copyAssetFolder(assetManager, 
          fromAssetPath + "/" + file, 
          toPath + "/" + file); 
      return res; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 

    private static boolean copyAsset(AssetManager assetManager, 
      String fromAssetPath, String toPath) { 
     InputStream in = null; 
     OutputStream out = null; 
     try { 
      in = assetManager.open(fromAssetPath); 
      new File(toPath).createNewFile(); 
      out = new FileOutputStream(toPath); 
      copyFile(in, out); 
      in.close(); 
      in = null; 
      out.flush(); 
      out.close(); 
      out = null; 
      return true; 
     } catch(Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 

    private static 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); 
     } 
    } 

} 
+0

Dzięki, ale ja chciałem umieścić go w folderze danych, ponieważ chciałbym uruchomić skrypt, który znajduje się wewnątrz folderu. – yanniks

+0

Jaki folder masz na myśli? Czy możesz napisać absolutną ścieżkę tego? – matreshkin

+0

na przykład /data/data/com.example.appname/ – yanniks

Powiązane problemy