Sélecteur de fichiers Android [fermé]

115

Je veux créer un téléchargeur de fichiers. Et j'ai donc besoin d'un sélecteur de fichiers, mais je ne veux pas écrire cela par moi-même. Je trouve le gestionnaire de fichiers OI et je pense que cela me convient. Mais comment puis-je forcer l'utilisateur à installer le gestionnaire de fichiers OI? Si je ne peux pas, existe-t-il un meilleur moyen d'inclure un gestionnaire de fichiers dans mon application? THX

Ours
la source

Réponses:

267

EDIT ( 02 janvier 2012 ):

J'ai créé un petit projet de bibliothèque Android open source qui rationalise ce processus, tout en fournissant également un explorateur de fichiers intégré (au cas où l'utilisateur n'en aurait pas). C'est extrêmement simple à utiliser, ne nécessitant que quelques lignes de code.

Vous pouvez le trouver sur GitHub: aFileChooser .


ORIGINAL

Si vous voulez que l'utilisateur puisse choisir n'importe quel fichier dans le système, vous devrez inclure votre propre gestionnaire de fichiers ou conseiller à l'utilisateur d'en télécharger un. Je pense que le mieux que vous puissiez faire est de rechercher un contenu "ouvrable" Intent.createChooser()comme celui-ci:

private static final int FILE_SELECT_CODE = 0;

private void showFileChooser() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("*/*"); 
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    try {
        startActivityForResult(
                Intent.createChooser(intent, "Select a File to Upload"),
                FILE_SELECT_CODE);
    } catch (android.content.ActivityNotFoundException ex) {
        // Potentially direct the user to the Market with a Dialog
        Toast.makeText(this, "Please install a File Manager.", 
                Toast.LENGTH_SHORT).show();
    }
}

Vous pouvez ensuite écouter le fichier sélectionné est Uridans onActivityResult()comme ceci:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case FILE_SELECT_CODE:
        if (resultCode == RESULT_OK) {
            // Get the Uri of the selected file 
            Uri uri = data.getData();
            Log.d(TAG, "File Uri: " + uri.toString());
            // Get the path
            String path = FileUtils.getPath(this, uri);
            Log.d(TAG, "File Path: " + path);
            // Get the file instance
            // File file = new File(path);
            // Initiate the upload
        }
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

La getPath()méthode dans mon FileUtils.javaest:

public static String getPath(Context context, Uri uri) throws URISyntaxException {
    if ("content".equalsIgnoreCase(uri.getScheme())) {
        String[] projection = { "_data" };
        Cursor cursor = null;

        try {
            cursor = context.getContentResolver().query(uri, projection, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow("_data");
            if (cursor.moveToFirst()) {
                return cursor.getString(column_index);
            }
        } catch (Exception e) {
            // Eat it
        }
    }
    else if ("file".equalsIgnoreCase(uri.getScheme())) {
        return uri.getPath();
    }

    return null;
} 
Paul Burke
la source
1
J'irais même jusqu'à les diriger également vers des applications sur le marché.
Kurtis Nusbaum
2
Mais je ne trouve pas FileUtils ....
Ours
2
@Bicou Merci pour la note. Votre coup de coude m'a aidé à arrêter d'être paresseux et à faire quelques changements mineurs. :-) Je viens de pousser une mise à jour de la bibliothèque qui comprend la licence.
Paul Burke
22
Cette réponse ne considère pas l'URI comme ceci: "content: //com.android.providers.media.documents/document/image: 62".
wangqi060934
2
@ wangqi060934: comment avez-vous réussi à travailler avec un tel uri? veuillez partager votre expérience pour atteindre la fonctionnalité
Mehul Joisar
-3

J'ai utilisé AndExplorer à cet effet et ma solution est de faire apparaître une boîte de dialogue puis de rediriger sur le marché pour installer l'application manquante:

Mon startCreation essaie d'appeler un sélecteur de fichiers / répertoires externe. S'il manque, appelez la fonction installResultMessage.

private void startCreation(){
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_PICK);
    Uri startDir = Uri.fromFile(new File("/sdcard"));

    intent.setDataAndType(startDir,
            "vnd.android.cursor.dir/lysesoft.andexplorer.file");
    intent.putExtra("browser_filter_extension_whitelist", "*.csv");
    intent.putExtra("explorer_title", getText(R.string.andex_file_selection_title));
    intent.putExtra("browser_title_background_color",
            getText(R.string.browser_title_background_color));
    intent.putExtra("browser_title_foreground_color",
            getText(R.string.browser_title_foreground_color));
    intent.putExtra("browser_list_background_color",
            getText(R.string.browser_list_background_color));
    intent.putExtra("browser_list_fontscale", "120%");
    intent.putExtra("browser_list_layout", "2");

    try{
         ApplicationInfo info = getPackageManager()
                                 .getApplicationInfo("lysesoft.andexplorer", 0 );

            startActivityForResult(intent, PICK_REQUEST_CODE);
    } catch( PackageManager.NameNotFoundException e ){
        showInstallResultMessage(R.string.error_install_andexplorer);
    } catch (Exception e) {
        Log.w(TAG, e.getMessage());
    }
}

Ce methos est juste de prendre une boîte de dialogue et si l'utilisateur veut installer l'application externe du marché

private void showInstallResultMessage(int msg_id) {
    AlertDialog dialog = new AlertDialog.Builder(this).create();
    dialog.setMessage(getText(msg_id));
    dialog.setButton(getText(R.string.button_ok),
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            });
    dialog.setButton2(getText(R.string.button_install),
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse("market://details?id=lysesoft.andexplorer"));
                    startActivity(intent);
                    finish();
                }
            });
    dialog.show();
}
Andep
la source
Donc, l'une des exigences pour les utilisateurs de votre application est ... d'installer AndExplorer?!
Phantômaxx