web-dev-qa-db-fra.com

Comment lire ou écrire un fichier car getExternalStorageDirectory est déconseillé dans l'API 29?

Je suis nouveau en Android et je suis confronté à un problème pour lire getExternalStorageDirectory en Java, j'ai lu https://developer.Android.com/reference/Android/os/ Environnement mais ne peut pas comprendre, quelqu'un peut-il m'aider avec un exemple de code en Java.

9
Mujahid khan

Depuis docs vous pouvez voir:

getExternalStoragePublicDirectory(String type)

Cette méthode a été déconseillée au niveau de l'API 29. Pour améliorer la confidentialité des utilisateurs, l'accès direct aux périphériques de stockage partagés/externes est déconseillé. Lorsqu'une application cible Build.VERSION_CODES.Q, le chemin renvoyé par cette méthode n'est plus directement accessible aux applications. Les applications peuvent continuer à accéder au contenu stocké sur un stockage partagé/externe en migrant vers des alternatives telles que Context # getExternalFilesDir (String), MediaStore ou Intent # ACTION_OPEN_DOCUMENT.

Ne passez rien en paramètre à cette fonction pour obtenir votre répertoire en tant qu'objet File:

context.getExternalFilesDir();

Ici "Context" est un objet qui est obtenu par this.getContext();

this est l'objet actuel de l'activité. Vérifiez soigneusement la portée lors de son utilisation.

Important

Pour accéder au stockage interne, Manifest.permission.WRITE_EXTERNAL_STORAGE et/ou Manifest.permission.READ_EXTERNAL_STORAGE sont requis dans le fichier AndroidManifest.xml .

Information optionnelle:

  1. Habituellement, le stockage interne a le chemin/sdcard/on Android. Ce n'est pas un vrai chemin mais un lien symbolique .

  2. C'est déroutant mais "carte SD externe" dans Android signifie en fait le stockage de l'appareil interne et non le stockage de carte mémoire externe éjectable hors de l'appareil. Notez également que la vraie carte SD externe ne peut pas être complètement accès

  3. Activité classe étend la classe Context C'est pourquoi nous pouvons en tirer le contexte.

10
Crazo7924

Utilisez cette méthode statique. Actuellement, je ne trouve aucun moyen légal de le faire. Donc, on m'a fait cette méthode statique pour obtenir le chemin du fichier racine ou getAbsolutePath.

public static File getAbsoluteDir(Context ctx, String optionalPath) {
        String rootPath;
        if (optionalPath != null && !optionalPath.equals("")) {
            rootPath = ctx.getExternalFilesDir(optionalPath).getAbsolutePath();
        } else {
            rootPath = ctx.getExternalFilesDir(null).getAbsolutePath();
        }
        // extraPortion is extra part of file path
        String extraPortion = "Android/data/" + BuildConfig.APPLICATION_ID
                + File.separator + "files" + File.separator;
        // Remove extraPortion
        rootPath = rootPath.replace(extraPortion, "");
        return new File(rootPath);
    }
1
Neeraj Dhameliya

Réponse courte:

String path = getContext().getExternalFilesDir(null).getAbsolutePath();
0
Kuvonchbek Yakubov