Java Aus AndroidApp auf interne Datei zugreifen

fanatiXalpha

Fleet Admiral
Registriert
Aug. 2011
Beiträge
13.710
Hallo Leute,

ich such jetzt schon ne ganze Weile aber ich nicht fündig geworden...
Was ich komisch finde, weil ich ja nicht der erste bin der sowas machen will.

Ich will in meiner App auf eine Datei zugreifen die auf den Gerät liegt (in diesem Fall ein Tablet).
Um die Datei aufzurufen steht bei mir
Code:
File xml_file = new File("canlist.xml");
in die Klammer am Ende muss wohl der richtige Dateipfad, aber ich hab nirgends dazu Infos gefunden wie ich den richtig angebe.

Wenn ich unter Windows das Tablet öffne im Explorer, gehe auf das Gerät, klicke auf Internal storage und habe da den Ordner "XMLdata" mit der Datei canlist.xml
Wie kann ich dann darauf zugreifen?


Danke schon mal im voraus :)
 
Ehm soweit ich aus meiner Android Programmierung noch weiß, ist das immer etwas schwieriger auf interne Ressourcen zuzugreifen, da die Linix Distri bzw. die Virtual Machine, die für jede App gestartet wird nur beschränkte Rechte hat. Auch aufs Dateisystem.

Genaueres hab ich allerdings auch nicht mehr in Erinnerung, ich weiß nur, dass es eine Art "File" or "Storage" Permission gibt über die du der Virtuellen Maschine das Recht geben kannst, auf das Dateisystem zuzugreifen, oder zumindest auf bestimmte Bereiche davon.


Die Permissions musst du in der Manifest.xml festlegen.

Hier Dokumentation ;)
http://developer.android.com/reference/android/Manifest.permission.html#READ_EXTERNAL_STORAGE
 
So schwierig ist es glaube ich nicht, zumindest wenn die Datei irgendwo im Verzeichnis der App liegt und nicht in einem total anderen Verzeichnis. Habe damals bei meiner App auch Daten aus dem Dateisystem geladen.

Wie gesagt die jeweilige read/write Permission in der Manifest anlegen und dann in der Dokumentation die Methoden zum holen der Dateien raussuchen. Gibt genügend Tutorials.
 
Du möchtest doch aus deiner Android App das Dateisystem (des Android Gerätes) durchsuchen, habe ich das richtig verstanden?

Das du manche Verzeichnisse über Windows nicht siehst liegt daran, dass sie Android vor dir versteckt. Unter anderem das Verzeichnis der ganzen Apps. Man kann das Gerät rooten und dann gibt es Möglichkeiten alle Verzeichnisse in Windows sichtbar zu machen.

Bezüglich App Verzeichnis:

You can save files directly on the device's internal storage. By default, files saved to the internal storage are private to your application and other applications cannot access them (nor can the user). When the user uninstalls your application, these files are removed.
To create and write a private file to the internal storage:

  1. Call openFileOutput() with the name of the file and the operating mode. This returns a FileOutputStream.
  2. Write to the file with write().
  3. Close the stream with close().
For example:
String FILENAME ="hello_file";
Stringstring="hello world!";

FileOutputStream fos = openFileOutput(FILENAME,Context.MODE_PRIVATE);
fos
.write(string.getBytes());
fos
.close();


Alternativ hast du die Möglichkeit Daten von SD Karte zu nutzen oder die Daten in eine Datenbank zu schmeißen, die allerdings auch entweder auf SD Karte oder im App Verzeichnis liegen muss.
 
Zuletzt bearbeitet: (Beitrag wiederhergestellt)
Code:
File sdcard = Environment.getExternalStorageDirectory();
File file = new File(sdcard,"XMLData/clanlist.xml");

Und in der permission.xml

Code:
<manifest ...>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    ...
</manifest

mfg Jojo
 
Genau JoJo hats dir quasi diktiert für externe Datenquellen (SD Karte).

Das Ganze für das interne App Verzeichnis hab ich doch bereits gepostet ;).

Steht auch alles auf http://developer.android.com/guide/topics/data/data-storage.html

Damit sollte dir vorerst geholfen sein.

Aber für Dateien im App Vereichnis nochmals:
You can save files directly on the device's internal storage. By default, files saved to the internal storage are private to your application and other applications cannot access them (nor can the user). When the user uninstalls your application, these files are removed.
To create and write a private file to the internal storage:
 
Zuletzt bearbeitet:
Ich blick es immer noch nicht
das ist so verwirrend, jeder macht es etwas anders und wenn ich dann selbst bei mir versuche meckert er immer wieder wegen irgendwas
ich will doch einfach nur eine XML einlesen, das kann doch nicht so schwer sein?!

und dein Beispiel Panda ist ja für Output und nicht input
 
Poste doch einfach mal deinen code. Das er das nicht resolven kann, liegt wohl daran das du es nicht lokal oder im Field hast. - dementsprechend einfach mal schauen das du vorher einen Aufbaust ?
 
naja, nen ganzen Code hab ich ja nicht, weil er ja schon am Anfang meckert
sieht also bisher so aus:
Code:
public static void ParsingXML (){
        
        try{
            FileInputStream fis = openFileInput("canlist.xml", Context.MODE_PRIVATE);
            DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = db.parse(xml_file);
...
und dann geht es eben normal weiter mit dem Verarbeiten der XML
eigentlich müsste ja noch mehr Code nach fis hin, aber dadurch das er da schon das Problem hat hab ich nicht weitergeschrieben

EDIT:
hab mir doch mal ne sdcard besorgt und es so gemacht wie JoJo geschrieben hat
dabei bringt er mir dummerweise einen Error "/storage/emulated/0/Android/data/canlist.xml: open failed: ENOENT (No such file or directory)"
Code sieht so aus wie von Jojo, auch die user-permission im Android_Manifest ist hinterlegt
woran hakt es?
hab es auch mal mit einem Ordner probiert der automatisch von Android auf der sdcard erstellt wird mit dem selben Ergebnis...
 
Zuletzt bearbeitet:
Sagt dir doch die Fehlermeldung, er findet das angegebene Verzeichnis/Datei nicht.

(No such file or directory)"

Ist die canlist.xml wirklich in dem verzeichnis "
/storage/emulated/0/Android/data" ?

Das ist doch auch das interne Verzeichnis "
/storage/emulated/0/Android/data". Glaube ich zumindest.

hmm Es scheitert anscheinend an der Pfadangabe.

Probier es mal damit:

  • Environment.getExternalStorage()– This returns the primary (top-level or root) external storage directory.
Danach entsprechend mit deinen Pfadangaben zu der Datei auf der SD Karte.
 
Zuletzt bearbeitet:
Ist die canlist.xml wirklich in dem verzeichnis "/storage/emulated/0/Android/data" ?
Jain
wenn ich das Tablet an den Rechner anschließe hab ich zwei Speicher
einmal wird das Gerät als solches angezeigt und einmal die SD-Karte separat
öffne ich dann die SD-Karte, sehe ich sofort ein paar Ordner, unter anderem "Android" in welchem der Unterordner "data" sich befindet
da hab ich die Datei reingetan

was mir aber jetzt auffällt ist: storage/emulated
kann es sein, dass er die SD-Karte als internen Speicher "gesetzt" hat und deshalb das selbe Problem besteht wie generell beim Zugriff auf internen Speicher?

wenn ich nur .getExternalStorage schreibe, dann meckert er und meint cannot resolve method
es tauch auch nicht in der Liste auf...

ich hab es jetzt mal mit .getDataDirectory() versucht, aufgrund des "Aufbaus" der SD-Karte
und siehe da, zwar immer noch ein Fehler, aber die Pfadangabe passt so eigentlich....
E/Error:: /data/canlist.xml: open failed: ENOENT (No such file or directory)
weil jetzt liegt die XML einfach so im Ordner data
und laut der Fehlermeldung passt ja eigentlich der Pfad...
ich blick es noch nicht ganz
 
Zuletzt bearbeitet:
Zurück
Oben