seleccionar - manual de programacion android pdf
Android: ¿Cómo abrir una carpeta específica a través de Intent y mostrar su contenido en un buscador de archivos? (8)
Pensé que sería fácil, pero desafortunadamente no es así.
Lo que tengo:
Tengo una carpeta llamada "myFolder" en mi almacenamiento externo (no una tarjeta SD porque es un Nexus 4, pero ese no debería ser el problema). La carpeta contiene algunos archivos *.csv
.
Lo que quiero:
Quiero escribir un método que haga lo siguiente: mostrar una variedad de aplicaciones (navegadores de archivos) desde donde puedo elegir una (ver foto). Después de hacer clic en él, el buscador de archivos seleccionado debería comenzar y mostrarme el contenido de "myFolder". Ni mas ni menos.
Mi pregunta:
¿Cómo exactamente hago eso? Creo que me acerqué bastante al siguiente código, pero no importa lo que haga, y estoy seguro de que debe haber algo que aún no entendí, siempre abre solo la carpeta principal del almacenamiento externo.
public void openFolder()
{
File file = new File(Environment.getExternalStorageDirectory(),
"myFolder");
Log.d("path", file.toString());
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setDataAndType(Uri.fromFile(file), "*/*");
startActivity(intent);
}
Esto debería funcionar:
Uri selectedUri = Uri.parse(Environment.getExternalStorageDirectory() + "/myFolder/");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(selectedUri, "resource/folder");
if (intent.resolveActivityInfo(getPackageManager(), 0) != null)
{
startActivity(intent);
}
else
{
// if you reach this place, it means there is no any file
// explorer app installed on your device
}
Por favor, asegúrese de tener instalada cualquier aplicación de explorador de archivos en su dispositivo.
EDITAR: agregó una recomendación de shantanu del comentario.
BIBLIOTECAS : También puede echar un vistazo a estas bibliotecas de selectores de archivos / directorios https://android-arsenal.com/tag/35 si la solución actual no lo ayuda.
Finalmente lo tengo funcionando. De esta forma, solo unas pocas aplicaciones son mostradas por el selector (Google Drive, Dropbox, Root Explorer y Solid Explorer). Está funcionando bien con los dos exploradores, pero no con Google Drive y Dropbox (supongo que porque no pueden acceder al almacenamiento externo). El otro tipo MIME como "*/*"
también es posible.
public void openFolder(){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()
+ File.separator + "myFolder" + File.separator);
intent.setDataAndType(uri, "text/csv");
startActivity(Intent.createChooser(intent, "Open folder"));
}
Pareces cerca.
Intentaría configurar el URI así:
String folderPath = Environment.getExternalStorageDirectory()+"/pathTo/folder";
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
Uri myUri = Uri.parse(folderPath);
intent.setDataAndType(myUri , "file/*");
startActivity(intent);
Pero no es tan diferente de lo que has intentado. Dinos si cambia algo?
También asegúrese de que la carpeta de destino existe, y eche un vistazo al objeto Uri resultante antes de enviarlo a la intención , puede que no sea lo que se espera.
este código funcionará con OI File Manager:
File root = new File(Environment.getExternalStorageDirectory().getPath()
+ "/myFolder/");
Uri uri = Uri.fromFile(root);
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setData(uri);
startActivityForResult(intent, 1);
puede obtener el Administrador de archivos de OI aquí: http://www.openintents.org/en/filemanager archivos
File temp = File.createTempFile("preview", ".png" );
String fullfileName= temp.getAbsolutePath();
final String fileName = Uri.parse(fullfileName)
.getLastPathSegment();
final String filePath = fullfileName.
substring(0,fullfileName.lastIndexOf(File.separator));
Log.d("filePath", "filePath: " + filePath);
fullfileName :
/mnt/sdcard/Download_Manager_Farsi/preview.png
filePath :
/ mnt / sdcard / Download_Manager_Farsi
Intent chooser = new Intent(Intent.ACTION_GET_CONTENT);
Uri uri = Uri.parse(Environment.getDownloadCacheDirectory().getPath().toString());
chooser.addCategory(Intent.CATEGORY_OPENABLE);
chooser.setDataAndType(uri, "*/*");
// startActivity(chooser);
try {
startActivityForResult(chooser, SELECT_FILE);
}
catch (android.content.ActivityNotFoundException ex)
{
Toast.makeText(this, "Please install a File Manager.",
Toast.LENGTH_SHORT).show();
}
En el código anterior, si setDataAndType es "* / *" se abre un explorador de archivos integrado para elegir cualquier archivo, si configuro "texto / normal", se abre Dropbox. Tengo instalado Dropbox, Google Drive. Si desinstalo Dropbox, solo "* / *" funciona para abrir el buscador de archivos. Esto es Android 4.4.2. Puedo descargar contenido de Dropbox y de Google Drive, por getContentResolver (). OpenInputStream (data.getData ()).
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("text/csv");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"), 0);
} catch (android.content.ActivityNotFoundException ex) {
ex.printStackTrace();
}
entonces solo necesitas agregar la respuesta
public void onActivityResult(int requestCode, int resultCode, Intent data){
switch (requestCode) {
case 0: {
//what you want to do
//file = new File(uri.getPath());
}
}
}
private static void openFolder(Activity activity, String folder) throws ActivityNotFoundException {
String path = Environment.getExternalStorageDirectory().getAbsolutePath()
+ File.separator + folder + File.separator;
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(path)), "resource/folder");
intent.putExtra("org.openintents.extra.ABSOLUTE_PATH", path);
activity.startActivity(Intent.createChooser(intent, "Choose app"));
}
Esta solución usa el tipo de intento correcto y el tipo de recurso