it-swarm.com.de

Schreiben in den internen privaten Speicher von Android

Ich versuche, einige Daten aus meiner App in einer einfachen Textdatei im internen privaten Speicherbereich zu speichern (App-Benutzereinstellungen). Ich habe hier viele Fragen durchgelesen (StackOverflow) und die vorgeschlagenen Lösungen ohne Erfolg ausprobiert. Die einfachste Lösung scheint die hier vorgeschlagene zu sein:

http://developer.Android.com/guide/topics/data/data-storage.html#filesInternal

aber ich kann das nicht auf meinem Testgerät zum Laufen bringen. Ich habe auch versucht, die Datei mit den verfügbaren Methoden in Java.io.File mit den entsprechenden Methoden zu erstellen. Ich habe auch versucht, die Datei auf der SD-Karte mit dem gleichen Ergebnis zu erstellen. Ich habe viele Lösungen aus anderen Antworten ausprobiert, dem Code und den Anweisungen genau gefolgt und das gleiche Ergebnis gefunden. Ich fange an, das Gefühl zu haben, dass mir etwas wichtiges Stück Code fehlt oder irgendwo ein Setting-Flag gesetzt ist. Ich habe die Berechtigung in der Manifestdatei festgelegt:

  <uses-permission 
        Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />


Um klar zu sein, ich versuche, in den internen, privaten Speicher des Geräts zu schreiben. Es ist eine kleine Datei, die einen Namen, eine Telefonnummer und einige int-Flags enthält. Welche Methode auch immer ich verwende, finde ich entweder, dass die Datei nicht erstellt wurde (oder geändert wurde, wenn ich die Datei manuell auf die SD-Karte lege), oder ich erhalte eine NullPointerException, wenn ich versuche, auf die Datei oder den Dateispeicherort zu verweisen:

private              File   fILE = new File("Mydata", main.FILENAME);

oder

private              File   fILE  = getDir("Mydata", 0);


Ich führe den Code auf einem HTC Hero aus, aktualisiert mit der neuesten Service-Version von Sprint. Jede Hilfe wäre sehr dankbar, Vielen Dank im Voraus!

-Steve

Update (02.02.11): Verwenden eines EVO (API 8) Ich bekomme immer noch eine NullPointerException. Nachfolgend finden Sie den Code, der die Ausnahme generiert. Haben Sie irgendwelche Gedanken darüber, warum meine App nicht auf den internen Speicher zugreifen kann? Ich habe dieses Problem auf drei verschiedenen physischen Geräten, die zwei API-Stufen (API 7 und 8) verwenden.

    File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt");

UPDATE 2: 2/4/11 - Ich habe festgestellt, dass ich die Dateistruktur auf dem physischen Gerät (Datenverzeichnis) unter keinen Umständen sehen kann. Hat jemand irgendwelche Gedanken dazu? Das Gerät ist ordnungsgemäß konfiguriert und kann die App von Eclipse oder adb ausführen.

UPDATE 3: (2/9/11) - Ich glaube, ich habe vielleicht herausgefunden, was das Problem ist, aber ich bin nicht sicher, wie ich damit umgehen soll. Ich habe herausgefunden, dass die Berechtigungen für das Verzeichnis/data/auf den physischen Geräten lauten: drwxrwx--x. Ich bin mir nicht sicher, warum es so ist, vielleicht etwas mit Sprint zu tun? Ich habe dieses Set auf einem HTC Hero, einem Samsung Epic (Galaxy S) und einem HTC EVO auf Sprint gefunden. Das Problem scheint zu sein, dass DDMS und meine App keinen Zugriff auf das Verzeichnis haben. Ich muss hier zwei Dinge herausfinden, warum es so ist und wie ich dieses Problem in der Wildnis überwinden kann. Auch hier wäre jede Hilfe großartig !!

UPDATE 4: Ich denke, der letzte Februar war für mich ein total blonder Moment (siehe UPDATE 3). Die Testgeräte, die ich habe, sind nicht ROOTed und daher kein Zugriff (DUH!). Nach all den Updates, die er durch SGS und EVO 4G durchlaufen hat, ist das Ergebnis immer noch dasselbe. Ich arbeite immer noch an diesem Problem und werde versuchen, bald ein Update zu erhalten (hoffentlich beim nächsten Mal weniger als ein Jahr).

9
Kingsolmn

Keine direkte Antwort auf Ihre Frage, aber trotzdem: Ich habe festgestellt, dass Sie nicht Tonnen von Daten in Ihrer Datei speichern möchten. Wäre es eine ausreichende Alternative, stattdessen die gemeinsamen Einstellungen zu verwenden?

Und vielleicht noch interessanter: Tritt das Problem auch dann auf, wenn Sie stattdessen in die Datei mit den gemeinsam genutzten Einstellungen schreiben?

http://developer.Android.com/guide/topics/data/data-storage.html#pref

3
dbm

Das /data/-Verzeichnis eines physischen Geräts ist nur für den Root-Benutzer verfügbar. Da der Zugriff auf ein physisches Gerät nur realistisch ist, wenn das Gerät root ist, kann DDMS-Datei-Explorer nicht in diesen Zweig der Verzeichnisstruktur gelangen. 

Warum schreibt die App nicht dort? Wahrscheinlich liegt das Problem in der Tatsache, dass ich die App mit Debug-Schlüsseln signiert habe (kein großer * NIX-Experte, aber was hier aus meiner persönlichen Recherche der Fall zu sein scheint).

4
Kingsolmn

Versuchen Sie, die folgende Zeile zu ändern:

File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt");

zu:

File newfile = new File(this.getFilesDir() + "/","sample.txt");
4
Panoli

Ich habe mit dem gleichen Thema zu tun. Schließlich habe ich festgestellt, dass Sie wirklich nicht alle Dateipfade angeben müssen, um eine neue Datei im internen Speicher zu erstellen. Geben Sie einfach den Dateinamen an und er wird im Paketordner Ihrer App auf dem Gerät erstellt. Ich habe genau gesagt hier

Und es funktioniert perfekt. Ich möchte sagen, dass der vollständige Dateipfad nicht erwähnt wird:/data/..., um eine Datei zu erstellen (Sie benötigen die erforderlichen Berechtigungen, um eine Datei auf diese Weise zu erstellen). Überlassen Sie es dem Android-Framework, eine private Datei für Ihre App zu erstellen. 

4
bianca

Der interne Speicherbereich ist eine Art privater Anwendung für die Anwendung, sodass der Benutzer über Rootzugriff (gerootetes Gerät) verfügen muss, um die Dateien erstellen und laden zu können. Wenn Sie ein Gerät gerootet haben, schreiben Sie eine Datei in den internen Speicher:

 // Create a file in the Internal Storage

String fileName = "MyFile";
String content = "hello world";

FileOutputStream outputStream = null;
try {
outputStream = openFileOutput(fileName, Context.MODE_APPEND);
outputStream.write(content.getBytes());
outputStream.close();
} catch (Exception e) {
  e.printStackTrace();
}

Dies sollte sofort eine Datei namens MyFile mit dem Inhalt hello world erstellen. Das interne Speicherverzeichnis befindet sich normalerweise an einem speziellen Speicherort, der durch den Paketnamen unserer App angegeben wird. In meinem Fall ist dies/data/data/[Paketname] und die erstellten Dateien werden in einem Verzeichnis gespeichert, das als Dateien in diesem Verzeichnis bezeichnet wird.

2
Akash

Wie @bianca sagt, verwenden Sie besser keinen Dateipfad. Verwenden Sie stattdessen nur den Dateinamen, um eine Datei zu erstellen. Etwas wie das:

public static void saveTextToFile(Context context, String filename, String content) {
  try {
     FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
     fos.write(content.getBytes());
     fos.close();
  } catch (Exception e) {
     e.printStackTrace();
  }
}

Und um die Datei abzurufen, können Sie Folgendes verwenden:

File file = new File(context.getFilesDir(), filename);

Lesen Sie mehr: Speichern von Dateien .