programacion - Selector de archivos de Android
manual de android en pdf (4)
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
Creo que no deberías "forzar" al usuario a hacer algo. Si solo necesita un selector de archivos simple, puede escribirlo usted mismo. Por otro lado, si no quieres hacer eso (para tus usuarios), te mantienes alejado de tus usuarios.
O puede usar https://code.google.com/p/android-file-chooser/
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();
}
Android File Browser me ayudó mucho. Es fácil y útil.
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;
}