Testez par programmation si dans Android 10+ l'accès au stockage externe hérité est désactivé

12

Existe-t-il un simple appel d'API qui me dirait si une application fonctionnant sur Android 10 ou version ultérieure doit utiliser l'accès au stockage étendu, c'est-à-dire si l'accès normal aux fichiers, également appelé «stockage externe hérité» est désactivé? Notez que même si l'application dans AndroidManifest.xml, la section a déclaré:

  android:requestLegacyExternalStorage="true"

l'accès au fichier peut toujours être refusé en raison de changements de politique de Google à l'avenir, donc tester cette valeur est inutile. La seule façon que j'ai trouvée est de tester si le répertoire racine du stockage externe est lisible, mais pour cela, l'application doit d'abord demander l'autorisation de stockage, qui est inutile pour toute autre chose, si le stockage hérité est désactivé.

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

Je pense avoir déjà vu une nouvelle API pour détecter cela, mais je ne trouve plus cet article ...

Gregko
la source
an app running on Android 10 or later must use Scoped Storage access? Pouvez-vous expliquer ce que vous voulez dire par là? Quelles fonctions avez-vous en tête? Je sais que par exemple les volumes de stockage et le gestionnaire de stockage qui ont été apportés pour N sont déjà obsolètes pour Q.
blackapps
Je veux dire un accès régulier au fichier Java au-delà du bac à sable attribué à l'application par le système, ou par exemple dans le code JNI C / C ++ fopen ("filename.ext", mode); ne fonctionnera pas (accès refusé) si le chemin du fichier est au-delà du répertoire d'application attribué par le système. Eh bien, cela fonctionnera sur Android 10 maintenant, si vous utilisez Android: requestLegacyExternalStorage = "true" dans le manifeste, mais c'est une solution temporaire et peut être complètement désactivée l'année prochaine. En savoir plus, par exemple androidcentral.com/what-scoped-storage-android-q
gregko
Même dans cet article, il n'est pas clair ce que serait le stockage étendu.
blackapps
@blackapps, peut-être cet article l'explique-t-il mieux: developer.android.com/training/data-storage/files/…
gregko
D'accord. Accès restreint aux répertoires privés des applications uniquement.
blackapps

Réponses:

8

Vous pouvez utiliser ces deux méthodes à partir de android.os.Environment:

  • isExternalStorageLegacy(File path)

    Renvoie si le support de stockage partagé / externe au chemin donné est une vue héritée qui inclut des fichiers n'appartenant pas à l'application.

  • isExternalStorageLegacy()

    Renvoie si le support de stockage principal partagé / externe est une vue héritée qui inclut des fichiers n'appartenant pas à l'application.

Cette valeur peut être différente de la valeur demandée par requestLegacyExternalStoragedans le manifeste de l'application, car une application peut hériter de son état hérité en fonction de sa première installation.

Les applications non héritées peuvent continuer à découvrir et à lire les médias appartenant à d'autres applications via MediaStore.

Si vous découvrez que vous avez accès au stockage hérité, personnellement, je pense qu'il est préférable de simplement migrer les données vers un stockage étendu et de les utiliser à la place car le stockage hérité peut cesser de fonctionner sans avertissement.

Zaffy
la source
1
Merci, @Zaffy, c'est exactement la réponse que je cherchais. Cela fonctionne parfaitement et il n'est pas nécessaire de demander un "accès au stockage".
gregko