web-dev-qa-db-fra.com

Android sélecteur de fichiers

Je veux faire un uploader de fichier. Et j'ai donc besoin d'un sélecteur de fichier mais je ne veux pas l'écrire 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, y a-t-il un meilleur moyen d'inclure un gestionnaire de fichiers dans mon application? Merci

108
Bear

EDIT ( 02 janv. 2012 ):

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

Vous pouvez le trouver sur GitHub: aFileChooser .


ORIGINAL

Si vous souhaitez que l'utilisateur puisse choisir n'importe quel fichier du système, vous devez inclure votre propre gestionnaire de fichiers ou lui conseiller de le télécharger. Je crois que le mieux que vous puissiez faire est de chercher du contenu "pouvant être ouvert" dans une Intent.createChooser() comme ceci:

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 devriez alors écouter le fichier sélectionné Uri dans onActivityResult() comme suit:

@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 méthode getPath() dans mon FileUtils.Java est la suivante:

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;
} 
255
Paul Burke