txt-datei auf sd-karte schreiben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • txt-datei auf sd-karte schreiben

    hallo,
    leider schon wieder eine frage,
    ich will zum speichern einen string in eine txt-datei auf meiner sd-karte speichern, habe folgende sachen versucht,
    es kommt kein fehler aber es wird auch nichts geschrieben.

    vorweg, alles permissions stehen in der manifest und die datei existiert, denn das auslesen und anzeigen in einem toast funktioniert.

    Quellcode

    1. public void write_Data3() {
    2. String data = "test zum reinschreiben";
    3. try {
    4. File file = new File("/storage/sdcard1/tino.txt");
    5. if (!file.exists()) {
    6. file.createNewFile();
    7. }
    8. FileWriter writer = new FileWriter(file);
    9. writer.append(data);
    10. writer.flush();
    11. writer.close();
    12. } catch (IOException e) {
    13. }
    14. }
    15. ....versucht2
    16. public void write_Data() {
    17. BufferedWriter bw;
    18. FileWriter fw = null;
    19. String newline = System.getProperty("line.separator");
    20. String dateiName = "/storage/sdcard1/tino.txt";
    21. Toast.makeText(getApplicationContext(),"Datei: "+dateiName,Toast.LENGTH_SHORT).show();
    22. String data = "Daten, die in die Datei geschrieben werden sollen.";
    23. FileOutputStream fileOutputStream;
    24. try {
    25. fileOutputStream = this.openFileOutput(dateiName, this.MODE_PRIVATE);
    26. fileOutputStream.write(data.getBytes());
    27. fileOutputStream.close();
    28. } catch (Exception e) {
    29. e.printStackTrace();
    30. }
    31. }
    Alles anzeigen
    es kommt eben nicht der fehler am händy wie sonst dass es abgebrochen wird, nur leider wird auch nichts reingeschrieben.

    danke
    Tino
  • hallo du sagst du hasst alle permision im Manifest da reicht nicht mehr.

    Erstmal eine frage und der welcher sdk Version testest und schreibst du?
    An 28 funktioniert es nicht mehr mit den normalen File befehlen.


    Du sagst die Datei existiert wie kommst du darauf? Wie hast du die erstellt?
    Ein prüfen ob die Datei existiert ist nicht in deinem Code.

    Auch ist das bestimmt nicht der richtige path zur sd Karte.
    Ein Feedback auf Tipps ist auch schön. :P
  • hallo,
    ich teste mit version 29 und auch in der activity stehen noch folgende permission abfragen:

    Quellcode

    1. public static void verifyStoragePermissions(Activity activity) {
    2. int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    3. if (permission != PackageManager.PERMISSION_GRANTED) {
    4. ActivityCompat.requestPermissions(
    5. activity,
    6. PERMISSIONS_STORAGE,
    7. REQUEST_EXTERNAL_STORAGE
    8. );
    9. }
    10. }
    die datei habe ich einfach als txt datei erstellt und auf die sd-karte geschoben mit pc und kabel....
    sie existiert, denn ich kann sie ja auslesen und den inhalt, nur eine zeile text per toast ausgeben....

    der pfad: ""/storage/sdcard1/tino.txt" stimmt doch auch, denn ich kann bilder die darin liegen auch in nem zb. photoview anzeigen

    tino
  • Ab sdk 28 geht das mit dem Zugriff auf die sdkarte nicht mehr so einfach wie in deinem Code.


    developer.android.com/training/data-storage#scoped-storage

    developer.android.com/training/data-storage

    stackoverflow.com/a/40201333/4975457

    Und was du on den toast ausgibst hat mit lesen der dadei nichts zu tun. Ist ja nur der string den du selber gesetzt hast.
    Der Name der Datei.
    Gelesen wurde da bestimmt nichts.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von jogimuc ()

  • hi,

    wie meinst du das mit selbst gesetzt, so mache ich es und das ist doch wirklich das was in der datei steht...

    Quellcode

    1. public String read_Data() {
    2. String zeile = null;
    3. String inhalt = null;
    4. String dateiName = "/storage/sdcard1/tino.txt";
    5. BufferedReader in = null;
    6. try {
    7. in = new BufferedReader(new FileReader(dateiName));
    8. while ((zeile = in.readLine()) != null) {
    9. inhalt = zeile;
    10. }
    11. in.close();
    12. }
    13. catch (IOException e) { e.printStackTrace(); }
    14. return inhalt;
    15. }
    Alles anzeigen
  • Wo ist denn hier dein toast?

    Im ersten Code zeigt der toast nur den dadei namen den du selber gesetzt hast. Mehr nicht.

    Und wie ich dir sagte geht es mit den einfachen Java Datei Methoden nicht mehr.

    Was steht denn in der Variablen Inhalt.

    Wo ist da ein toast der das. Anzeigt.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • Hallo dann zeige uns oder mir doch mal. Wie du das machst. Ich glaube nicht das dies so klappt. Bitte zeige wo und wie du das ausliest was in der Datei steh.
    Auch wie du es testet zb den toast.

    Lehesen der Textdatei könnte gehen. schreiben ohne SAF unter sdk 28 bestimmt nicht. Habe ich nicht geschaft.. Auch das Erstellen mit mkdir ging mit 28 bei mir nicht mehr. Der boolien den mkdir zurück gibt war immer false.



    Mit sdk 29 habe ich es noch nicht getestete.

    Deshalb würde ich gene den Code sehen.


    Interessant wäre hier auch welche compile und target sdk du im gradle benutzt.
    Sollte die auf 26 stehen glaube ich dir das es geht sonst nicht.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • hi,
    also das sind meine 2 methoden zum lesen und neu anlegen mit mkdir...

    Brainfuck-Quellcode

    1. //-------------------------------------------------------------------------------------------------------------------------------------
    2. // Daten: Schreiben
    3. //-------------------------------------------------------------------------------------------------------------------------------------
    4. public void write_Data(String wert) {
    5. String rootPath=Environment.getExternalStorageDirectory().getAbsolutePath()+"/Download/hundenase3.txt";
    6. String[] was = read_Data();
    7. File file=new File(rootPath);
    8. if(!file.exists()){
    9. //Toast.makeText(getApplicationContext(),"NEIN: "+rootPath,Toast.LENGTH_SHORT).show();
    10. try {
    11. BufferedWriter out = new BufferedWriter(new FileWriter(file));
    12. for (int n = 0; n < was.length; n++) {
    13. out.write(was[n]);
    14. out.newLine();
    15. }
    16. out.write(wert);
    17. out.newLine();
    18. out.close();
    19. } catch (IOException e) {
    20. e.printStackTrace();
    21. }
    22. file.mkdirs();
    23. }
    24. else {
    25. try {
    26. //Toast.makeText(getApplicationContext(),"Anzahl: "+was.length,Toast.LENGTH_SHORT).show();
    27. BufferedWriter out = new BufferedWriter(new FileWriter(file));
    28. for (int n = 0; n < was.length; n++) {
    29. out.write(was[n]);
    30. out.newLine();
    31. }
    32. out.write(wert);
    33. out.newLine();
    34. out.close();
    35. } catch (IOException e) {
    36. e.printStackTrace();
    37. }
    38. file.mkdirs();
    39. Toast.makeText(getApplicationContext(),"gibt schon: "+rootPath,Toast.LENGTH_SHORT).show();
    40. }
    41. }
    42. //-------------------------------------------------------------------------------------------------------------------------------------
    43. // Daten: Lesen
    44. //-------------------------------------------------------------------------------------------------------------------------------------
    45. public String[] read_Data() {
    46. String zeile = null;
    47. String[] zeilen = null;
    48. int zeilenanzahl = 0;
    49. String rootPath=Environment.getExternalStorageDirectory().getAbsolutePath()+"/Download/hundenase3.txt";
    50. BufferedReader in = null;
    51. try {
    52. in = new BufferedReader(new FileReader(rootPath));
    53. while ((zeile = in.readLine()) != null) {
    54. zeilenanzahl++;
    55. }
    56. }
    57. catch (IOException e) { e.printStackTrace(); }
    58. zeilen = new String[zeilenanzahl];
    59. int i=0;
    60. try {
    61. in = new BufferedReader(new FileReader(rootPath));
    62. while ((zeile = in.readLine()) != null) {
    63. zeilen[i] = zeile;
    64. i++;
    65. }
    66. in.close();
    67. }
    68. catch (IOException e) { e.printStackTrace(); }
    69. return zeilen;
    70. }
    Alles anzeigen
    nicht am namen "hundenase3.txt" stören, nur ein testname, so geht es bei mir und geschrieben wird das ganze im internen speicher im ordner Download,
    auf die sd-karte hab ich es so dann nicht mehr versucht

    ach so und ich nehme 29, was anderes nie versucht...
    Tino
  • Gut im download Ordner interner Speicher geht das. Nur einen vollen Zugriff auf die sdkarte intern oder sogar auf die echte externe wirst du so nicht hinbekommen.

    Der Download Ordner gehör zu dem internen Speicher obwohl er auf der emulieren sd Karte ist.
    Das komplette Inhaltsverzeichnis der Karte wirst du so nicht lesen können.
    Ein Feedback auf Tipps ist auch schön. :P