Dateien im Asset Ordner anlegen

  • 40 Antworten
  • Letztes Antwortdatum
S

spike78

Neues Mitglied
0
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
 
der asset ordner ist nicht dafür gedacht, dass man dort etwas reinspeichert.

von daher wirds wahrscheinlich auch einfach nicht gehen.
 
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
 
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.
 
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
 
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
 
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.
 
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
 
spike78 schrieb:
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

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:
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
 
spike78 schrieb:
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
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...
 
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.
 
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
 
Unicate schrieb:
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.

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.
 
spike78 schrieb:
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

Wenn Du eh ne db hast, kannst Du die doch einfach um eine Spalte erweitern... Bräuchtest noch nicht mal einen zusätzlichen query.
 
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 ;-)
 
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!
 
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ß
 
Tom299 schrieb:
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!



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...
 
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.
 

Ähnliche Themen

AnnaBauer21
Antworten
6
Aufrufe
199
AnnaBauer21
AnnaBauer21
D
  • Data2006
Antworten
14
Aufrufe
953
jogimuc
J
M
  • MikelKatzengreis
Antworten
5
Aufrufe
563
swa00
swa00
Zurück
Oben Unten