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:

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.

Introduzca aquí la descripción de la imagen

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

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.

  • Acceso a Unity StreamingAssets en Android
  • Pasar objetos activos entre servicios a través de AIDL
  • Android: hacer una carpeta en la memoria externa privada o protegida
  • En AOSP, donde se implementa el ServiceManager
  • Lista de nombres de carpetas de directorios de la tarjeta SD de Android
  • Descriptor de archivos compartidos con la carpeta de Android
  • Transferir InputStream a otro servicio (a través de límites de proceso) con ParcelFileDescriptor.createPipe () falla con "EBADF (número de archivo incorrecto)"
  • ¿Cómo notificar correctamente a MediaScanner sobre una carpeta, incluso en dispositivos Nexus / Kitkat?
  • Carpeta java de Java ¿TRANSACCIÓN DE BINDER FALLA?
  • Adición de carpetas de java al proyecto de estudio de Android
  • Cómo guardar las fotos tomadas en una carpeta específica?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.