Forum: PC-Programmierung Android 6: Wie importiert man eine Datei per SD-Karte?


von Uhu U. (uhu)


Lesenswert?

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
von Mike J. (linuxmint_user)


Lesenswert?

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.

von Uhu U. (uhu)


Lesenswert?

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...

von Andy P. (bakaroo)


Lesenswert?

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
von Uhu U. (uhu)


Lesenswert?

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.
von Uhu U. (uhu)


Lesenswert?

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
von Mike J. (linuxmint_user)


Lesenswert?

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?

von Uhu U. (uhu)


Lesenswert?

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.

von Konrad S. (maybee)


Lesenswert?

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.

von Uhu U. (uhu)


Lesenswert?

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.

von Uhu U. (uhu)


Lesenswert?

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.

von Uhu U. (uhu)


Lesenswert?

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
von Uhu U. (uhu)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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
von Uhu U. (uhu)


Lesenswert?

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.

von Mike J. (linuxmint_user)


Lesenswert?

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)

von Uhu U. (uhu)


Lesenswert?

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.

von Konrad S. (maybee)


Lesenswert?

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.

von Uhu U. (uhu)


Lesenswert?

Ok, das ist ja immerhin schon mal was. Die Quellen habe ich herunter 
geladen...

von Konrad S. (maybee)


Lesenswert?

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.

von Mike J. (linuxmint_user)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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
von (prx) A. K. (prx)


Lesenswert?


: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?


von Uhu U. (uhu)


Lesenswert?

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...

von Uhu U. (uhu)


Lesenswert?

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
...

von (prx) A. K. (prx)


Lesenswert?

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
Noch kein Account? Hier anmelden.