wake-up-neo.com

Wie ändert sich der Speicherzugriff auf Android 6?

Hintergrund

In Android gab es viele Änderungen im Umgang mit der SD-Karte und dem Speicher im Allgemeinen:

  • API 3 - Sie erhalten alle Zugriffsrechte, keine Berechtigung erforderlich
  • API 4-15 - Sie müssen WRITE_EXTERNAL_STORAGE verwenden, und Sie erhalten vollen Zugriff.
  • API 16-18 - Wenn Sie nur lesen möchten, verwenden Sie READ_EXTERNAL_STORAGE
  • API 19-20 - Sie können keinen sekundären externen Speicher (SD-Karte) lesen oder darauf schreiben, es sei denn, Ihre App ist eine System-App oder Sie haben root.
  • API 21-22 - Um auf die SD-Karte zugreifen zu können, müssen Sie den Benutzer um Erlaubnis fragen und anstelle der Datei-API die DocumentFile-API verwenden. Dies wirft viele Fragen auf, da ich über hier , hier und hier geschrieben habe.

Ab API 23 (Android 6) scheinen sich die Dinge wieder zu ändern ...

Das Problem

Für API 23 gibt es mindestens zwei Dinge, die neu sind und sich auf den Speicher beziehen:

  • " Adoptable Storage Devices " - Der Benutzer kann die SD-Karte optional wie einen primären externen Speicher erstellen.
  • Im Rahmen des new-Berechtigungsmechanismus (Anfordern von Berechtigungen zur Laufzeit) scheint der Speicher auch eine Berechtigung zu sein, die der Benutzer bestätigen muss. Dies gilt sowohl für READ_EXTERNAL_STORAGE als auch für WRITE_EXTERNAL_STORAGE

Da es kein Android 6-Gerät gibt, das über eine SD-Karte verfügt, und weil der Emulator selbst nicht wirklich die Fähigkeit besitzt, eine SD-Karte zu verwenden, ist es immer noch unmöglich zu wissen, was los ist.

Die Fragen

  1. Erhält die SD-Karte den Zugriff über die Datei-API anstelle von DocumentFile?

  2. Wenn ich auf alle externen Speicherpfade (einschließlich SD-Karte) zugreifen möchte, bedeutet das, dass ich diese Berechtigungen zweimal anfordern muss: eine für den primären externen Speicher und eine für die SD-Karte?

  3. Sind Dateien auf der SD-Karte vor der manuellen Erteilung der Genehmigung auf irgendeine Weise zugänglich?

  4. Angenommen, der Benutzer hat "Adoptable Storage Devices" gewählt. Was bedeutet dies für die verschiedenen Funktionen, die die Pfade der App-Dateien abrufen? Zum Beispiel: getFilesDir, getExternalFilesDir, ...? Würde sich der Auftrag von getExternalFilesDirs dadurch ändern?

  5. Was passiert mit den Dateien der App, wenn der Benutzer die App von/auf die SD-Karte verschiebt (mithilfe der "zulässigen Speichergeräte")? Was ist mit den Dateien der App auf der SD-Karte? Würden sie bleiben Oder würden sie sich irgendwo bewegen?

    Wenn die App beispielsweise "file1.txt" auf der SD-Karte im Pfad "/ storage/extSdCard/Android/data/appPackageName" hat und die Datei "file2.txt" (oder sogar denselben Namen) auf dem primären externen Speicherpfad "/ storage/emulated/0/Android/data/appPackageName". Was würde nach dem Umschalten für diese Dateien passieren? Wie würden sie, wenn überhaupt, in einem einzigen Ordner verschmelzen?

  6. Bedeutet dies, dass beim Verschieben der App auf die SD-Karte (mit "verwendbaren Speichergeräten") kein interner Speicher verwendet wird?

47

Lassen Sie mich auf Adoptable Storage Devices verwandte Fragen antworten:

  1. Angenommen, der Benutzer hat "Adoptable Storage Devices" gewählt, was bedeutet dies für die verschiedenen Funktionen, die die Pfade von .__ abrufen. die app-dateien? Zum Beispiel: getFilesDir, getExternalFilesDir, ...? Würde sich der Auftrag von getExternalFilesDirs dadurch ändern?

Wenn der Benutzer die SD-Karte als "verwendbares Speichergerät" (Format als intern) verwendet, bedeutet dies, dass die SD-Karte jetzt nur als interner Speicher verfügbar ist, d. H. Keine SD-Karte zum Speichern heruntergeladener Dateien verfügbar ist. In Pfaden, die von den verwandten Methoden zurückgegeben werden, findet keine Änderung der Reihenfolge statt. Beispiel: getExternalFilesDir () listet nur den externen Speicherpfad auf, wenn der Benutzer seine SD-Karte als "zulässige Speichergeräte" formatiert hat. Der SD-Kartenpfad ist nicht verfügbar.

  1. Was passiert mit den Dateien der App, wenn der Benutzer die App von/auf die SD-Karte verschiebt (mithilfe der "zulässigen Speichergeräte")? Was über die Dateien der App auf der SD-Karte? Würden sie bleiben Oder würden sie sich irgendwo bewegen? Zum Beispiel, wenn die App "file1.txt" in der .__ hat. SD-Karte unter Pfad "/ storage/extSdCard/Android/data/appPackageName" und Es hat eine Datei "file2.txt" (oder sogar den gleichen Namen) auf der primären externer Speicher auf Pfad "/ storage/emulated/0/Android/data/appPackageName". Nach dem Umschalten Was würde für diese Dateien passieren? Wie würden sie zu einem einzigen Ordner, wenn überhaupt?

Wenn ein Benutzer seine SD-Karte als "zulässige Speichergeräte" auswählt, muss er seine SD-Karte mit der Option "Format as internal" als internen Speicher formatieren. Format bedeutet, dass alle auf der SD-Karte gespeicherten Daten/Dateien gelöscht werden. Wenn der Benutzer seine SD-Karte aus "Adoptable Storage Devices" entfernen möchte, muss der Benutzer seine SD-Karte erneut mit der Option "Format als Portable" als tragbarer Speicher formatieren.

  1. Bedeutet dies, dass beim Verschieben der App auf die SD-Karte (mit "verwendbaren Speichergeräten") kein interner Speicher verwendet wird?

Ja, der ursprüngliche interne Speicher wird nicht verwendet. Es wird nur SD-Kartenspeicher verwendet, da Sie die SD-Karte als "Verwendbare Speichergeräte" ausgewählt haben. Alle Daten/Cache werden auf der SD-Karte gespeichert

10
VicJordan

Um Ihre Frage 5 zu beantworten: Unter Android 7 werden alle Dateien im Bereich "Öffentliche Daten", /storage/emulated/0/ (oder ein herstellerspezifischer Speicherort, dh das Verzeichnis, das DCIMDownloads usw. enthält) entweder vollständig im internen Speicher oder vollständig gespeichert auf der übernommenen SD-Karte. Nach dem ursprünglichen Format einer übernommenen SD-Karte wird dem Benutzer die Möglichkeit geboten, "Daten zu migrieren", wodurch der gesamte /storage/emulated/0 auf die SD-Karte verschoben wird. Zu jedem Zeitpunkt kann der Benutzer auch zu Einstellungen/Speicher gehen, den Speicherbereich auswählen, der derzeit nicht den öffentlichen Datenbereich enthält, und auf und das Symbol (drei vertikale Punkte) oben rechts klicken, um aufzurufen ein Menü mit der Option "Daten migrieren".

Es scheint, dass es für einen Benutzer oder eine Anwendung nicht möglich ist, eine bestimmte öffentliche Datei auf die SD-Karte zu erzwingen, wenn eine angenommene Karte verwendet wird. Alles oder Nichts. (Der private Speicher der App befindet sich im internen Speicher oder auf der SD-Karte, je nachdem, ob die App auf die SD-Karte verschoben wurde oder nicht; auch dort scheint die App nur das eine oder das andere zu verwenden, nicht beides .)

1
Curt J. Sampson