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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Uhu U. (uhu)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Konrad S. (maybee)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert

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


Bewertung
1 lesenswert
nicht lesenswert

von Uhu U. (uhu)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.