2017-06-19 1 views
0

Ich versuche, ein Verzeichnis zu erstellen und dann Daten in eine neue Datei auf einer externen SD-Karte zu schreiben. Ich habe zuvor Dateien erfolgreich in den internen Speicher geschrieben, aber mit diesem scheint ich 2 Probleme zu haben (nun, abgesehen von mir selbst, da dies nur meine zweite App ist!).Erstellen von Ordnern und Schreiben von Dateien auf externen Speicher

ausführlich auf Stackoverflow für Beratung und Beispielcode gesucht hat, habe ich die folgende Methode gebaut:

void filewriter(String fnam,String mdata){ 
     if (useSD) { 
      //test to see if a directory called AMJ exists on external storage and create one if it does not 
      try { 
       File folder = new File(Environment.getExternalStorageDirectory() + "/AMJ"); 
       if (folder.exists() && folder.isDirectory()) { 

        Toast.makeText(getApplicationContext(), "folder " + folder + " exists", Toast.LENGTH_LONG).show(); //##1 
       } else { 
        Toast.makeText(getApplicationContext(), "folder " + folder + " does not exist", Toast.LENGTH_LONG).show(); //##2 
        folder.mkdirs(); 
       } 
      } catch (Exception e) { 
       Toast.makeText(getApplicationContext(), "Unable to find or create a directory for route data on SD card", Toast.LENGTH_LONG).show(); //##3 
      } 
      //create a file with file name fnam and write String mdata into the AMJ directory 
      try { 
       String namFile = Environment.getExternalStorageDirectory() + "/AMJ/" + fnam; 
       File datfile = new File(namFile); 
       Toast.makeText(getApplicationContext(), "File is: " + datfile, Toast.LENGTH_LONG).show(); //##4 
       datfile.createNewFile(); 
       FileOutputStream fOut = new FileOutputStream(datfile); 
       OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut); 
       myOutWriter.append(mdata); 
       myOutWriter.close(); 
       fOut.close(); 
       Toast.makeText(getApplicationContext(), "Finished writing to SD", Toast.LENGTH_LONG).show(); //##5 
      } catch (Exception e) { 
       Toast.makeText(getApplicationContext(), "Write failure", Toast.LENGTH_SHORT).show(); //##6 
      } 
     } 
    } 

fnam und mdata sind einfacher Text wie „myfile“ und „Dies ist meine Testdaten“.

Das erste Problem ist, dass das erste Mal, dass ich das toppe Nachricht ## 2 (Ordner existiert nicht) wie ich erwartet habe. Ich erwartete jedoch, ein Verzeichnis AMJ erstellt werden, so dass das nächste Mal, wenn ich den Code ausführen würde ich Nachricht ## 1 erhalten, um zu sagen, dass das Verzeichnis jetzt existiert, aber das passiert nicht - es sagt immer noch, dass das Verzeichnis nicht existiert .

Das zweite Problem (was natürlich nur eine Konsequenz der ersten sein kann) ist, dass das Erstellen/Schreiben der Datei nicht funktioniert und ich jedes Mal die 'Fang' Nachricht ## 6 bekomme.

Mein Manifest sieht wie folgt aus:

package="com.example.chris.filewritetests"> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

ich dies auf einem Android-Studio Emulator leite.

Kann mir bitte jemand sagen, was hier falsch ist?

+0

Beseitigen Sie alle 'Toasts'. Verwenden Sie 'Log.e()', um Nachrichten in LogCat zu protokollieren, insbesondere die spezifischen Ausnahmen zu protokollieren, die Sie in Ihren 'catch' Blöcken erhalten. Außerdem gibt es keine 'android.permission.STORAGE'-Berechtigung, möglicherweise haben Sie keinen Code für [Laufzeitberechtigungen] (https://developer.android.com/training/permissions/requesting.html), und möglicherweise möchten Sie dies auch tun [Diese Datei indizieren, damit sie für Benutzer sichtbar wird] (https://stackoverflow.com/questions/32789157/how-to-write-files-to-external-public-storage-in-android-so-that- sie sind sichtbar. – CommonsWare

Antwort

0

Das Verzeichnis wird nicht automatisch erstellt. Sie müssen diese Verzeichnisse nennen mkdir() auf dem Dateiobjekt datfile.mkdirs() Änderung ti es

try { 
      String namFile = Environment.getExternalStorageDirectory() + "/AMJ/" + fnam; 
      File datfile = new File(namFile); 
      datfile.mkdirs(); 
      Toast.makeText(getApplicationContext(), "File is: " + datfile, Toast.LENGTH_LONG).show(); //##4 
      FileOutputStream fOut = new FileOutputStream(datfile); 
      OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut); 
      myOutWriter.append(mdata); 
      myOutWriter.close(); 
      fOut.close(); 
      Toast.makeText(getApplicationContext(), "Finished writing to SD", Toast.LENGTH_LONG).show(); //##5 
     } catch (Exception e) { 
      Toast.makeText(getApplicationContext(), "Write failure", Toast.LENGTH_SHORT).show(); //##6 
     } 
+0

Ich habe gerade diesen Code wie vorgeschlagen versucht, aber es hat nicht funktioniert. Es schlägt in der Zeile datfile.createNewFile() fehl. Mache ich etwas falsch in der Art, wie ich den Pfad und den Namen der Datei festlege (String namFile = ..........)? –

+0

Sie brauchen nicht das erste if um zu prüfen, ob der Ordner existiert, weil 'mkdirs()' das für Sie tut. Und 'createNewFile()' wird auch nicht benötigt. – Adithya

0

Die Beratung erstellen Log.e() zu verwenden, half mir in die richtige Richtung zu zeigen - dank. Ich denke, mein Problem war, dass ich nicht bemerkt habe, dass der eingebaute Speicher und die SD-Karte nicht unbedingt mit dem internen und externen Speicher identisch sind und dass ein Gerät manchmal Speicher auf der SD-Karte als "intern" verwenden kann.

Ich fand heraus, was los war, als ich den Code auf echten Geräten lief, einen mit einer SD-Karte und einen ohne eine, anstatt den Emulator zu benutzen. Das machte es einfach, den FileCommander des Geräts zu verwenden, um genau zu sehen, wo Ordner und Dateien erstellt wurden. Ich würde das jedem empfehlen, der mit dieser Art von Problemen zu kämpfen hat.

Verwandte Themen