Explorateur de fichier

Résolu/Fermé
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 - 28 août 2021 à 00:27
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 - 29 août 2021 à 23:50
Bonjour, à tous,
je suis en train de faire une petite application qui permet de naviguer dans les dossier du téléphone ou de la tablette. Pour cela j'utilise la class File et j'affiche les résultat dans un adaptateur personnalisé sous forme de GridView ou listView en fonction du choix de l'utilisateur.
Si je rencontre un dossier, j'affiche une icône de dossier avec le nom du répertoire. Si je tombe sur un fichier, j'affiche une icône en fonction du type de fichier avec le nom du fichier.

Tout ce que j'ai fait jusque la fonctionne très bien. La ou ça ce gatte, c'est que je me suis dis qu'il serai mieux plutôt que d'afficher une icône pour les images ou les vidéos, d'afficher un aperçu.

Je me suis donc dis que j'allais prendre mon image d'origine et créer une mini image pour m'en servir d’aperçu. comme cela:

Bitmapimage = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(monImage.getPath()), 150, 150);
 monImageView.setImageBitmap(image);


cette méthode fonctionne très bien lorsque dans le dossier parcouru il n'y a que 2 ou 3 images. Lorsqu'il y en à des centaines comme dans la galerie, le code plante car il est beaucoup top long à s'exécuter.

Existe t-il une solution pour obtenir une image miniature pour chaque images d'un dossier afin d'en faire un aperçu?

Sinon je sais que l'on peu lister les image contenues dans la galerie comme ceci
private void parcourirGalerie()
    {
        ActivityResultLauncher<Intent> launchSomeActivity = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>()
        {
            @Override
            public void onActivityResult(ActivityResult result)
            {
                if(result.getResultCode() == Activity.RESULT_OK)
                {
                    Uri imageSelectionnee = result.getData().getData();
                    String projection[] = {MediaStore.Images.Media.DATA};

                    Cursor cursor = getContentResolver().query(imageSelectionnee, projection, null, null, null);
                    cursor.moveToFirst();
                    int indexColonne = cursor.getColumnIndex(projection[0]);
                    String cheminImage = cursor.getString(indexColonne);
                    cursor.close();

                    Bitmap image = BitmapFactory.decodeFile(cheminImage);
                    imageView.setImageBitmap(image);
                }
                else
                {
                    Toast.makeText(getApplicationContext(), "Aucune image séléctionée", Toast.LENGTH_LONG).show();
                }
            }
        });
        bouton_parcourir_galerie.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                Intent gallerieIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                launchSomeActivity.launch(gallerieIntent);
            }
        });
    }


Est il possible d'utiliser un procédé similaire pour parcourir les dossiers?

Merci d'avance

Configuration: Linux / Firefox 91.0
A voir également:

3 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 28 août 2021 à 22:12
C'est bon j'ai trouvé la solution pour parcourir mes dossier à l'aide d'un intent. il suffit de remplacer la ligne 33 de la fonction "parcourirGalerie()" par:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);


Ceci dis, lors de l’exécution du onclick, j’atterris dans le dossier Téléchargement par défaut. J'aurais aimé partir du dossier racine. Il ne m'est pas non plus possible de changer de répertoire. Je vais continuer à fouiller, il dois bien y avoir un parametre qui permet de faire ce que je souhaite. Ou peut être est ce encore une histoire d'autorisation.

par contre je cherche toujours une solution permettant obtenir une image miniature afin d'afficher un aperçu des images contenue dans un dossier sans que cela ne prenne un temps monstre.

Merci.
0
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2
Modifié le 29 août 2021 à 01:23
Bien j'avance un peu en rajoutant ceci je parviens à lancer l'exploration a partir du dossier que je souhaite

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uriToLoad); // uriToLoad = Uri.fromFile(racine_SD_file)


Mais voila, cela ne fonctionne que sur l’émulateur android-studio; Sur un téléphone je rest bloquer dans le dossier Téléchargement.
Je pense a un problème d'autorisations. Ceci dit j'arrive à naviguer sans problème dans mes dossier avec un objet File?? A suivre.

Je suis pas loin, je vais y arriver lol
0
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2
29 août 2021 à 23:50
Bon, voici ce que j'ai finalement fais et qui fonctionne pour naviguer dans les dossier du téléphone:

private void parcourirDossier()
{
    // retour demande
    ActivityResultLauncher<Intent> launchSomeActivity2 = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>()
    {
        @Override
        public void onActivityResult(ActivityResult result)
        {
            if (result.getResultCode() == Activity.RESULT_OK)
            {
               if(result.getData() != null)
                {
                    if(result.getData().getClipData() != null)
                    {
                        for(int i=0; i<result.getData().getClipData().getItemCount(); i++)
                        {
                            Uri uri = result.getData().getClipData().getItemAt(i).getUri();

                            String projection[] = {MediaStore.Images.Media.DATA};

                            Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
                            cursor.moveToFirst();
                            int indexColonne = cursor.getColumnIndex(projection[0]);
                            String chemin_absolu_fichier = cursor.getString(indexColonne);
                            cursor.close();
                            Log.e("chemin_absolu => ", chemin_absolu_fichier);
                        }
                    }
                }
            }
        }
    });

    bouton_parcourirDossier.setOnClickListener(new View.OnClickListener()
    {
        @Override
         public void onClick(View view)
        {
            // on indique que l'on souhaite utiliser l'explorateur de fichier
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            // on indique le type de fichier
            intent.setType("*/*"); // tout les fichiers
            //on masque les fichiers que l'on ne peu pas ouvrir
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            // permet la séléction multiple
            intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
            Intent i = Intent.createChooser(intent, "Choisisr fichier");
            //on lance la demande
            try
            {
                launchSomeActivity2.launch(i);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    });
}


Voila j’espère que c'est la bonne façon de faire. Et j’espère que ça épargnera à d'autres de nombreuse heures de recherche à essayer de comprendre la doc.
0