90 votes

Android : Comment ouvrir un dossier spécifique via Intent et afficher son contenu dans un navigateur de fichiers ?

Je pensais que ce serait facile, mais ce n'est malheureusement pas le cas.

Ce que j'ai :

J'ai un dossier appelé "myFolder" sur mon stockage externe (pas la carte sd car il s'agit d'un Nexus 4, mais cela ne devrait pas être le problème). Le dossier contient quelques *.csv des dossiers.

Ce que je veux :

Je veux écrire une méthode qui fait ce qui suit : Afficher une variété d'applications (navigateurs de fichiers) parmi lesquelles je peux en choisir une (voir l'image). Après avoir cliqué dessus, le navigateur de fichiers sélectionné doit démarrer et m'afficher le contenu de "monDossier". Rien de plus, rien de moins.

enter image description here

Ma question :

Comment faire exactement ? Je pense que j'y suis arrivé avec le code suivant, mais quoi que je fasse - et je suis certain qu'il y a quelque chose que je n'ai pas encore compris - il n'ouvre toujours que le dossier principal du stockage externe.

public void openFolder()
{
File file = new File(Environment.getExternalStorageDirectory(),
    "myFolder");

Log.d("path", file.toString());

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setDataAndType(Uri.fromFile(file), "*/*");
startActivity(intent);
}

80voto

Ayaz Points 58

Cela devrait vous aider :

Uri selectedUri = Uri.parse(Environment.getExternalStorageDirectory() + "/myFolder/");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(selectedUri, "resource/folder");

if (intent.resolveActivityInfo(getPackageManager(), 0) != null)
{
    startActivity(intent);
}
else
{
    // if you reach this place, it means there is no any file 
    // explorer app installed on your device
}

Veillez à ce qu'une application d'exploration de fichiers soit installée sur votre appareil.

EDIT : ajout d'une recommandation de shantanu dans le commentaire.

BIBLIOTHÈQUES : Vous pouvez également consulter les bibliothèques suivantes https://Android-arsenal.com/tag/35 si la solution actuelle ne vous aide pas.

49voto

kaolick Points 529

J'ai finalement réussi à le faire fonctionner. De cette façon, seules quelques applications sont affichées par le sélecteur (Google Drive, Dropbox, Root Explorer, et Solid Explorer). Cela fonctionne bien avec les deux explorateurs mais pas avec Google Drive et Dropbox (je suppose que c'est parce qu'ils ne peuvent pas accéder au stockage externe). Les autres types MIME comme "*/*" est également possible.

public void openFolder(){
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()
         +  File.separator + "myFolder" + File.separator);
    intent.setDataAndType(uri, "text/csv");
    startActivity(Intent.createChooser(intent, "Open folder"));
}

4voto

Sudo Ajay Points 31

Voici ma réponse

private fun openFolder() {
    val location = "/storage/emulated/0/Download/";
    val intent = Intent(Intent.ACTION_VIEW)
    val myDir: Uri = FileProvider.getUriForFile(context, context.applicationContext.packageName + ".provider", File(location))
    intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        intent.setDataAndType(myDir,  DocumentsContract.Document.MIME_TYPE_DIR)
    else  intent.setDataAndType(myDir,  "*/*")

    if (intent.resolveActivityInfo(context.packageManager, 0) != null)
    {
        context.startActivity(intent)
    }
    else
    {
        // if you reach this place, it means there is no any file
        // explorer app installed on your device
        CustomToast.toastIt(context,context.getString(R.string.there_is_no_file_explorer_app_present_text))
    }
}

Voici pourquoi j'ai utilisé FileProvider - Android.os.FileUriExposedException : file:///storage/emulated/0/test.txt exposé au-delà de l'application à travers Intent.getData()

J'ai testé sur cet appareil
Appareils : Samsung SM-G950F (dreamltexx), Niveau API Os : 28

3voto

WayneSplatter Points 69
Intent chooser = new Intent(Intent.ACTION_GET_CONTENT);
Uri uri = Uri.parse(Environment.getDownloadCacheDirectory().getPath().toString());
chooser.addCategory(Intent.CATEGORY_OPENABLE);
chooser.setDataAndType(uri, "*/*");
// startActivity(chooser);
try {
startActivityForResult(chooser, SELECT_FILE);
}
catch (android.content.ActivityNotFoundException ex)
{
Toast.makeText(this, "Please install a File Manager.",
Toast.LENGTH_SHORT).show();
}

Dans le code ci-dessus, si setDataAndType est "*/*", un navigateur de fichiers intégré est ouvert pour sélectionner n'importe quel fichier, si je mets "text/plain", Dropbox est ouvert. J'ai installé Dropbox et Google Drive. Si je désinstalle Dropbox, seul "*/*" fonctionne pour ouvrir le navigateur de fichiers. Il s'agit d'Android 4.4.2. Je peux télécharger le contenu de Dropbox et de Google Drive en utilisant getContentResolver().openInputStream(data.getData()).

3voto

Jackyto Points 393

Le sujet est ancien mais j'avais besoin de ce type de fonctionnalité dans mon application et j'ai trouvé un moyen de le faire, j'ai donc décidé de le poster si cela peut aider quelqu'un dans ma situation.

Comme notre parc d'appareils n'est composé que de Samsung Galaxy Tab 2, il m'a suffi de trouver le nom du paquet de l'explorateur de fichiers, de lui donner le bon chemin et j'ai pu ouvrir mon explorateur de fichiers là où je le souhaitais. J'aimerais pouvoir utiliser Intent.CATEGORY_APP_FILES mais elle n'est disponible que dans l'API 29.

  Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.sec.android.app.myfiles");
  Uri uri = Uri.parse(rootPath);
  if (intent != null) {
      intent.setData(uri);
      startActivity(intent);
  }

Comme je l'ai dit, c'était facile pour moi parce que nos clients ont le même appareil, mais cela peut aider d'autres personnes à trouver une solution pour leur propre situation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X