Android Data storage

jf

Bekanntes Mitglied
Android bringt mich gearde wieder mal zum Verzweifeln:

Ich möchte eine Datei im External Storage ablegen (die Datei in einem Verzeichnis abgelegt werden, auf welches man zugreifen kann, wenn man das Gerät als Wechseldatenträger anmeldet). Das Gerät besitzt keine SD-Karte, dennoch bietet es etwa 1GB Speicher als "mass storage device" an.

Wenn ich
Code:
Environment.getExternalStorageDirectory()
aufrufe, wird mir ein File-Objekt zurück gegeben, welches auf /mnt/sdcard zeigt (welche es nicht gibt).
Wenn ich es mit
Code:
context.getExternalFilesDir("filename.txt")
versuche, so erhalte ich null zurück.

Könnt ihr mir weiter helfen?
 
Zuletzt bearbeitet:

mjdv

Bekanntes Mitglied
Was passt dir an /mnt/sdcard nicht? Schreib doch einfach mal dort hin :D

Android macht da keinen Unterschied ob es ne sd Karte ist oder nicht.
 

jf

Bekanntes Mitglied
Was passt dir an /mnt/sdcard nicht? Schreib doch einfach mal dort hin :D
Android macht da keinen Unterschied ob es ne sd Karte ist oder nicht.
Ja, ich habe dies probiert, aber leider klappt es nicht...
- auch nicht, wenn ich das Gerät abziehe und die Massenspeicherverbindung deaktiviere (damit die Anwendung Zugriff auf den Speicher bekommt).

Getestet mit folgendem Code:
Java:
String path = android.os.Environment.getExternalStorageDirectory() + "/test.txt";
File test = new File(path);
FileWriter writer = new FileWriter(test);
writer.write("Das ist ein Test");

Mache ich noch etwas falsch?

[EDIT]Ich habe jetzt auch noch für die Möglichkeit, dass man keine Dateien in der Wurzel ablegen kann, einen zusätzlichen Ordner im Pfad angegeben und test.mkdirs() angewandt + writer.flush() am Ender verwandt. - Immer noch Fehlanzeige! ???:L[/EDIT]
 
Zuletzt bearbeitet:

jf

Bekanntes Mitglied
Permission gesetzt?
Jetzt ja:
Code:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-> Und es funktioniert sogar! :D

Bei der Verwendung des Vibrators kam es ohne Permission wenigstens zu einem Absturz der Anwendung - in diesem Fall macht Android leider überhaupt keinen Mucks... :noe:

Geprüft ob du schreiben darfst?
Meinst du hier den Schreibschutz der Datei - oder gibt es da noch etwas anderes?


PS:
Blöd ist die Tatsache, dass ich das Gerät immer erst vom Rechner trennen muss, damit meine Anwendung schreiben darf.
Gibt es hierfür gute Gegenstrategien (z. B. temporär den internal storage verwenden)?
Müssen beim Internal Storage auch Permissions beachtet werden?
Gibt es irgendwo eine Auflistung aller Permissions?
 
Zuletzt bearbeitet:

schlingel

Gesperrter Benutzer
Meinst du hier den Schreibschutz der Datei - oder gibt es da noch etwas anderes?
Ja, da gibt's noch was anderes - siehe auch "Checking external media availability" in der Doku.

Java:
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
    // We can read and write the media
    mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    // We can only read the media
    mExternalStorageAvailable = true;
    mExternalStorageWriteable = false;
} else {
    // Something else is wrong. It may be one of many other states, but all we need
    //  to know is we can neither read nor write
    mExternalStorageAvailable = mExternalStorageWriteable = false;
}

Bei der Verwendung des Vibrators kam es ohne Permission wenigstens zu einem Absturz der Anwendung - in diesem Fall macht Android leider überhaupt keinen Mucks...
Es fliegt doch eine IOException in der steht man hat nicht die nötigen Berechtigungen, wenn ich mich nicht täusche. Jedenfalls spätestens wenn man dann tatsächlich versucht zu schreiben.

Müssen beim Internal Storage auch Permissions beachtet werden?
Glaube nicht, aber wie immer geht probieren über studieren.

Alle Permissions findest du auch in der Doku.
 

jf

Bekanntes Mitglied
Ja, da gibt's noch was anderes - siehe auch "Checking external media availability" in der Doku.
Ja, den Code wollte ich später auch übernehmen (wenn alles läuft), da ich es sauberer finde, vorher abzuprüfen, ob man schreiben kann, als einfach drauf los zu schreiben und gegebenenfalls eine Exception abzufangen. - Aber letztendlich ist dies doch nichts, was unbedingt getan werden muss (wie z. B. das Setzen der Permission).

Es fliegt doch eine IOException in der steht man hat nicht die nötigen Berechtigungen, wenn ich mich nicht täusche. Jedenfalls spätestens wenn man dann tatsächlich versucht zu schreiben.
Ja, damit könntest du Recht haben: ich hatte in catch-Zweig eine Toast-Ausgabe, welche aber nie erschien. Daher dachte ich, dass es keine Ausnahme gab. Ich habe aber nun erkannt, dass der Toast einfach nicht ausgegeben wird, ob wohl in den catch-Zweig gesprungen wird. - Welche Gründe kann es dafür geben?

Glaube nicht, aber wie immer geht probieren über studieren.
Alle Permissions findest du auch in der Doku.
Alles klar, danke.


Ich habe bei diesem Thema aber nun ein neues Problem...
Ich nutze die append()-Methode eines BufferedWriter-Objektes: bei der ersten Anwendung wird die Datei erstellt und die Ausgabe geschrieben. - Es werden allerdings keine weiteren Ausgaben angehängt.
Ich sehe aktuell in meinem Code keinen Grund dafür - kann es sein, dass Android hierfür ebenfalls spezielle Sicherheitsvorkehrungen trifft, welche es zu beachten gibt?
 

jf

Bekanntes Mitglied
Geflushed? Am besten ist es du machst einen eigenen Thread mit dem Writer-Problem auf wenn es daran nicht liegt.
Ja, ich flushe nach jedem append().

Wenn ich das append im Code mehrfach hintereinander aufrufe, dann werden die Daten auch mehrfach geschrieben - nur, wenn ich die Anwendung/Android zwischenteitlich neustarte, wird der Datei nichts mehr hinzugefügt. Eine Exception wurde nicht gewurfen.

Außerdem werden bei jedem Schreibvorgang stets zwei Zichen hinzugefügt: bf bd (bedes Hex-Zahlen).
Gibt es Infos hierzu?
 

Ähnliche Java Themen

Neue Themen


Oben