Android Externen Speicher beschreiben

Tecwan

Aktives Mitglied
Hallo,

hier ist mal wieder so eines der Probleme, die zu vorzeitigem Haarausfall führen können...

Meine App soll Daten verwenden, die im externen Speicher untergebracht werden (Download aus
dem Netz, Kopie aus dem assets-Ordner des Projekts, oder schlicht per USB-Kabel überspielte Files).

Dazu möchte ich zunächst im Download-Ordner des externen Speichers einen Ordner mit dem
Projektnamen erstellen (falls nicht vorhanden), dann eine README dorthin kopieren oder schreiben
(in der steht, weshalb dieser komische Ordner dort ist, was dort hin soll etc.).
Der Nutzer bekommt gleichzeitig die Meldung darüber, dass und welche Daten er noch benötigt,
und kann sie downloaden oder selbst überspielen.

Wenn ich hierzu in der onCreate folgendes mache
Java:
File path = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/myProject/");		
if ((path.mkdir()||path.isDirectory())){			
	File file = new File( path + "/readme.txt");	
		
	System.out.println("file "+file);
    // liefert: file /storage/sdcard0/Download/myProject/readme.txt

	System.out.println("isFILE "+file.isFile());
    // liefert: isFILE false

	try{
		file.createNewFile();
		FileOutputStream f1 = new FileOutputStream(file,false);
		PrintStream p = new PrintStream(f1);
		p.print("TODO");
		p.close();
		f1.close();
	} catch (Exception e) { e.printStackTrace(); }
}
erhalte ich die beliebte EISDIR FileNotFoundException; file wird also für ein directory gehalten.

Völlig konfus macht mich die Angelegenheit aber dadurch, dass im Emulator die readme.txt in einen
vorhandenen myProject-Ordner geschrieben wird, während auf meinem Sony - auf dem der Ordner
erzeugt werden soll - die Fehlermeldung auftaucht und auch kein Ordner erzeugt wird.

Wenn ich am PC über USB-Kabel im Download-Ordner einen neuen Ordner erzeuge, funktioniert das;
allerdings kann ich diesen nicht umbenennen. Kopiere ich hingegen einen fertig benannten Ordner,
der Name übernommen. Die Nutzung der Dateien in diesem Download-Subordner funktioniert auch
einwandfrei.
Die uses-Permission WRITE_EXTERNAL_STORAGE ist gesetzt, daran liegt es also nicht.

Wie muss ich den Code ändern, damit tatsächlich ein Ordner erzeugt wird, und wie, damit ich
später ein neues File schreiben kann?
 

Tecwan

Aktives Mitglied
Update:
Die Files/Ordner werden evtl. doch erzeugt.

Wie kann ich das wissen, wenn ich doch im Windows Explorer über das USB-Kabel nur einen leeren
Download-Ordner sehe?
Ganz einfach: Ich öffne auf dem Sony die Email App und versuche eine Email mit Anhang zu schreiben.
Dabei erhalte ich Einblick und Zugriff auf die Files im Gerät, und auch auf den Download-Ordner. Und
dort sind sie dann auch zu finden, die im PC unsichtbaren Files.

Schizoid...
Ich kann zwar das 'Sicherheitskonzept' verstehen, wonach nur die erzeugende App das Recht hat,
auf ihre Daten zuzugreifen, und demnach auch keine Notwendigkeit besteht, sie für andere sichtbar
zu machen, aber dass das auch noch für die explizit in der Android API als extern und shared
bezeichneten Ordner wie den Download-Ordner gelten soll, ist widersinnig. :eek:

Wie soll ich denn jetzt z.B. meine ganzen Testordner und Dateien wieder vom Gerät schmeißen,
wenn ich sie nicht sehen kann?

Und wie bekomme ich es hin, dass von der App geschriebene Daten (extern!) auch über USB sichtbar
werden?
 

Tecwan

Aktives Mitglied
Naja, das Löschen ist nicht das Problem, zumindest nicht, wenn es von der App aus geschehen soll.

Java:
File path = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/myProject/");	
DeleteRecursive(path);

rekursiv mit dieser Methode
Java:
void DeleteRecursive(File fileOrDirectory) {
    if (fileOrDirectory.isDirectory())
	    for (File child : fileOrDirectory.listFiles())
	        DeleteRecursive(child);
    fileOrDirectory.delete();
}

Soviel am Rande, falls bei der Suche mal jemand nur deshalb hier aufschlägt...


Aber die Frage nach dem Sichtbarmachen bleibt bestehen.
 

Tecwan

Aktives Mitglied
Ok, Problem erkannt, Kammerjäger erforderlich.

Die Unsichtbarkeit im Window Explorer bei USB-Verbindung ist ein Android Bug.
Dieser Bug ist bereits im Zusammenhang mit dem Nexus 4 und 7, sowie wohl dem Sony Xperia Z beschrieben worden.
Wie es scheint, werden vor Verwendung des MTP-Protokolls, dessen sich der USB-Treiber bedient, die
entsprechenden Verzeichnisse nicht aktualisiert.

Folgende Zeile schafft Abhilfe:
Code:
this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(path)));
this ist die Activity, path ist vom Typ File (oder String) und bennent ein File oder einen Pfad.
Bei der Gelegenheit werden dann auch andere zuvor unsichtbare Ordner der gleichen Ebene 'enttarnt'.

Also nochmal zum Mitschreiben: Um einen Ordner 'meinNeuerOrdner' auf der virtuellen oder realen SD-Karte im Ordner Downloads so anzulegen, dass er auch via USB-Kabel vom Window Explorer aus sichtbar wird, kann folgender Code verwendet werden:

Java:
File path = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
        + File.separator +"meinNeuerOrdner"+ File.separator);	
if ((path.mkdir()||path.isDirectory())) registerNewFile(path);

void registerNewFile (File file) {
    this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile( file )));
}

Das gilt auch für die von der App angelegte Files.
 

Neue Themen


Oben