112 votes

Choisir n'importe quel type de fichier par le biais d'une intention dans Android

J'aimerais créer un sélecteur d'intention pour les applications qui peut renvoyer n'importe quel type de fichier.

Actuellement, j'utilise (ce que j'ai copié du code source de l'email Android pour l'attachement de fichiers)

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 n'affiche que "Galerie" et "Lecteur de musique" sur mon Galaxy S2. Il y a un explorateur de fichiers sur cet appareil et j'aimerais qu'il apparaisse dans la liste. J'aimerais é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 ne possèdent que des 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 la manière dont 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 plus dans quelle application.

95voto

user370305 Points 46287

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

Dans mon dispositif, j'ai ES File Explorer installé et cette simple chose fonctionne dans mon cas .

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);

55voto

Chupik Points 826

L'explorateur de fichiers Samsung a besoin non seulement d'actions personnalisées ( com.sec.Android.app.myfiles.PICK_DATA ), mais aussi la partie catégorie (Intent. CATÉGORIE_DÉFAUT ) et le type de mime doivent être transmis en tant qu'éléments supplémentaires.

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 à quelqu'un d'autre.

45voto

alireza Points 431

Je n'ai pas de problème avec l'utilisation d'un téléphone portable. il affiche contacts, les gestionnaires de fichiers installés sur l'appareil, galerie, lecteur de musique

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

ici obtenir le chemin dans onActivityResult d'activité.

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

}

15voto

Islam Khaled Points 141

Cela me permet d'obtenir 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);
    }

1voto

ErGo_404 Points 1681

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 lorsque je cherchais un fichier à partir des applications Samsung, mais pas à partir des miennes.

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

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

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