2013-06-07 11 views
9

Ich möchte beim ersten Start der App ein ziemlich großes Verzeichnis aus dem Assets-Ordner meiner App in den Datenordner kopieren. Wie mache ich das? Ich habe schon einige Beispiele ausprobiert, aber nichts hat funktioniert, also habe ich nichts. Mein Ziel ist Android 4.2.Verzeichnis von Assets in Datenordner kopieren

Danke, Yannik

+0

Warum würden Sie das tun? Wenn ich mich nicht irre, wird der Ordner für Dateien und Inhalte so lange live bleiben, wie die App installiert ist. – gunar

+0

Überprüfen Sie diese Es kann nützlich für euch http://stackoverflow.com/questions/4447477/android-how-to-copy-files-from-assets-folder-to-sdcard/25988337#25988337 – DropAndTrap

Antwort

19

versuchen, diesen Code Ihrer Anwendungsinstanz (die Klasse in Manifest schreiben sollte): Dieser Code Inhalt von Vermögenswerten Kopieren wird/Dateien-Ordner in den Cache-Ordner von app (können Sie platzieren anderer Pfad in der Funktion copyAssetFolder(). Nur wenn App zum ersten Mal gestartet wird

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

Danke, aber ich Ich wollte es in den Datenordner stellen, da ich gerne ein Skript innerhalb des Ordners ausführen würde. – yanniks

+0

Welchen Ordner meinen Sie? Kannst du den absoluten Weg dazu schreiben? – matreshkin

+0

zum Beispiel /data/data/com.example.appname/ – yanniks

Verwandte Themen