Textdatei auf SD Karte kann auf Galaxy A3 von App nicht geöffnet werden

  • Hallo,


    bin mit meiner ersten App schon (fast) fertig. Auf meinem Smartphon läuft sie bis jetzt absolut sicher, aber ...


    Ich hatte bei mir schon Probleme mit dem Speicherort für die auszuwertende Datei. Zuerst habe ich es mit /sdcard/Documents/ versucht. Das funktionierte zwar, aber nach dem ersten Zugriff auf die Datei war sie unter Windows nicht mehr zu sehen. Das war nicht so besonders gut, denn die Datei, um die es geht, muss immer wieder einmal von Windows aus bearbeitet werden (ging zwar vom Smartphon aus auch, aber die Finger eines gelernten Schmides sind dafür etwas zu groß). Ich fand dann bei mir mit dem Ordner /sdcard/Download/ einen Platz, von dem aus die Datei von der App auch gefunden wird und unter Windows ist sie ebenfalls immer zu sehen.


    Da alles so gut gelaufen ist, habe ich die App auch auf dem Smartphon meiner Frau installiert. Das ging problemlos, nur wird die Datei, die ausgewertet werden soll, nicht gefunden. Ich habe es mit /sdcard/Download/, /sdcard/Documents/ und /sdcard/Android/data/ vergeblich versucht. Dann legte ich unter res einen normalen Ordner /txt/ an, aber auch mit den Pfadangaben /app/res/text/datei.txt und auch mit ../../text/datei.txt funktioniert es nicht.


    Kann mir da bitte jemand unter die Arme greifen?


    MfG, kodela

  • Hast du die Berechtigung zum Lesen ins Manifest gepackt?
    Also:

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


    Das brauchst du, wenn du von der SD-Karte lesen möchtest.
    Dann kannst du den Pfad ja mit


    Code
    File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + fileName);

    auslesen und dieses Filehandle dann einlesen.
    Wenn das alles okay ist, dann hänge mal bitte deinen Code und den Logcat an. Dann kann man dir bestimmt besser helfen ;)

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • Danke Christopher,


    leider funktioniert das bei mir nicht und zwar auf keinem der beiden Smartphones. Dachte mir schon, der von Dir aufgezeigte Weg sei ideal, da ich damit die unterschiedlichsten Speicherorte aufspüren kann, aber obwohl ich die entsprechende Datei bei den beiden Smartphones in unterschiedlichen Verzeichnissen hatte, bei meinem Galaxy S3 mini im Ordner Download, auf dem Galaxy A3 von meiner Frau im Ordner My Documents, wurde in beiden Fällen der Pfad /storage/emulated/0/dateiname.txt gefunden und keines der beiden Geräte kam damit zurecht.


    Die Zeile <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> hatte ich übrigens noch nicht in der Manifest-Datei. Trotzdem funktionierte die App auf meinem S3 mini einwandfrei,


    Welche Möglichkeit gibt es sonst noch.


    Für jetzt wünsche ich ein gute Nacht,
    kodela

  • Hallo Christopher,


    so wie ich es heute Nacht versucht habe, kann es nicht funktionieren, da müsste die Textdatei ja im Rootverzeichnis der SD-Karte liegen, denn der Code dieser Zeile


    File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + fileName);


    sucht mir ja nicht den Ort, an dem die Datei fileName gespeichert ist. Wenn ich es richtig verstanden habe, dann wird hier nur der Rootpath für die Speicherkarte zurückgegeben, an den dann nach einem Seperator der Dateiname angehängt wird.


    Ich habe das deshalb einmal so versucht:

    Java
    File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
    String pfad = f.getPath() + "/Download/dateiName.txt";

    Das ergibt dann zum Beispiel diesen Pfadbezeichner: "/storage/emulated/0/Download/dateiName.txt"


    Aber auch damit funktioniert es mit dem Samsung Galaxy A3 nicht.


    Beim Galaxy S3 mini funktionieren "/sdcard/Download/dateiName.txt" (wie bisher) und "/storage/emulated/0/Download/dateiName.txt" gleichermaßen.


    Es muss also noch irgend einen anderen Grund geben, vermutlich in den Einstellungen des Galaxy A3, durch den der Zugriff auf die Datei verhindert wird. Was kommt hierfür in Frage?


    MfG, kodela



    PS:


    Bei Android-Hilfe habe ich im Thema Bilder und Musik werden nicht mehr von der SD Karte erkannt etwas gefunden, das meinem Problem ziemlich ähnlich ist.


    Frage: Wie kann ich auf der SD Karte ein neues Verzeichnis anlegen? Weder vom PC aus noch über den ES Datei Explorer will mir das gelingen.

  • Hallo,


    ich habe jetzt auf den SD Karten beider Geräte direkt unter Root einen eigen Ordner für die auszuwertende Datei angelegt. Auch damit funktioniert es unter dem S3 mini. Unter dem A3 wird jedoch nach wie vor an der Stelle, an der diese Datei geöffnet werden soll, eine Exception ("java.io.FileNotFoundException: /storage/emulated/0/jubeltage/jubeltage.txt: open failed: EACCES (Permission denied)") ausgelöst.


    "/storage/emulated/0/" ist der von Environment.getExternalStorageDirectory().getAbsolutePath() gelieferte Root Pfad, "jubeltage/jubeltage.txt" der von mit im Root Pfad angelegte Ordner mit der auszuwertenden Datei.


    Die Datei ist unter Windows und unter zwei Filemanager (Eigene Dateien und ES Datei Explorer) zu sehen, zu öffnen und auch zu editieren. Warum kann dann von der App aus dieser Datei nicht einmal gelesen werden? Alle Suche im Internet half mir bisher auch nicht weiter.


    MfG, kodela

  • Grundsätzlich muss die Permission ab API 19 vorhanden sein.
    Um die Berechtigungssache zu lösen, probiere doch einmal die Methoden:
    getExternalFilesDir(java.lang.String)
    getExternalStoragePublicDirectory(java.lang.String)


    Da sind auch jeweils Beispiele bei, die du ausprobieren könntest.
    Hoffe es klappt dann auch auf dem A3 ;) Eigentlich sollte das public dir von außen sichtbar sein und auch funktionieren.

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • Hallo Christopher,


    Dank Deiner Hinweise ist das Problem gelöst.


    Hier der komplette Code für das Herausfinden des Pfades für die auszuwertende Datei, der Aufruf der Java-Datei für die Auswertung und schließlich noch die Anzeige:

    Java
    File f = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
    Jubeltage jubeltage = new Jubeltage(f.getPath()+"/jubeltage.txt");
    String ausgabe = jubeltage.getAusgabe();
    TextView txt_view = (TextView) findViewById(R.id.anzeige_text);
    txt_view.setText(ausgabe);

    Rein durch Zufall habe ich entdeckt, dass ohne mein Zutun auf der SD Karte unter /Android/data folgender Pfad angelegt war: /kodelasjubeltage.vier/files/Download - allgemeiner, /mein_package/files/Download.


    Entdeckt hatte ich dies, da mir mit Ausnahme vom /Download Ordner in keiner der übrigen Ordner, auch nicht in dem von mir angelegten, im Windows Explorer die Datei angezeigt wurde, worauf ich aber, wie bereits erwähnt, nicht verzichten wollte. Mit dem S3 mini wurde die Datei dort problemlos gefunden, mit dem A3 jedoch nicht und deshalb versuchte ich es über den Aufruf von getExternalFilesDir() mit dem Parameter Environment.DIRECTORY_DOWNLOADS und war sehr erstaunt, was ich damit zurück bekam:


    /storage/emulated/0/Android/data/kodelasjubeltage.vier/files/Download


    Unter Windows fand ich diesen Pfad nicht, wohl aber über meine beiden Dateimanager auf dem Gerät. Der komplette Pfad war bereits angelegt. Jetzt musste nur noch die Datei selbst rein, was mit Hilfe des ES Datei Explorers schließlich auch gelang und nach einer Codeanpassung beim nächsten Versuch sofort zum lange erstrebten Ergebnis führte.


    Trotzdem, ein Wermutstropfen bleibt, der oben gezeigte Quellcode funktioniert nur für das A3 Gerät. Für das S3 mini muss, wie bisher auch schon, der Code so aussehen:

    Java
    File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
    Jubeltage jubeltage = new Jubeltage(f.getPath()+"/Download/jubeltage.txt");
    String ausgabe = jubeltage.getAusgabe();
    TextView txt_view = (TextView) findViewById(R.id.anzeige_text);
    txt_view.setText(ausgabe);

    Besteht die Möglichkeit, durch eine Versionsabfrage den Code so zu schreiben, dass er für alle Android Versionen unverändert eingesetzt werden kann? Dafür müsste man natürlich wissen, ab welcher Version diese Änderung erfolgte und wie man die Version abfragen kann, letzteres vermutlich die leichtere Übung.


    MfG, kodela

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!