1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Dateien im Asset Ordner anlegen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von spike78, 14.12.2011.

  1. spike78, 14.12.2011 #1
    spike78

    spike78 Threadstarter Junior Mitglied

    Beiträge:
    41
    Erhaltene Danke:
    0
    Registriert seit:
    09.10.2011
    Hi zusammen,

    ich würde gerne eine Datei die ich zurzeit durch meineApp auf der SD Karte speichere anschließend in mein Asset Ordner kopieren, bzw. kann ich die Datei auch direkt im Asset Verzeichnis erstellen?

    Meine Datei auf der SD Karte erstelle ich derzeit so:

    Code:
    [SIZE=2][LEFT][/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]private[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] File getTempFile(Context context){
    [/SIZE][SIZE=2][COLOR=#3f7f5f][SIZE=2][COLOR=#3f7f5f]//it will return /[U]sdcard[/U]/image.tmp[/LEFT]
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][LEFT][/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]final[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] File path = [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] File( Environment.[I]getExternalStorageDirectory[/I](), context.getPackageName() );
    [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]if[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2](!path.exists()){
    path.mkdir();
    }
    [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]return[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] File(path, [/SIZE][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]mRep[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].getBeschreibung() +[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]".png"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]); [/LEFT]
    }
    [/SIZE]
    Grüße

    Spike
     
  2. swordi, 14.12.2011 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    der asset ordner ist nicht dafür gedacht, dass man dort etwas reinspeichert.

    von daher wirds wahrscheinlich auch einfach nicht gehen.
     
  3. spike78, 14.12.2011 #3
    spike78

    spike78 Threadstarter Junior Mitglied

    Beiträge:
    41
    Erhaltene Danke:
    0
    Registriert seit:
    09.10.2011
    Ok, was würdest du mir raten, wie meine Dateien verwalten soll?

    Kurz zu meiner App. Ich habe eine Datenbank, in der stehen in einer Spalte Pfade zu Bildern drin. Diese Bilder liegen bei mir im Asset Verzeichnis. Da kann ich perfekt mit dem Asset Manager darauf zugreifen.

    Nun würde ich gerne meine App so erweitern, dass ich ein neues Bild mit der Kamera erstellen kann und dieses soll dann das "Alte" im Asset Verzeichnis ersetzen.
    Wäre es dann ratsamer die Bilder auf der SD Karte zu verwalten und nicht im Asset Ordner?

    Gruß

    Spike
     
  4. Tom299, 14.12.2011 #4
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Entweder intern verwalten (also z.b. im data/data/yourpackage/images) oder halt auf der SD karte. vorteil bei der SD karte ist halt, daß du darauf auch extern zugreifen kannst, z.b. filemanager usw. intern kommst du nur mit deiner app drauf.
     
  5. Unicate, 14.12.2011 #5
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Definitiv

    Der Assetordner ist, wie mein Vorredner schon erwähnte, nicht für diesen Zweck zu gebrauchen. Bilder in den Assetordner zu legen um diese dann mit einer DB zu finden ist nicht sehr klug, denn dafür sind die drawable Ordner da.

    Ansonsten empfehle ich die Bilder direkt auf der SDKarte zu verwalten, das ist einfach und man kann ohne probleme lesen und schreiben
     
  6. spike78, 14.12.2011 #6
    spike78

    spike78 Threadstarter Junior Mitglied

    Beiträge:
    41
    Erhaltene Danke:
    0
    Registriert seit:
    09.10.2011
    Zurzeit habe ich schon einige Bilder die ich benötige.
    Diese habe ich alle im Asset Ordner drin liegen.

    Wenn ich die Verwaltung dann über die SD Karte machen, müsste ich doch beim Start meiner App immer diese Schritte zuerst durchführen:?

    1) Prüfen ob Dateistruktur auf der SD Karte schon da ist, falls nein -> neu anlegen.
    2) Bilder aus dem Asset Ordner in die "neue" Struktur kopieren
    3) Neue Bilder kommen dann direkt in die SD Kartenstruktur rein.

    Gruß

    Spike
     
  7. mradlmaier, 14.12.2011 #7
    mradlmaier

    mradlmaier Gewerbliches Mitglied

    Beiträge:
    158
    Erhaltene Danke:
    17
    Registriert seit:
    28.10.2011
    scheinbar gibt es da unterschiedliche Auffassungen:
    purpose of the assets folder - Android Developers | Google Groups

    Gesichert ist, dass Dateien in /res ueber die Resource ID referenziert werden koennen, waehrend Dateien im Assets Ordner ueber die AssetManager Klasse gelesen werden.
    Ausserdem werden Dateien in /res komprimiert, im /assets hingegen nicht.
    Abgesehen davon gehören Dateien, die der Benutzer bearbeitet, nicht in /assets, hingegen Dateien, die deine App benützt, schon. Z.b. HTML etc.
     
  8. spike78, 14.12.2011 #8
    spike78

    spike78 Threadstarter Junior Mitglied

    Beiträge:
    41
    Erhaltene Danke:
    0
    Registriert seit:
    09.10.2011
    wäre dann mein Ansatz so richtig?

    Bilder die bereits in meiner App eingebunden habe, lasse ich im Asset Order und neue Bilder die der Anwender erstellt, speichere ich dann auf der SD Karte?

    Gruß

    Spike
     
  9. mradlmaier, 14.12.2011 #9
    mradlmaier

    mradlmaier Gewerbliches Mitglied

    Beiträge:
    158
    Erhaltene Danke:
    17
    Registriert seit:
    28.10.2011
    Ja, allerdings: nur App Bilder, die "raw" sind, also nicht komprimiert werden sollen. Button images, .9png, etc. und natuerlich alle Bilder die Du via Resource ID referenzierst, gehoeren in /res
     
    Zuletzt bearbeitet: 14.12.2011
  10. spike78, 14.12.2011 #10
    spike78

    spike78 Threadstarter Junior Mitglied

    Beiträge:
    41
    Erhaltene Danke:
    0
    Registriert seit:
    09.10.2011
    dann nun noch ein abschließende Frage.
    Meine Bilder lade ich ja derzeit mit dem Asset Manger und zeige diese in einer Liste an. Nun habe ich ja zukünftig dann ja auch Bilder die nicht im Asset Ordner liegen, sondern auf der SD Karte.

    Auf diese kann ich ja dann wohl nicht mit dem Asset Manager zugreifen.?
    Wenn nicht, wie kann ich am besten unterscheiden, wie das Bild geladen werden soll (Asset Manger oder nicht)?


    Gruß

    Spike
     
  11. mradlmaier, 14.12.2011 #11
    mradlmaier

    mradlmaier Gewerbliches Mitglied

    Beiträge:
    158
    Erhaltene Danke:
    17
    Registriert seit:
    28.10.2011
    Der AssetManager greift nicht auf die SD zu, denke ich. Ausser wenn Du app2sd hast und die app auf der SD installiert ist. Das duerfte aber aus der Sicht des Entwicklers keinen Unterschied machen.
    Wie Du das unterscheidest? Weil Du zur Entwicklungszeit das nicht weisst?
    Bei Bildern, die deine App benuetzt, weisst Du doch das?

    Oder nicht? Kann mir spontan kein Scenario vorstellen, wo Du das nicht weisst...
     
  12. Unicate, 14.12.2011 #12
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Du weisst doch welche Bilder du statisch da hast (auch wenn ich immer noch nicht verstehen kann wieso du das nicht mit den drawable-ordnern machst) und welche nicht.
     
  13. spike78, 14.12.2011 #13
    spike78

    spike78 Threadstarter Junior Mitglied

    Beiträge:
    41
    Erhaltene Danke:
    0
    Registriert seit:
    09.10.2011
    Hi nochmal,

    mein genaues Szenario sieht so aus: Als Übung wollte ich ein kleines Rezeptbuch schreiben, das der Anwender nach belieben erweitern bzw. ändern kann. Meine App hat zu beginn wenn der Anwender diese installiert hat schon ein paar Rezepte drin (incl. Bild). Den Pfad zu dem Bild hab ich in einer DB stehen und diese liegen derzeit noch im Asset Ordner. Mit dem Asset Manager kann ich dann mit dem Pfad einfach darauf zu greifen.

    Nun kann es aber sein, das der User das Bild ändern möchte und das neue Bild speichere ich dann extern auf der SD Karte.
    Auf das neue Bild kann ich aber nun nicht mehr mit dem Asset Manger zugreifen, daher bräuchte ich eine Unterscheidung (liegt das Bild auf SD Karte oder im Asset Ordner).

    Meine Idee war halt am Anfang die neuen Bilder auch in den Asset Ordner zu legen und dann könnte ich die Sache mit dem Asset Manager lassen wie es ist. Nun scheint das ja keine geeignete Lösung zu sein.

    Wenn ich euch richtig verstanden habe, hab ich zwei Möglichkeiten?

    1) Beim Start meiner App alle Bilder aus dem Asset Ordner auf die SD Karte kopieren und dann von dort aus auf alle Bilder zugreifen.

    2) Alle Bilder (alt oder neu) kommen in den drawable Ordner.
    (wie sichere ich neue Bilder darin?) Das würde doch dazu führen, dass evtl sehr schnell mein interner Speicher anwächst?

    Grüße

    Spike
     
  14. mradlmaier, 14.12.2011 #14
    mradlmaier

    mradlmaier Gewerbliches Mitglied

    Beiträge:
    158
    Erhaltene Danke:
    17
    Registriert seit:
    28.10.2011
    Ich könnte mir vorstellen, dass der "gemanagete" /res/drawable mehr overhead verursacht als der /assets...
    Bei einer grossen Anzahl von Bilder möglicherweise ein performance hit.
     
  15. mradlmaier, 14.12.2011 #15
    mradlmaier

    mradlmaier Gewerbliches Mitglied

    Beiträge:
    158
    Erhaltene Danke:
    17
    Registriert seit:
    28.10.2011
    Wenn Du eh ne db hast, kannst Du die doch einfach um eine Spalte erweitern... Bräuchtest noch nicht mal einen zusätzlichen query.
     
  16. Reiti, 14.12.2011 #16
    Reiti

    Reiti Android-Hilfe.de Mitglied

    Beiträge:
    116
    Erhaltene Danke:
    11
    Registriert seit:
    08.12.2011
    yep, ab mit den bildern in die db - dafür ist sie da. benutzerdefinierte bilder können ja dann von wo auch immer in die db hinzugefügt werden ;-)
     
  17. Tom299, 15.12.2011 #17
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    warum machst es dir so schwer mit der unterscheidung? beim 1. programmstart werden alle bilder aus dem assets-ordner auf die sd karte kopiert und nur von dort wird gearbeitet.
    beim kopieren kennst du ja den neuen pfad der bilder und kannst die pfade in der DB aktualisieren. und bilder gehören nicht in die DB!
     
  18. spike78, 15.12.2011 #18
    spike78

    spike78 Threadstarter Junior Mitglied

    Beiträge:
    41
    Erhaltene Danke:
    0
    Registriert seit:
    09.10.2011
    So mach ich das jetzt, kopiere mir beim Start alle Bilder aus dem Asset Ordner rüber.

    Eine Sache ist mir heute morgen dabei noch aufgefallen, beim Kopieren zeigt mir der Asset Manager zwei Dateien an, die gar nicht in meinem Asset Ordner liegen (android-logo-mask.png und android-logo-shine.png)

    Wo nimmt er die her??
    Hier noch kurz mein Code dazu. In meinem Image Ordner liegen nur meine 3 eigenen Bilder und nicht die 2 android..... Bilder...

    Code:
    [SIZE=2][LEFT]AssetManager assetManager = getAssets(); 
    String[] files = [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]null[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]; 
    files = assetManager.list([/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"images"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]); 
    [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]for[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]([/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]int[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] i=0; i<files.[/SIZE][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]length[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]; i++) { 
    InputStream in = [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]null[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]; 
    OutputStream out = [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]null[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]; 
    in = assetManager.open(files[i]); 
    out = [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] FileOutputStream(imagePath + files[i]); 
    copyFile(in, out); 
    in.close(); 
    in = [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]null[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]; 
    out.flush(); 
    out.close(); 
    out = [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]null[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]; 
    }
    [/LEFT]
    }
    [/SIZE]
    Gruß
     
  19. mradlmaier, 15.12.2011 #19
    mradlmaier

    mradlmaier Gewerbliches Mitglied

    Beiträge:
    158
    Erhaltene Danke:
    17
    Registriert seit:
    28.10.2011


    Ich meinte nicht die Bilder in die db, sondern deren jeweiligen Daten.
    Beim ersten Programmstart zu kopieren, funktioniert bei wenigen Bildern sicherlich ganz gut, je mehr Bilder um so länger dauert's.
    Wieso sollte das einfacher sein, im übrigen? Wenn Du das ordentlich programmierst in Java gibt es exakt eine Stelle im Code, wo Du überprüfst, wo die Bilder sind...? oder nicht?
    Wenn nicht, dürfte der Code optimierbar sein...
     
  20. Reiti, 15.12.2011 #20
    Reiti

    Reiti Android-Hilfe.de Mitglied

    Beiträge:
    116
    Erhaltene Danke:
    11
    Registriert seit:
    08.12.2011
    Bei einer DB will man aber nunmal keine Dateninkonsistenzen :) Was also, wenn der Benutzer die SDKarte entfernt, oder das Bild löscht?

    Wäre also defintiv sinnvoll, die Bilder selbst in die DB abzulegen mit der Möglichkeit, dass der Benutzer von einer SDKarte importieren kann.

    So funktioniert die ganze App dann übrigens auch ganz ohne SDCard.
     

Diese Seite empfehlen