Choisissez n'importe quel type de fichier via une intention dans Android

95

Je voudrais démarrer un intentchooser pour les applications qui peuvent renvoyer n'importe quel type de fichier

J'utilise actuellement (que j'ai copié à partir du code source de l'e-mail Android pour la pièce jointe)

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
Intent i = Intent.createChooser(intent, "File");
startActivityForResult(i, CHOOSE_FILE_REQUESTCODE);

Mais il ne montre que "Galerie" et "Lecteur de musique" sur mon Galaxy S2. Il y a un explorateur de fichiers sur cet appareil et je voudrais qu'il apparaisse dans la liste. Je voudrais également que l'application appareil photo apparaisse dans la liste, afin que l'utilisateur puisse prendre une photo et l'envoyer via mon application. Si j'installe le gestionnaire de fichiers Astro, il répondra également à cette intention. Mes clients sont uniquement propriétaires de Galaxy SII et je ne veux pas les forcer à installer le gestionnaire de fichiers Astro étant donné qu'ils disposent déjà d'un gestionnaire de fichiers basique mais suffisant.

Une idée de comment je pourrais y parvenir? Je suis presque sûr d'avoir déjà vu le gestionnaire de fichiers par défaut apparaître dans un tel menu pour choisir un fichier, mais je ne me souviens pas dans quelle application.

ErGo_404
la source
Vous aurez besoin d'un code très différent pour prendre une photo puis pour choisir un fichier. Je ne pense pas que la plupart des explorateurs de fichiers puissent renvoyer un fichier, mais je me trompe peut-être.
dtech
pouvez-vous spécifier le type de fichiers dont vous avez besoin pour accéder principalement?
subrussn90
1
@dtech: Je ne m'attends pas à ce que l'explorateur de fichiers renvoie le fichier, je n'ai besoin que de son chemin.
ErGo_404
@ subrussn90: Je dois laisser l'utilisateur choisir n'importe quel type de fichier. Cela peut être pdfs, .doc, .zip, TOUT type de fichier.
ErGo_404
suffit-il que vous obteniez l'URI du fichier spécifié sur la carte SD ???
subrussn90

Réponses:

88

Pas pour l'appareil photo mais pour d'autres fichiers.

Dans mon appareil, j'ai ES File Explorerinstallé et cette chose fonctionne simplement dans mon cas.

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
user370305
la source
5
Il fonctionne avec un explorateur de fichiers externe (tel que ES File Explorer ou Astro File Manager, mais pas avec l'explorateur de fichiers Samsung. Il semble étrange qu'ils n'aient pas mis en œuvre les filtres d'intention appropriés pour répondre à cette action.
ErGo_404
@Lukap - Utilisez le gestionnaire de fichiers Android open source et intégrez-le à votre application, vous n'avez alors besoin d'aucune application tierce.
user370305
2
comment puis-je obtenir le fichier sélectionné? Je suppose que c'est le chemin, mais comment?
Francisco Corrales Morales
1
@FranciscoCorralesMorales - in onActivityResult()- Vous pouvez obtenir Uridu fichier.
user370305
1
PICKFILE_RESULT_CODEdevrait être PICKFILE_REQUEST_CODE.
Aron Lorincz
50

L'explorateur de fichiers Samsung a besoin non seulement d'une action personnalisée ( com.sec.android.app.myfiles.PICK_DATA ), mais également d'une partie de catégorie (Intent. CATEGORY_DEFAULT ) et de type mime doit être passé en supplément.

Intent intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
intent.putExtra("CONTENT_TYPE", "*/*");
intent.addCategory(Intent.CATEGORY_DEFAULT);

Vous pouvez également utiliser cette action pour ouvrir plusieurs fichiers: com.sec.android.app.myfiles.PICK_DATA_MULTIPLE Quoi qu'il en soit, voici ma solution qui fonctionne sur Samsung et d'autres appareils:

public void openFile(String mimeType) {

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType(mimeType);
        intent.addCategory(Intent.CATEGORY_OPENABLE);

        // special intent for Samsung file manager
        Intent sIntent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
         // if you want any file type, you can skip next line 
        sIntent.putExtra("CONTENT_TYPE", mimeType); 
        sIntent.addCategory(Intent.CATEGORY_DEFAULT);

        Intent chooserIntent;
        if (getPackageManager().resolveActivity(sIntent, 0) != null){
            // it is device with Samsung file manager
            chooserIntent = Intent.createChooser(sIntent, "Open file");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { intent});
        } else {
            chooserIntent = Intent.createChooser(intent, "Open file");
        }

        try {
            startActivityForResult(chooserIntent, CHOOSE_FILE_REQUESTCODE);
        } catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(getApplicationContext(), "No suitable File Manager was found.", Toast.LENGTH_SHORT).show();
        }
    }

Cette solution fonctionne bien pour moi et sera peut-être utile pour quelqu'un d'autre.

Chupik
la source
Cela fonctionne presque pour moi, sauf le fait que sIntent, une fois lancé, n'accepte aucun fichier d'aucun type. Je peux parcourir les dossiers, mais c'est tout.
Radu
Le problème est que l'intention doit avoir mimeType: "file / *", tandis que le Samsung sIntent a besoin de "* / *" - sans les espaces entre * / *
Radu
1
Qu'en est-il des 11k autres appareils Android.
Oliver Dixon
1
Comment définir l'URI pour cette intention pouvez-vous s'il vous plaît m'aider?
PriyankaChauhan
1
Dans le cas de Samsung Intent ("com.sec.android.app.myfiles.PICK_DATA"), vous pouvez essayer de mettre String supplémentaire "FOLDERPATH" ou "START_FOLDER"
Chupik
41

ce travail pour moi sur la galaxie note ses contacts de spectacle, les gestionnaires de fichiers installés sur l'appareil, la galerie, le lecteur de musique

private void openFile(Int  CODE) {
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.setType("*/*");
    startActivityForResult(intent, CODE);
}

voici le chemin onActivityResultde l'activité.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     String Fpath = data.getDataString();
    // do somthing...
    super.onActivityResult(requestCode, resultCode, data);

}
Alireza
la source
6
Comment convertir get uri en util.File?
Anand Savjani
Je ne suis pas sûr d'obtenir java.io.File, mais peut être ouvert avec: developer.android.com/reference/android/content/... Comment obtenir un nom simple est ici: stackoverflow.com/a/23270545/755313
demaksee
3
comment choisir un dossier?
hornet2319
6

Cela me donne le meilleur résultat:

    Intent intent;
    if (android.os.Build.MANUFACTURER.equalsIgnoreCase("samsung")) {
        intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
        intent.putExtra("CONTENT_TYPE", "*/*");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
    } else {

        String[] mimeTypes =
                {"application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .doc & .docx
                        "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation", // .ppt & .pptx
                        "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // .xls & .xlsx
                        "text/plain",
                        "application/pdf",
                        "application/zip", "application/vnd.android.package-archive"};

        intent = new Intent(Intent.ACTION_GET_CONTENT); // or ACTION_OPEN_DOCUMENT
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
    }
Islam Khaled
la source
Pouvez-vous partager votre onActivityResultCode @Islam Khaled
Kishan Donga
1
Voir aussi org.openintents.action.PICK_FILE pour une troisième option. openintents.org/action/org-openintents-action-pick-file Votre code suppose également que tout le monde sur un téléphone Samsung utilise et possède (toujours) le gestionnaire de fichiers Samsung. Utiliser intent.resolveActivity avec Samsung comme solution de secours serait plus robuste.
Marcus Wolschon
1

Il s'avère que l'explorateur de fichiers Samsung utilise une action personnalisée. C'est pourquoi je pouvais voir l'explorateur de fichiers Samsung lors de la recherche d'un fichier à partir des applications Samsung, mais pas de la mienne.

L'action est "com.sec.android.app.myfiles.PICK_DATA"

J'ai créé un sélecteur d'activité personnalisé qui affiche les activités filtrant les deux intentions.

ErGo_404
la source
Salut, pouvez-vous expliquer cela un peu plus? Pour les téléphones Samsung Galaxy, j'utilise Intent selectFile = new Intent ("com.sec.android.app.myfiles.PICK_DATA"); mais cela provoque une erreur
steliosf
Je ne suis pas sûr pour le moment, mais je peux le vérifier plus tard. Je pense que c'est l'exception Activity Not Found. Avez-vous une solution de travail? J'ai presque tout essayé et je n'ai pas réussi à le réparer
steliosf
Cette intention a fonctionné pour moi sur le Galaxy SII. Je l'ai essayé sur un GT-B5510 (Galaxy Y Pro) et cela n'a pas fonctionné. Je pense que ce n'est tout simplement pas fiable si vous souhaitez cibler tous les appareils Samsung. J'ai fini par intégrer un gestionnaire de fichiers open source dans mon application, mais c'est une solution lourde pour un besoin aussi basique.
ErGo_404
Comment définir l'URI pour cette intention pouvez-vous s'il vous plaît m'aider?
PriyankaChauhan
0

Si vous voulez savoir cela, il existe une bibliothèque open source appelée aFileDialog qu'il s'agit d'un petit et facile à utiliser qui fournit un sélecteur de fichiers.

La différence avec les bibliothèques d'un autre sélecteur de fichiers pour Android est que aFileDialog vous donne la possibilité d'ouvrir le sélecteur de fichiers en tant que boîte de dialogue et en tant qu'activité.

Il vous permet également de sélectionner des dossiers, de créer des fichiers, de filtrer des fichiers à l'aide d'expressions régulières et d'afficher des boîtes de dialogue de confirmation.

danigonlinea
la source
0

Les autres réponses ne sont pas incorrectes. Cependant, il existe maintenant plus d'options pour ouvrir les fichiers. Par exemple, si vous souhaitez que l'application dispose d'un accès permanent à long terme à un fichier, vous pouvez utiliser à la ACTION_OPEN_DOCUMENTplace. Reportez-vous à la documentation officielle: Ouvrez les fichiers à l'aide du cadre d'accès au stockage . Reportez- vous également à cette réponse .

Miloš Černilovský
la source