Ich will eine Datei mit Testdaten auf die SD-Karte schreiben und die dann aus meiner Applikation einlesen. Schreiben geht mit dem Linux-Filemanager (hier: Caja auf Mint 17) über USB problemlos, nur sieht die App auf dem Phone die Datei ums Verrecken einfach nicht, selbst wenn sie in einem (selbst angelegten) /Android/<app>/files - Verzeichnis liegt. Den Pfad der SD-Karte frage ich mit getExternalFilesDir ab - das sieht erst mal gut aus. Nur die verdammte Datei findet er nicht. WRITE_EXTERNAL_STORAGE Permission ist gesetzt. Wie muss man das machen? (Per Assets kann ich es, ich will es aber aus einer normalen Datei machen und nicht jedesmal mit dem APK auf das Gerät kopieren.)
:
Bearbeitet durch User
Hab noch keine App geschrieben, aber vielleicht kann ich dir auch so helfen. Was für ein Dateisystem hat die SD-Karte? (Fat oder EXT3/4) Wenn es EXT3 oder 4 sein sollte: Schau mal nach ob die Leserechte gesetzt sind. Also vom Android-System auf dem Telefon über ein Terminal mal "ls -l" eingeben. Auch die Leserechte des übergeordneten Ordners überprüfen, vielleicht hakt es ja da.
Das Dateisystem von Android ist nur noch grob ähnlich dem, was man von Linux kennt und die Sicherheitsphilosophien sind sehr unterschiedlich. Linux-Wissen ist zwar bei der Einarbeitung nützlich, ist aber nicht direkt auf Android anwendbar. Die SD-Karte sollte über /sdcard zugreifbar sein:
1 | $ ls -l /sdcard |
2 | lrwxrwxrwx root root 2014-02-17 20:56 sdcard -> /storage/self/primary |
3 | |
4 | $ ls -l /storage/self/primary |
5 | lrwxrwxrwx root root 2014-02-17 20:56 primary -> /mnt/user/0/primary |
6 | |
7 | $ ls -l /storage/emulated/0 |
8 | ... |
9 | drwxrwx--x root sdcard_rw 2017-08-12 17:19 Download |
10 | ... |
Der Inhalt des Download-Verzeichnisses ist völlig anders, als das, was Caja unter mtp://[usb:001,004]/Card anzeigt. Weiß der Henker, was das Teil da zusammengelinkt hat...
Vielleicht hift der Hinweis, daß es unter Android immer "zwei SD-Karten" gibt. Eine mit dem System selbst (Altlast aus den Tagen, als Linux & Co nur sinnvoll via SD-Karte auf den Windows-CE-Geräten bootbar war) und eine SD-Karte, die tatsächlich ein Wechseldatenträger ist. Imho /sdcard und /ExtSD oder so. Test: erzeuge mit Boardmitteln eine beliebige Datei (z.B. Foto) und verschiebe die mit FileCommander oder ähnlichen Tools in dein Files-Verzeichnis. Schau, ob du diese Datei aus deiner App sehen kannst (getDirFiles reicht. du musst sie nicht öffnen können). Überprüfe dann (die SD-Karte am Linux-PC steckend), die Rechte der Datei und erstelle deine Testdaten entsprechend. Mtp ist übrigens kein vollständig transparenter Dateidienst.
:
Bearbeitet durch User
Jetzt habe ich erst mal ein Factory Reset angeworfen... Dauert ewig... Ich hoffe, dass damit auch das Problem behoben wird, dass adb run-as nicht funktioniert hat. Andy P. schrieb: > Imho /sdcard und /ExtSD oder so. Irgend sowas muss es sein. Jetzt muss ich erst mal warten, bis er sich aus-resettet hat.
Beitrag #5115912 wurde vom Autor gelöscht.
Es gibt einem Mountpoint unter /mnt/storage/extSdCard, darüber kommet adb nicht an die Karte:
1 | $ ls -l /mnt/storage/extSdCard |
2 | /mnt/storage/extSdCard: No such file or directory |
Andererseits kann ich sie aber per Cajy am PC zugreifen. (Den Factory Reset hat sie unverändert überstanden.)
1 | Environment.getExternalStorageDirectory().getPath() |
liefert "/storage/emulated/0" zurück - daran habe ich mir schon erfolglos die Zähne ausgebissen...
:
Bearbeitet durch User
Uhu U. schrieb: > liefert "/storage/emulated/0" zurück Das ist bei mir auch der interne Speicher, dort liegen bei mir die ganzen Ordner. Also DCIM, Documents, Download usw. Also nicht der root-Ordner "/" oder so, nur der Teil wo man eben selbst drauf zugreifen kann. Vielleicht ein Hinweis: Mein anderes Handy habe ich mit einer App genutzt mit der ich über W-Lan (thetering) auf die Daten zugreifen konnte. Die App hat aber external und internal Storage vertauscht angezeigt. Wenn ich den external Storage auslesen wollte (meine SD-Karte, wo all meine Daten drauf sind), dann bin ich in dieses OS-Dateisystem gekommen. Wenn ich mir internal Storage anzeigen ließ hatte sah ich meine SD-Karte. Gibt es auch eine Funktion "Environment.getInternalStorageDirectory().getPath()" ? Was liefert die zurück?
Die erste Antwort hier: https://stackoverflow.com/questions/36766016/how-to-get-sd-card-path-in-android6-0-programmatically ist die Lösung. Damit bekommt man einen Pfad, der per adb ls zugegriffen werden kann. Mal sehen, ob ich damit an die Datei kommen.
Der Pfad sollte so aussehen:
1 | /storage/XXXX-XXXX/... |
Die X stehen dabei für die hexadezimale Darstellung der Volume Serial Number. Mike J. schrieb: > Die App hat aber external > und internal Storage vertauscht angezeigt. Das kenne ich von Wiko.
Mike J. schrieb: > Gibt es auch eine Funktion > "Environment.getInternalStorageDirectory().getPath()" ? > Was liefert die zurück? -> Beitrag "Re: Android 6: Wie importiert man eine Datei per SD-Karte?" Das ist die simulierte SD-Karte.
Konrad S. schrieb: > Der Pfad sollte so aussehen:/storage/XXXX-XXXX/... Genau so sieht der Pfad aus, den der Code von https://stackoverflow.com/questions/36766016/how-to-get-sd-card-path-in-android6-0-programmatically liefert.
Jetzt gibts "nur" noch ein Permission denied:
1 | /storage/AFF8-1DF5/Download/file.txt: open failed: EACCES (Permission denied) |
Die Datei im ls -l:
1 | -rwxrwx--x root sdcard_rw 5223412 2017-08-18 23:21 file.txt |
Da ist wieder irgend so eine Sicherheitsscheiße im Spiel... Ein chmod 777 file.txt weist er mit "Operation not permitted" ab.
:
Bearbeitet durch User
So weit ich recherchiert habe, ist das Verhalten gewollt. Zugriff gibt es nur für System-Apps. Wie man dieses schöne System dermaßen verkrüppeln kann, ist mir ein Rätsel.
Damit nicht jede App ohne fragen zu müssen an die Daten anderer Apps kommt. Es geht evtl schon, nur muss die App das Recht ausdrücklich erfragen. Gibt genug Apps, die das tun. Schon mal selinux verwendet? Das macht erst richtig Spass.
:
Bearbeitet durch User
A. K. schrieb: > Es geht evtl schon, nur muss die App das Recht ausdrücklich > erfragen. Die in Frage kommenden Rechte habe ich der App gegeben - hilft nix. Über die (simulierte) sdcard steht in der Dokumentation, dass dort kein Zugriffsschutz bestehen würde. Die echte SD-Karte wird sehr stiefmütterlich behandelt - es wird spekuliert, das läge daran, dass Google Smartphones keine SD-Sockel haben. Irgend so ein hirnverbrannter Schwachsinn wirds wohl sein.
Uhu U. schrieb: > Die in Frage kommenden Rechte habe ich der App gegeben - hilft nix. Schau mal anhand von Beispielen wie andere das in ihrer App lösen, z.B. bei dem Turbo-Editor. (https://github.com/vmihalachi/turbo-editor)
Mike J. schrieb: > z.B. bei dem Turbo-Editor. Kann der auf einem Galaxy S5 unter Android 6.0.1 auf die SD-Karte zugreifen? Es scheint nämlich zu allem Überfluss auch noch geräteabhängig zu sein, wie der Zugriff auf die SD-Karte vom System gehandhabt wird.
Uhu U. schrieb: > Mike J. schrieb: >> z.B. bei dem Turbo-Editor. > > Kann der auf einem Galaxy S5 unter Android 6.0.1 auf die SD-Karte > zugreifen? Kann zwar von der SD-Karte lesen, aber nicht darauf schreiben.
Ok, das ist ja immerhin schon mal was. Die Quellen habe ich herunter geladen...
Da war doch noch was ... ach ja, meine Androiden fragen mich beim ersten schreibenden Zugriffsversuch auf einen via OTG-Adapter angeschlossenen USB-Stick oder SD-Kartenleser immer(?), ob ich den Zugriff erlauben will. Kann sein, dass das bei der SD-Karte auch passiert. Da mag ich nur nicht mehr rumspielen, weil sonst wieder alle Playlists für die Musik auf der SD-Karte weg sind.
Ich habe auch Android 6.0.1 auf meinem Telefon (China-Marke), aber bei mir geht das alles. Wenn du ein Dokument (DOC-Datei, Bild, pdf oder so) auf dem Telefon erstellst musst du es doch auch speichern/lesen können ... alles andere wäre ja total sinnlos. XD Es sei denn die wollen dass man nur mit Dateien in der (ge-)klaut arbeitet. Durch unser sehr mieses mobiles Internet hier (wenig bis kein Empfang) ist so etwas für mich aber eh nicht nutzbar.
IMHO kann eine Anwendung bei neueren Androids maximal auf ihr eigenes Verzeichnis zugreifen, vielleicht noch auf ein paar übliche Verdächtige wie Downloads, und muss sich den Zugang zu anderen Verzeichniss(bäumen) einmalig vom Anwender per Filebrowser freigeben lassen. So jedenfalls verhalten sich diverse Anwendungen. Von Bedeutung scheint mir hier die erforderliche Anwender-Aktion. Also dass das nicht die App automatisch selbst bestimmen kann, wo sie gerne schnüffeln würde. Datenschutz.
:
Bearbeitet durch User
Hier für Android 7: https://willowtreeapps.com/ideas/android-n-scoped-directory-access-overview/
:
Bearbeitet durch User
Und hier für Android 6: https://stackoverflow.com/questions/33139754/android-6-0-marshmallow-cannot-write-to-sd-card
A. K. schrieb: > Und hier für Android 6: > https://stackoverflow.com/questions/33139754/android-6-0-marshmallow-cannot-write-to-sd-card Danke, das habe ich gesucht... Die Dokumentation von Android ist wirklich super. Auf ein Problem stoße ich dabei aber immer öfter: man findet vieles, was auf Deutsch gesagt mittlerweile Kalter Kaffee ist. Das Datum der Beiträge kann zwar helfen, sich über die Relevanz der Fundstücke ein Bild zu machen, aber zuverlässig ist das leider nicht. Aber wenn ich die Doku von Android mit der von PocketPC vergleiche: da liegen Welten dazwischen...
A. K. schrieb: > Schon mal selinux verwendet? Das macht erst richtig Spass. Kleiner Ausschnitt aus einem find-Listing des S5:
1 | ./sys/fs/selinux/policy_capabilities |
2 | ./sys/fs/selinux/policy_capabilities/open_perms |
3 | ./sys/fs/selinux/policy_capabilities/network_peer_controls |
4 | ./sys/fs/selinux/class |
5 | ./sys/fs/selinux/class/drmservice |
6 | ... |
Uhu U. schrieb: > Kleiner Ausschnitt aus einem find-Listing des S5: Natürlich wird das in Android verwendet, das wäre ja noch schöner. Siehe Einstellungen, Gerätestatus, Softwareinfo, SE für Android Status. Nur musst du dich im Android nicht selber mit dessen Konfiguration rumärgern. Höchstens mit den Folgen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.