Sollen Dateien, die in „/storage/emulated/0“ erstellt wurden, in „/storage/sdcard0“ erscheinen?

Soweit ich vermute, steht jedem Benutzer der interne Speicher zur Verfügung. Wenn emulierter Speicher ein Speicherort ist, der für einen bestimmten Benutzer erstellt wurde, sollen Dateien, die in erstellt wurden , in /storage/emulated/0erscheinen /storage/sdcard0? Ich gehe davon aus, dass dies nicht der Fall ist, da vom Benutzer erstellte Dateien nur emuliert angezeigt werden sollten, da sonst vom Benutzer erstellte Dateien für alle anderen Benutzer sichtbar wären.

Was lässt Sie denken, dass /storage/emulated/0es spezifisch für einen bestimmten Benutzer ist – und nicht nur das „erste emulierte Speichergerät“, wie /storage/sdcard0es die erste (interne) SD-Karte ist?
@Izzy Weil die Nummerierung (dh in diesem Fall '0') einen Speicherplatz angibt, der einem bestimmten Benutzer zugewiesen ist. Ist Android nicht ab Android 4.2 eine Multi-User-Plattform geworden?
Ah, sorry – das wurde wieder verwechselt ( 0vs. /0ist zu leicht zu verwechseln). Bitte überprüfen Sie mit: Warum wurde /sdcard/ mit 4.2 zu /sdcard/0/? und verwirrt durch die vielen Speicherorte der virtuellen /sdcard/ . Ich habe selbst nie mit Multi-User gespielt, also habe ich hier nicht tiefer gegraben. Wenn Sie mehrere Benutzer auf Ihrem Gerät haben, können Sie das überprüfen? Ich wäre neugierig, aber ich vermute, dass das /storage/sdcard0immer auf das Verzeichnis des entsprechenden Benutzers verweist, wie /storage/emulated/legacy/es auch der Fall ist.
@Izzy Ich habe diese beiden Fragen gelesen, bevor ich hierher gekommen bin. Ich glaube nicht, dass wir mehrere Benutzer erstellen müssen, da ich nur "0" erwähne, nur den einzelnen Besitzer. Ich frage, ob vom Benutzer erstellte Dateien in "/storage/sdcard0" angezeigt werden sollen. Meine Frage könnte auf ein grundlegendes Unverständnis darüber hinweisen, wie die Android-Dateistruktur aufgebaut ist, daher weiß ich nicht, ob meine Frage überhaupt Sinn macht. Nach allem, was ich zusammenfasse, glaube ich, dass es in erster Linie der Sinn von "/storage/emulated" ist, jedem Benutzer einen bestimmten Platz zur Verfügung zu stellen, um Ordner und Dateien von anderen Benutzern fernzuhalten.
@Izzy Heutzutage ist es nur eine Systemvorgabe, dass die 0 enthalten ist. Das oder noch mehr Regierungsverschwörung.
@Narcotixs Die Verzeichnisse sind mit demselben physischen Standort verknüpft, was normal ist.
@DanBrown Wenn ich das richtig verstehe, fragt das OP: " Wenn /storage/sdcard0 frei lesbar und beschreibbar ist, was bringt es dann, ein /storage/emulated/X - Verzeichnis für jeden Benutzer zu haben? ", was eine gute Frage ist.
@DeathMaskSalesman Wenn dem so ist, dann keine Ahnung. Habe mich nie wirklich mit Multi-User beschäftigt (aber wer hat das schon?)
Genau das ist mir ein Rätsel – und das ist mir auch erst nach dem Schreiben meines ersten Kommentars aufgefallen. Daher die Frage, ob man das mit mehreren Benutzern auf einem Gerät überprüfen könnte, bitte.
@DanBrown Ich selbst, vor einer Stunde. Die Erfahrung hat mir nicht gefallen.
@Izzy Von dem, was ich schnell erwischt habe, beanspruchen sie beim Erstellen eines zweiten Benutzers /storage/sdcard10 und nicht etwa 1 oder 2
OK, @DanBrown – und danach (oder sogar davor) mit dem mountBefehl prüfen. Überraschung, erwarte ich: Es gibt ein überlagertes FUSE-Dateisystem (so wird die interne SD-Karte vom anderen internen Speicher getrennt, während sie sich auf derselben Partition befindet). Was ich jetzt vermute, ist, dass dieses FUSE-System möglicherweise für die Trennung von Benutzerdaten sorgt und die "SD-Karte" an der richtigen Stelle abbildet.
@Izzy Hmmm, das würde Sinn machen. Ich habe kein gerootetes Gerät, um mit ATM herumzuspielen (ich habe eigentlich überhaupt kein gerootetes Gerät, wie ich gerade festgestellt habe), also kann ich nicht wirklich mit Terminal herumspielen.
@DanBrown Root ist nicht erforderlich, Sie können ein Terminal ohne verwenden :) Und ja, meine Vermutung scheint richtig zu sein: Warum verwendet Android eine Sicherung für die interne SD-Kartenhalterung? sagt Das FUSE-Dateisystem verwaltet auch Berechtigungen für die Dateien, die im Ordner /data/media gespeichert sind. Mal sehen, ob ich weitere Beweise finde, die eine Antwort rechtfertigen :)

Antworten (2)

Ich habe auf einem meiner Geräte nachgesehen, und wie die Kommentarkette bereits vermutet hat, müssen Sie sich keine Sorgen machen, dass jeder Zugriff auf die Daten aller anderen hat. Erste:

/storage/sdcard0 -> /storage/emulated/legacy

Das heißt, es ist nur ein Symlink, der immer auf die Daten des aktuellen Benutzers zeigt:

/storage/emulated/legacy -> /mnt/shell/emulated/0

(der erste Benutzer – in meinem Fall der einzige). Zweitens, wo Sie normalerweise danach suchen:

/sdcard -> /storage/emulated/legacy

Wieder das gleiche Spiel. Für die emulierte SD-Karte (auch als "interne SD-Karte" bezeichnet) kümmert sich das Android-System darum, sie dem aktuellen Benutzer entsprechend zuzuordnen. Bei der externen SD-Karte bin ich mir nicht sicher (ob diese z. B. zum Teilen von Daten zwischen mehreren Benutzern verwendet werden könnte). Dies ist normalerweise zu finden in /storage/sdcard1:

$ mount | grep sdcard
/dev/block/vold/179:65 /mnt/media_rw/sdcard1 vfat […]
/dev/fuse /storage/sdcard1 fuse […]
$ ls /mnt/media_rw/sdcard1
/mnt/media_rw/sdcard1: Permission denied
$ su -c "ls /mnt/media_rw/sdcard1"
[data from external SD card]

Sie können also sehen, dass auf die externe SD-Karte nur mit Root-Berechtigungen direkt zugegriffen werden kann , warum "normale Benutzer" über eine darauf gelegte FUSE-Halterung gehen müssen. Das System könnte also wieder dafür sorgen, dass jeder Benutzer an dieser Stelle nur auf seine eigenen Daten zugreifen kann. Ich bin mit den Interna nicht vertraut genug, um es mit Sicherheit zu sagen (oder auch nur zu sagen, was genau dort gemacht wird).

Nun zu Ihrer ausdrücklichen Frage, ob Dateien, die in erstellt wurden, in /storage/emulated/0erscheinen sollen /storage/sdcard0: Angenommen, Sie sprechen von /mnt/shell/emulated/0(ich konnte es /storage/emulated/0auf meinem Gerät nicht finden), tun sie dies empirisch natürlich, da sich beide am selben Ort befinden: /storage/sdcard0 -> /storage/emulated/legacy -> /mnt/shell/emulated/0– was bedeutet, dass /storage/sdcard0zeigt, was in enthalten ist /mnt/shell/emulated/0. Aber deine Sorge ist unbegründet: zeigt durch den "Mittelsmann" ( /storage/emulated/legacy) /storage/sdcard0immer auf den Speicher des "eingeloggten Benutzers" – wenn also z. B. der zweite Benutzer dort nachschaut, sieht er was drin ist /mnt/shell/emulated/1(bzw was auch immer sein/ihr emulierter Speicherbereich ist).


Lassen Sie mich als PS die Dinge aus den Kommentaren als kurze FAQ zusammenfassen:

  • Ich frage mich, was passieren würde, wenn ein anderer Benutzer versucht, auf Daten im emulierten Speicher eines anderen Benutzers zuzugreifen und diese zu speichern.
    Er erhält eine Fehlermeldung, dass es entweder nicht vorhanden oder nicht zugänglich ist.
  • Warum werden diese Symlinks benötigt?
    Mehrere Gründe, viele davon historisch (ein Wort: "Kompatibilität").
  • Was sind diese Symlinks und wie funktionieren sie in Laienbegriffen?
    Sie sind im Grunde "Wegweiser", die sagen: "Bitte schauen Sie dort nach". Anders als Sie zunächst angenommen haben, enthalten sie selbst keine Daten – sie sind wirklich nur Wegweiser oder „Hinweise“. Die Daten selbst befinden sich am „Zielort“ und nur dort. Weitere Einzelheiten finden Sie im Wikipedia-Artikel zu symbolischen Links .

Siehe auch:

Dies mag etwas vom Thema abweichen, aber warum werden diese Symlinks benötigt? Was war der Grund, warum die Speicherarchitektur geändert und so gestaltet wurde, wie sie jetzt ist?
Warum zeigt „/storage/sdcard0“ auf „/storage/emulated/legacy“? Ich dachte, emulierter Speicher sollte immer auf den ursprünglichen Speicherort zeigen (dh interner Speicher oder der reale virtuelle Speicherort) oder gibt es überhaupt keinen Hinweis darauf, dass es sich nur um einen gegenseitigen bidirektionalen Verweis aufeinander handelt?
Tut mir leid, das kann ich nicht beantworten. Vielleicht stellen Sie es als separate Frage? Wenn dies Ihre ursprüngliche Frage beantwortet, sollten Sie sie akzeptieren , @Narcotixs ;) Und es tut mir leid, dass ich Ihre Änderung abgelehnt habe: Ihre Änderung spiegelt nicht das wider, was ich gefunden habe. /sdcardhier ist ein direkter Link zu /storage/emulated/legacy, nicht zu /storage/sdcard0.
Es ist schwer zu sagen, ob Sie die Frage tatsächlich beantwortet haben, die Symlinks sind hilfreich, aber es wurden weitere Fragen gestellt. Ich möchte jetzt wissen, ob Symlinks bidirektional sind? Wenn ich eine Datei in /storage/emulated/0 erstelle, wird sie dann in /storage/sdcard0 angezeigt? Ihr Pfeil zeigt und zeigt eine Übertragung von Informationen an (dh vom Speicher zur Emulation), aber geht es auch umgekehrt? Das war meine Frage. Nach dem, was Sie sagen, gehe ich davon aus, dass das stimmt. Würdest du zustimmen?
Symlinks sind unidirektional, eine Art "Weiterleitung" (auch bekannt als "schau dort"). Wenn Sie jedoch eine Datei unter erstellen /storage/emulated/0würden, würde sie natürlich in /storage/sdcard0erscheinen, da beide auf denselben Ort zeigen. Oh, ich verstehe, ich hätte das explizit schreiben sollen – das ist das Problem, wenn Sie jeden Tag mit einer Sache arbeiten, ist es klar, dass ein Symlink das tut :) OK, werde das zu meiner Antwort hinzufügen.
Wenn alle Speicherorte auf denselben virtuellen Speicher verweisen, was bringt es dann, separate Speicherorte für jeden einzelnen Benutzer zu haben (wenn natürlich mehr als einer vorhanden ist)? Also /storage/emulated/0,1,2,3 usw. sie alle zeigen auf /storage/sdcard0, was auch auf /sdcard zeigt? Warum existieren die Zahlen? Warum einen numerischen Ordner zuweisen, wenn alle auf denselben Ort zeigen und genau dieselben Informationen enthalten?
Sie haben das Pferd erneut umgedreht, was zu Ihrer Verwirrung führt ("warum hat es seinen Kopf am falschen Ende?"). Es zeigt nicht /storage/emulated/*auf, /storage/sdcard0sondern umgekehrt. Wenn also "user0" eingeloggt ist, sdcard0zeigt es auf, emulated/0aber wenn "user1" eingeloggt ist, zeigt es auf emulated/1- dh "the sdcard" zeigt immer auf den emulierten Speicherbereich, der dem eingeloggten Benutzer gewidmet ist - der natürlich andere Inhalte für enthält jeder Benutzer.
Der Thread wird fortgesetzt unter: android.stackexchange.com/questions/173918/…

Herr Expensive Toys sagte: Ich bin erstaunt, dass dieses Problem immer noch auftritt, da es bereits bei Honeycomb auftrat.

Das /storage/emulated/0/DCIM/Cameraist also derselbe Ordner wie Ihr normaler DCIM/Kamera-Ordner. Es ist nur ein Symlink. Die Dateien befinden sich also tatsächlich am richtigen Ort, Sie haben nur eine App, die fehlerhafte Daten in die MediaStore-Datenbank einfügt.

Wenn Sie von Ihrem PC aus auf Dateien zugreifen, listen Sie eigentlich die MediaStorage-Datenbank für Dateien auf. Es zieht keine traditionellen Verzeichnislisten. Was Sie sehen, basiert also auf dem Inhalt dieser Datenbank und den Pfadeinträgen in der Datenbank.

Dateien in der Datenbank, die auf emulierte Verzeichnisse verweisen, werden nicht angezeigt, da davon ausgegangen wird, dass es sich um Duplikate handelt, da es sich um dasselbe physische Verzeichnis wie bei Ihrer normalen DCIM/Kamera handelt. Was vor sich geht, ist, dass einige schlecht geschriebene Apps von Drittanbietern Einträge mit dem /storage/emulated/0/DCIM/CameraPfad in die Datenbank einfügen, anstatt mit dem richtigen Root-Pfad zu DCIM/Kamera. Das bedeutet, dass der MTP-Dienst sie nicht sehen kann, wenn Sie mit Ihrem PC verbunden sind.

Normalerweise lässt sich das Problem am einfachsten beheben, indem Sie einfach die MediaStore-Datenbanken löschen, um die fehlerhaften Einträge aus der MediaStore-Datenbank zu entfernen, und das System die Dateien neu indizieren und mit den richtigen Pfaden in die Datenbank einfügen lassen.

Einstellungen->Apps Drücken Sie das 3-Punkt-Menü oben rechts und wählen Sie System anzeigen. Medienspeicher suchen, auswählen, Speicher auswählen, dann Daten löschen. Externen Speicher suchen, auswählen, Speicher auswählen, dann Daten löschen Telefon ausschalten, Telefon wieder einschalten, Warten Sie, bis der Indexdienst die Daten neu erstellt hat.

Wenn Sie fertig sind, sollten die Dateien mit dem richtigen Verzeichnisbaum angezeigt werden und vom PC aus sichtbar sein. Abhängig von der Menge der Dateien auf dem Telefon kann es 10 bis 20 Minuten dauern, die Mediendatenbank neu aufzubauen, da der Dienst die Telefonverzeichnisse durchsucht, Metadaten erhält, Miniaturansichten erstellt usw.