Parcourir la carte SD

Résolu/Fermé
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 - Modifié le 26 juil. 2021 à 09:49
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 - 20 août 2021 à 06:42
Bonjour, tout le monde
je souhaiterais parcourir les dossier et fichier contenu dans la car SD, mais toute mes tentative restent vaines.

voici mon code:

String carte_SD = new String(Environment.getExternalStorageState());

if(carte_SD.equals(Environment.MEDIA_MOUNTED))
{
    File racine_Sd = Environment.getExternalStorageDirectory().getAbsoluteFile();
    File[] liste_racine_sd = racine_Sd.listFiles();

    Log.i("TAG", "-------------------------------------------------------------------------------------------------------------------------");
    Log.i("TAG", "racine_SD => "+racine_Sd.getAbsolutePath()); // retourne racine_SD => /storage/emulated/0
    Log.i("TAG", "-------------------------------------------------------------------------------------------------------------------------");

    if(liste_racine_sd == null) // est toujour null
    {
         Log.i("TAG", "-------------------------------------------------------------------------------------------------------------------------");
         Log.i("TAG", "le tableau est null");
         Log.i("TAG", "-------------------------------------------------------------------------------------------------------------------------");
    }
    else
    {
         Log.i("TAG", "-------------------------------------------------------------------------------------------------------------------------");
         Log.i("TAG", "le tableau n'est pas null");
         Log.i("TAG", "taille_tableau => "+liste_racine_sd.length);
         Log.i("TAG", "-------------------------------------------------------------------------------------------------------------------------");
     }
}


Dans mon manifest, j'ai bien mis les instructions:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


Du coup si quelqu'un sait ce qu'il ne vas pas, je lui serai très reconnaissant de m'indiquer la marche à suivre. Merci

Configuration: Linux / Firefox 90.0

6 réponses

lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2
Modifié le 25 juil. 2021 à 19:36
Bon en fait, je me suit rendu compte que sur l’émulateur d'android studio ça fonctionne, c'est sur mon tel que ça bloc. Peu être un problème d'autorisation.
Juste pour info
racine_Sd.getAbsolutePath()
sur l'émulateur retourne
/storage/sdcard
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
26 juil. 2021 à 09:49
Hello,

Peu être un problème d'autorisation.
C'est ce que j'allais dire. Tu testes sur quelle version d'Android ? Depuis 10, l'accès à la carte SD est très fortement limité/sécurisé.
0
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2
26 juil. 2021 à 18:48
Bonjour Bruno, je suis la version 10 justement. Après avoir fais d'autres essais, lorsque je test le contenu du répertoire de mon application (/storage/emulated/0/Android/data/fr.testfile/files) avec listFile.length, mon tableau n'est plus null mais = 0 alors que j'y ai mis 3 photos pour mes test en faisant un copier coller depuis le répertoire DCIM.

Ceci dis, il est vrai que lorsque que l'on installe une nouvelle application et que cette dernière doit accéder à certains répertoires, android nous demande si l'on autorise l'application à accéder au dossier et fichier en question.

Donc comment faire dans le cas ou je souhaite accéder aux photos de la carte sd ou même sur l'appareil lui même?
Peut etre modifier le CHMOD et ou ajouter l'application à un groupe d'utilisateur?
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
27 juil. 2021 à 09:04
Hello,

Voici un très bon article sur l'accès aux fichiers.
https://medium.com/androiddevelopers/scope-storage-myths-ca6a97d7ff37
C'est en Anglais, certes, mais le meilleur que j'ai trouvé pour l'instant qui explique les changements avec les dernières versions d'Android
0
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2 > BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024
27 juil. 2021 à 21:28
Merci Bruno je vais m'y pancher des que possible. Je ferais un retour dans la semaine, le temps de faire quelques tests
0
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2
26 juil. 2021 à 20:20
Bien j'ai trouvé une piste ici:
https://developer.android.com/training/camera/photobasics.html#java

il semble que la methode
getExternalFilesDir(repertoire)
fonctionne
0
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2
7 août 2021 à 16:47
Bien voila malgré tout les tuto que j'ai pu trouver, je ne parviens pas à accéder au fichier de la carte SD ni même de la mémoire interne. en revanche j'ai une tablette sous android 7 ou tout fonctionne sans problème. Si quelqu'un sait comment accéder aux répertoires sur android 10 et 11, je suis preneur. Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2
20 août 2021 à 06:42
Bien j'ai trouvé la solution, si d'autre passent par là en aillant le même souci, voici comment faire:
Premièrement, il faut que votre application soit autorisé à accéder aux dossiers. Pour cela, soit vous allez dans les paramètres du téléphone pour donner manuellement les autorisation nécessaire a votre application, mais c'est pas top, soit il faut demander l'autorisation à l'utilisateur comme ceci:

package fr.testfile;

import android.Manifest;
import android.appwidget.AppWidgetProviderInfo;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;

import android.os.Environment;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.google.android.material.snackbar.Snackbar;

import java.io.File;

public class TestFileMain extends AppCompatActivity
{
    public static final int PICK_IMAGE = 1;
    private AppWidgetProviderInfo Android;
    private LinearLayout linear_layout,
                         activity;

    /**
     * on verifie si l'utilisateur à accepté ou no l'autorisation
     */

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
    {
        if (requestCode == 2)
        {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                // si l'autorisation à été accodée par l'utilisateur, on on fait ce qu'on à faire;
            }
            else if (shouldShowRequestPermissionRationale(permissions[0]) == false)
            {
                refus_permissions_utilisateur();
            }
            else
            {
                expliquer();
            }
        }

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }


    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        LayoutInflater inflater = getLayoutInflater();
        LinearLayout activity = (LinearLayout) inflater.inflate(R.layout.test_file_linearlayout_activity_main, null);
        ImageView images = (ImageView) activity.findViewById(R.id.image_view);
        String carte_SD = new String(Environment.getExternalStorageState());
        String separator = File.separator;
        linear_layout = activity.findViewById(R.id.linear_layout);

        //setContentView(activity);
        //linear_layout = findViewById(R.id.linear_layout);


        /**
         * demande autorisation acces dossier sensible
         */

        if(ActivityCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
        {
            // on test si la permission à deja été demandéeà l'utilisateur
            if(shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE) == true)
            {
                //si elle à deja été demandée, on explique pourquoi l'autorisation est nécésaire
                expliquer();
            }
            else
            {
                //sinon on demande l'autorisation
                demander_la_permission();
            }
        }
        else
        {
            // on à l'autorisation on peu donc naviguer dans les dossiers
        }





        File intern_dcim = getFilesDir()/*new File(separator)*/;
        File liste_intern[] = intern_dcim.listFiles();


        if(carte_SD.equals(Environment.MEDIA_MOUNTED))
        {
            File racine_Sd = Environment.getExternalStorageDirectory().getAbsoluteFile(),
                 dossier_application = getExternalFilesDir(null),
                 racine_phone = getFilesDir() /*new File(separator)*/,
                 dcim = getExternalFilesDir(racine_Sd.getAbsolutePath()+"/DCIM/Camera") /*new File(racine_Sd.getAbsolutePath()+"/DCIM/Camera")*/,
                 shanice = getExternalFilesDir(dossier_application.getAbsolutePath()+"/shanice.jpg"); //new File(dossier_application.getAbsolutePath()+"/shanice.jpg");

            File[] liste_racine_sd = racine_Sd.listFiles(),
                   liste_racine_phone = racine_phone.listFiles(),
                   liste_dossier_application = dossier_application.listFiles(),
                   list_dcim = dcim.listFiles();
        }
        else
        {
            Log.i("TAG", "-------------------------------------------------------------------------------------------------------------------------");
            Log.i("TAG", "Pas de carte SD");
            Log.i("TAG", "-------------------------------------------------------------------------------------------------------------------------");
        }


        setContentView(activity); // pour que snackBar fonctionne il faut bien mettre l'activité inflater "activity" et non "R.layout.monLayout"
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    private void demander_la_permission()
    {
        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 2);
    }

    private void expliquer()
    {
        Snackbar customSnackBar = Snackbar.make(linear_layout, "Permission nécéssaire pour acceder aux images",Snackbar.LENGTH_INDEFINITE);

        customSnackBar.setAction("Parametrer", new View.OnClickListener()
        {
            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onClick(View v)
            {
                //demander l'autorisation
                demander_la_permission();
            }});
        customSnackBar.setActionTextColor(Color.YELLOW);
        View sbView = customSnackBar.getView();
        sbView.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.purple_200));
        customSnackBar.show();
    }

    private void refus_permissions_utilisateur()
    {
        Snackbar.make(linear_layout, "Cette Fonction nécéssite une autorisation pour accéder à vos images", Snackbar.LENGTH_LONG).setAction("Parametres", new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                final Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                final Uri uri = Uri.fromParts("package", getPackageName(), null);
                intent.setData(uri);
                startActivity(intent);
            }
        }).show();
    }
}


Pour les autorisations, je me suis inspiré de ce tuto: https://blog.rolandl.fr/2016-03-06-les-permissions-sous-android-3-slash-6-demander-une-permission-1-slash-2.html

et pour naviguer dans vos dossiers soit vous le faites via la File soit vous passez par l'application qui gère vos dossier ou photos comme la galerie. J'ai trouvé un tres bon tuto à ce sujet ici:
https://www.youtube.com/watch?v=M9JUdmx5OW4&ab_channel=Emds

voila, merci et à bientot.
0
nadellen Messages postés 12292 Date d'inscription mercredi 1 mai 2013 Statut Membre Dernière intervention 7 janvier 2024 6 657
24 juil. 2021 à 20:53
bonsoir je n'y connais rien en programation donc c'est mort
moi quand je veux savoir ce qu'il y a sur la carte, ou copier, supprimer, gérer des dossiers ou fichiers je la mets dans le lecteur adequat du pc et c'est tout...
pourquoi faire compliqué quand on peut faire simple lol
bon j'avoue, si ça fonctionne c'est que quelqu'un un jour a écrit des lignes de codes...
-1