Seleccionador de archivos de Android
Quiero hacer un uploader de archivos. Y por lo tanto, necesito un selector de archivos, pero no quiero escribir esto por mí mismo. Encuentro el encargado de archivo de OI y pienso que me conviene. Pero, ¿cómo puedo obligar al usuario a instalar el gestor de archivos OI? Si no puedo, ¿hay una mejor manera de incluir un administrador de archivos en mi aplicación? Gracias
- Subir varios archivos de imagen al servidor php desde la aplicación android
- La aplicación para Android publica everyThing excepto el archivo publicado
- Descarga de archivos / archivos subidos en Android
- Uploding archivo en el servidor mediante POST de Android dando excepción
- Android permite múltiples archivos de carga (Max 150 MB) a PHP Server
- Carga reanudable con Drive API para Android
- Subida de archivos mediante httppost android
- Cómo cargar archivo de imagen y vídeo con HttpPost en android
- Cómo leer datos fragmentados de archivo de archivo Gap de teléfono en Android
- Primavera para Android, progreso de subida de archivos
- Ayudar a construir una solicitud POST con MultipartEntity (pregunta de novato)
- Uploader de archivos Android con php de servidor
- MediaPlayer java.io.IOException: Prepare failed .: status = 0x1 con Huawei ALE-L21
EDIT ( 02 ene 2012 ):
Creé un pequeño proyecto de biblioteca de código abierto para Android que simplifica este proceso, al mismo tiempo que proporciona un explorador de archivos integrado (en caso de que el usuario no tenga uno presente). Es extremadamente simple de usar, requiriendo sólo unas pocas líneas de código.
Puede encontrarlo en GitHub: aFileChooser .
ORIGINAL
Si desea que el usuario pueda elegir cualquier archivo del sistema, deberá incluir su propio gestor de archivos o aconsejar al usuario que descargue uno. Creo que lo mejor que puedes hacer es buscar contenido " Intent.createChooser()
" en un Intent.createChooser()
así:
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(); } }
A continuación, escuchar el Uri
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; }
El navegador de archivos Android me ayudó mucho. Es fácil y útil.
Creo que no debería "forzar" al usuario a hacer algo. Si sólo necesita un selector de archivos simple, puede escribirlo usted mismo. En el otro lado, si no quieres hacerlo (para tus usuarios), te mantendrás alejado de tus usuarios.
O puedes utilizar https://code.google.com/p/android-file-chooser/
He utilizado AndExplorer para este propósito y mi solución es un diálogo emergente y luego redirigir en el mercado para instalar la aplicación misssing:
Mi startCreation está tratando de llamar a selector de archivos / directorios externos. Si falta la función show showResultMessage.
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 de 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(); }
- Uso de la clase Aplicación de Android para persistir los datos
- Proceso se bloquea durante la creación del inyector de RoboGuice, si hay una instancia burlada en cualquier módulo