Selector de archivos de Android

Quiero hacer una carga de archivos. Y por eso necesito un selector de archivos, pero no quiero escribir esto solo. Encuentro el administrador de archivos OI y creo que me conviene. Pero, ¿cómo puedo obligar al usuario a instalar el administrador de archivos OI? Si no puedo, ¿hay alguna forma mejor de incluir un administrador de archivos en mi aplicación? Gracias

EDITAR ( 02 de enero de 2012 ):

Creé un pequeño proyecto de biblioteca de Android de código abierto que agiliza este proceso, al tiempo que proporciona un explorador de archivos integrado (en caso de que el usuario no tenga uno presente). Es extremadamente simple de usar y solo requiere unas pocas líneas de código.

Puedes encontrarlo en GitHub: aFileChooser .


ORIGINAL

Si desea que el usuario pueda elegir cualquier archivo en el sistema, deberá incluir su propio administrador de archivos o aconsejar al usuario que descargue uno. Creo que lo mejor que puedes hacer es buscar el contenido “que se puede abrir” en un Intent.createChooser() como este:

 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(); } } 

Luego, escucharía el onActivityResult() del archivo seleccionado en onActivityResult() así:

 @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); } 

El método getPath() en mi FileUtils.java es:

 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; } 

Android File Browser me ayudó mucho. Es fácil y útil.

Usé AndExplorer para este propósito y mi solución es abrir un cuadro de diálogo y luego redirigir en el mercado para instalar la aplicación de misssing:

My startCreation está intentando llamar al selector externo de archivos / directorios. Si falta, llame a la función show 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()); } } 

Este methos es simplemente recoger un diálogo y si el usuario quiere instalar la aplicación externa del mercado

 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(); }