Testen Sie programmgesteuert, ob in Android 10+ der ältere externe Speicherzugriff deaktiviert ist

12

Gibt es einen einfachen API-Aufruf, der mir sagt, ob eine App, die unter Android 10 oder höher ausgeführt wird, den Scoped Storage-Zugriff verwenden muss, dh wenn der normale Dateizugriff, auch bekannt als "Legacy External Storage", deaktiviert ist? Beachten Sie, dass selbst wenn die App in AndroidManifest.xml, Abschnitt deklariert:

  android:requestLegacyExternalStorage="true"

Der Dateizugriff kann aufgrund zukünftiger Änderungen der Google-Richtlinien weiterhin verweigert werden. Das Testen dieses Werts ist daher nutzlos. Die einzige Möglichkeit, die ich gefunden habe, besteht darin, zu testen, ob das Stammverzeichnis des externen Speichers lesbar ist. Dazu muss die App jedoch zuerst die Speicherberechtigung anfordern, die für alles andere unbrauchbar ist, wenn der Legacy-Speicher deaktiviert ist.

public static boolean mustUseScopedStorage() {
    // Impractical must first ask for useless Storage permission...
    File exSD = Environment.getExternalStorageDirectory();
    return !exSD.canRead(); // this test works only if Storage permission was granted.
}

Ich glaube, ich habe einmal eine neue API gesehen, um dies zu erkennen, kann diesen Artikel aber nicht mehr finden ...

Gregko
quelle
an app running on Android 10 or later must use Scoped Storage access? Können Sie erklären, was Sie damit meinen? Welche Funktionen haben Sie im Sinn? Ich weiß, dass zum Beispiel Storage Volumes und Storage Manager, die für N gebracht wurden, für Q bereits veraltet sind.
Blackapps
Ich meine den regulären Zugriff auf Java-Dateien über die Sandbox hinaus, die der App vom System zugewiesen wurde, oder z. B. im C / C ++ - JNI-Code fopen ("Dateiname.ext", Modus). funktioniert nicht (Zugriff verweigert), wenn der Dateipfad außerhalb des vom System zugewiesenen App-Verzeichnisses liegt. Nun, es wird jetzt auf Android 10 funktionieren, wenn Sie android verwenden: requestLegacyExternalStorage = "true" im Manifest, aber es ist eine vorübergehende Lösung und wird möglicherweise nächstes Jahr vollständig deaktiviert. Lesen Sie mehr zB androidcentral.com/what-scoped-storage-android-q
gregko
Selbst in diesem Artikel ist nicht klar, um welchen Speicherbereich es sich handelt.
Blackapps
@blackapps, vielleicht erklärt dieser Artikel es besser: developer.android.com/training/data-storage/files/…
Gregko
OK. Eingeschränkter Zugriff nur auf private Verzeichnisse von Apps.
Blackapps

Antworten:

8

Sie können diese beiden Methoden verwenden von android.os.Environment:

  • isExternalStorageLegacy(File path)

    Gibt zurück, ob es sich bei dem freigegebenen / externen Speichermedium unter dem angegebenen Pfad um eine Legacy-Ansicht handelt, die Dateien enthält, deren Eigentümer die App nicht ist.

  • isExternalStorageLegacy()

    Gibt zurück, ob es sich bei dem primären freigegebenen / externen Speichermedium um eine Legacy-Ansicht handelt, die Dateien enthält, deren Eigentümer die App nicht ist.

Dieser Wert kann sich von dem requestLegacyExternalStorageim Manifest der App angeforderten Wert unterscheiden , da eine App ihren Legacy-Status basierend auf der Erstinstallation erben kann.

Nicht ältere Apps können weiterhin Medien anderer Apps über erkennen und lesen MediaStore.

Wenn Sie feststellen, dass Sie Zugriff auf Legacy-Speicher haben, ist es meiner Meinung nach besser, Daten einfach in einen Speicher mit Gültigkeitsbereich zu migrieren und stattdessen zu verwenden, da Legacy-Speicher möglicherweise ohne Vorwarnung nicht mehr funktioniert.

Zaffy
quelle
1
Danke, @Zaffy, das ist genau die Antwort, nach der ich gesucht habe. Es funktioniert perfekt und es besteht keine Notwendigkeit, nach "Speicherzugriff" zu fragen.
Gregko