Je pensais que ce serait facile, mais malheureusement, ce n’est pas le cas.
Ce que j'ai:
J'ai un dossier appelé "myFolder" sur mon stockage externe (pas une carte SD car c'est un Nexus 4, mais cela ne devrait pas être le problème). Le dossier contient des fichiers *.csv
.
Ce que je veux:
Je veux écrire une méthode qui permet: d’afficher une variété d’applications (navigateurs de fichiers) parmi lesquelles je peux en choisir une (voir la photo). Après avoir cliqué dessus, le navigateur de fichiers sélectionné doit démarrer et me montrer le contenu de "myFolder". Ni plus ni moins.
Ma question:
Comment je fais exactement ça? Je pense que je suis venu assez près avec le code suivant, mais peu importe ce que je fais - et je suis certain qu'il doit y avoir quelque chose que je n'ai pas encore compris - il ouvre toujours uniquement 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);
}
J'ai finalement réussi à le faire fonctionner. De cette manière, 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 parce qu'ils ne peuvent pas accéder au stockage externe). L'autre type 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"));
}
Cela devrait fonctionner:
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
}
S'il vous plaît, assurez-vous que vous avez une application de fichier Explorer installée sur votre appareil.
EDIT: ajout d'une recommandation de shantanu à partir du commentaire.
BIBLIOTHÈQUES: Vous pouvez également consulter ces bibliothèques de sélecteurs de fichiers/répertoires https://Android-arsenal.com/tag/35 si la solution actuelle ne vous aide pas .
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 définis "text/plain", Dropbox est ouvert. J'ai Dropbox, Google Drive installé. Si je désinstalle Dropbox, seul "*/*" fonctionne pour ouvrir le navigateur de fichiers. C'est Android 4.4.2. Je peux télécharger le contenu de Dropbox et pour Google Drive, par getContentResolver (). OpenInputStream (data.getData ()).
ce code fonctionnera avec OI File Manager:
File root = new File(Environment.getExternalStorageDirectory().getPath()
+ "/myFolder/");
Uri uri = Uri.fromFile(root);
Intent intent = new Intent();
intent.setAction(Android.content.Intent.ACTION_VIEW);
intent.setData(uri);
startActivityForResult(intent, 1);
vous pouvez obtenir le gestionnaire de fichiers OI ici: http://www.openintents.org/en/filemanager
Aujourd'hui, vous devriez représenter un dossier à l'aide de son contenu: URI obtenu à partir de Storage Access Framework, et son ouverture devrait être aussi simple que:
Intent i = new Intent(Intent.ACTION_VIEW, uri);
startActivity(i);
Hélas, l'application Fichiers contient actuellement un bogue qui provoque son blocage lorsque vous essayez d'utiliser le fournisseur de stockage externe. Les dossiers de fournisseurs tiers peuvent toutefois être affichés de cette manière.