Android: ¿Cómo abrir una carpeta específica a través de Intent y mostrar su contenido en un navegador de archivos?
Pensé que esto sería fácil, pero como resulta que por desgracia no lo es.
Lo que tengo:
- Cómo crear una carpeta en android External Storage Directory?
- ¿Cómo escuchar dev / binder?
- Detectar la carpeta de la cámara Android
- Android Widgets permitido exceder el límite de transacción Binder de alguna manera?
- ¿Cómo comprobar si dos objetos proxy de enlace de Android son iguales?
Tengo una carpeta llamada "myFolder" en mi almacenamiento externo (no tarjeta sd porque es un Nexus 4, pero eso 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 (exploradores de archivos) de las cuales puedo elegir uno (ver imagen). Después de hacer clic en él, el explorador de archivos seleccionado debe iniciar y mostrarme el contenido de "myFolder". Ni mas ni menos.
Mi pregunta:
¿Cómo exactamente hago eso? Creo que llegué bastante cerca con el siguiente código, pero no importa lo que hago – y estoy seguro de que debe haber algo que no he recibido todavía – siempre se abre sólo 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); }
- Rápida eliminación de la carpeta con más de 30000 imágenes en Android
- Convenciones de nomenclatura de carpetas para variantes de generación de grados
- No tiene ningún directorio de librerías en Android Studio
- Ventajas de usar Binder para IPC en Android
- Zip / comprimir una carpeta llena de archivos en android
- Donde está ADB, Android Debug Bridge, código fuente de los componentes ubicado en el proyecto de código abierto de Android
- Diferencias entre / sdcard / emulated / 0 y / sdcard
- Renombrar carpeta en la tarjeta SD
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 que tiene una aplicación de explorador de archivos instalada en su dispositivo.
EDIT: añadió una recomendación de shantanu del comentario.
Finalmente lo conseguí trabajando. De esta manera, solo algunas 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() + "/myFolder/"); intent.setDataAndType(uri, "text/csv"); startActivity(Intent.createChooser(intent, "Open folder")); }
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 escoger cualquier archivo, si establezco "texto / llano" Dropbox se abre. Tengo Dropbox, Google Drive instalado. Si desinstalo Dropbox sólo "* / *" funciona para abrir el explorador de archivos. Esto es Android 4.4.2. Puedo descargar contenido de Dropbox y para Google Drive, por getContentResolver (). OpenInputStream (data.getData ()).
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 gestor de archivos OI aquí: http://www.openintents.org/en/filemanager
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 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 sólo tiene que 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()); } } }
Pareces cercano.
Intentaría establecer el URI de esta manera:
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. Díganos si cambia algo?
También asegúrese de que la carpeta de destino existe, y tener una mirada en el objeto Uri resultante antes de enviarlo a la intención , puede que no sea lo que se espera.
- Selección única en RecyclerView
- ¿Cómo puedo aplicar operaciones matemáticas a las dimensiones de Android?