Sélecteur de fichier Android

Je veux faire un uploader un 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? THX

EDIT ( 02 janv. 2012 ):

J’ai créé un petit projet de bibliothèque Android open source qui rationalise ce processus, tout en fournissant un explorateur de fichiers intégré (au cas où l’utilisateur n’en aurait pas). Il 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 devrez inclure votre propre gestionnaire de fichiers ou conseiller à l’utilisateur de télécharger un fichier. Je pense que le mieux que vous puissiez faire est de rechercher le contenu ” Intent.createChooser() ” dans 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 l’ Uri du fichier sélectionné dans 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.toSsortingng()); // Get the path Ssortingng 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() de mon FileUtils.java est la suivante:

 public static Ssortingng getPath(Context context, Uri uri) throws URISyntaxException { if ("content".equalsIgnoreCase(uri.getScheme())) { Ssortingng[] 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.getSsortingng(column_index); } } catch (Exception e) { // Eat it } } else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } 

Le navigateur de fichiers Android m’a beaucoup aidé. C’est facile et utile.

J’ai utilisé AndExplorer à cette fin et ma solution consiste à afficher une boîte de dialog puis à redirect sur le marché pour installer l’application manquante:

Mon startCreation essaie d’appeler un sélecteur de fichier / répertoire 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.ssortingng.andex_file_selection_title)); intent.putExtra("browser_title_background_color", getText(R.ssortingng.browser_title_background_color)); intent.putExtra("browser_title_foreground_color", getText(R.ssortingng.browser_title_foreground_color)); intent.putExtra("browser_list_background_color", getText(R.ssortingng.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.ssortingng.error_install_andexplorer); } catch (Exception e) { Log.w(TAG, e.getMessage()); } } 

Ce methos est juste prendre un dialog 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.ssortingng.button_ok), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); dialog.setButton2(getText(R.ssortingng.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(); }