Forum: PC-Programmierung Android 6: Wie importiert man eine Datei per SD-Karte?
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.)
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.
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 von einem Moderator 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...
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:
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.
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.
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.
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.
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.
|