Elija cualquier tipo de archivo a través de una intención en Android

95

Me gustaría iniciar un intentchooser para aplicaciones que pueden devolver cualquier tipo de archivo

Actualmente uso (que copié del código fuente del correo electrónico de Android para el archivo adjunto)

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
Intent i = Intent.createChooser(intent, "File");
startActivityForResult(i, CHOOSE_FILE_REQUESTCODE);

Pero solo muestra "Galería" y "Reproductor de música" en mi Galaxy S2. Hay un explorador de archivos en este dispositivo y me gustaría que apareciera en la lista. También me gustaría que la aplicación de la cámara se mostrara en la lista, para que el usuario pueda tomar una foto y enviarla a través de mi aplicación. Si instalo el administrador de archivos Astro, también responderá a esa intención. Mis clientes son solo propietarios de Galaxy SII y no quiero obligarlos a instalar el administrador de archivos Astro dado que ya tienen un administrador de archivos básico pero suficiente.

¿Alguna idea de cómo podría lograr esto? Estoy bastante seguro de que ya vi aparecer el administrador de archivos predeterminado en dicho menú para elegir un archivo, pero no recuerdo en qué aplicación.

ErGo_404
fuente
Necesitará un código muy diferente para tomar una foto y luego para elegir un archivo. En realidad, no creo que la mayoría de los exploradores de archivos puedan devolver un archivo, pero podría estar equivocado.
dtech
¿Puede especificar qué tipo de archivos necesita para acceder principalmente?
subrussn90
1
@dtech: No espero que el explorador de archivos devuelva el archivo, solo necesito su ruta.
ErGo_404
@ subrussn90: Necesito permitir que el usuario elija cualquier tipo de archivo. Pueden ser pdf, .doc, .zip, CUALQUIER tipo de archivo.
ErGo_404
¿Es suficiente que obtenga el Uri del archivo especificado en la tarjeta SD?
subrussn90

Respuestas:

88

No para la cámara, sino para otros archivos.

En mi dispositivo lo he ES File Explorerinstalado y esto simplemente funciona en mi caso ..

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
user370305
fuente
5
Funciona con un explorador de archivos externo (como ES File Explorer o Astro File Manager, pero no con el explorador de archivos de Samsung. Parece extraño que no hayan implementado los filtros de intención correctos para responder a esa acción.
ErGo_404
@Lukap: use el administrador de archivos de Android de código abierto e intégrelo con su aplicación, entonces no necesita ninguna aplicación de terceros.
user370305
2
¿Cómo puedo obtener el archivo seleccionado? Supongo que es el camino, pero ¿cómo?
Francisco Corrales Morales
1
@FranciscoCorralesMorales - en onActivityResult()- Puede obtener Uridel Archivo.
user370305
1
PICKFILE_RESULT_CODEdebería ser PICKFILE_REQUEST_CODE.
Aron Lorincz
50

El explorador de archivos de Samsung no solo necesita una acción personalizada ( com.sec.android.app.myfiles.PICK_DATA ), sino también la parte de categoría (Intent. CATEGORY_DEFAULT ) y el tipo mime debe pasarse como extra.

Intent intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
intent.putExtra("CONTENT_TYPE", "*/*");
intent.addCategory(Intent.CATEGORY_DEFAULT);

También puede usar esta acción para abrir varios archivos: com.sec.android.app.myfiles.PICK_DATA_MULTIPLE De todos modos, aquí está mi solución que funciona en Samsung y otros dispositivos:

public void openFile(String mimeType) {

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType(mimeType);
        intent.addCategory(Intent.CATEGORY_OPENABLE);

        // special intent for Samsung file manager
        Intent sIntent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
         // if you want any file type, you can skip next line 
        sIntent.putExtra("CONTENT_TYPE", mimeType); 
        sIntent.addCategory(Intent.CATEGORY_DEFAULT);

        Intent chooserIntent;
        if (getPackageManager().resolveActivity(sIntent, 0) != null){
            // it is device with Samsung file manager
            chooserIntent = Intent.createChooser(sIntent, "Open file");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { intent});
        } else {
            chooserIntent = Intent.createChooser(intent, "Open file");
        }

        try {
            startActivityForResult(chooserIntent, CHOOSE_FILE_REQUESTCODE);
        } catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(getApplicationContext(), "No suitable File Manager was found.", Toast.LENGTH_SHORT).show();
        }
    }

Esta solución funciona bien para mí y quizás sea útil para otra persona.

Chupik
fuente
Casi funciona para mí, excepto el hecho de que sIntent, cuando se inicia, no acepta ningún archivo de ningún tipo. Puedo navegar por carpetas, pero eso es todo.
Radu
El problema es que la intención necesita tener mimeType: "file / *", mientras que Samsung sIntent necesita "* / *" - sin los espacios entre * / *
Radu
1
¿Qué pasa con los otros 11k de dispositivos Android?
Oliver Dixon
1
¿Cómo configurar el URI para esta intención? ¿Pueden ayudarme?
PriyankaChauhan
1
En el caso de Samsung Intent ("com.sec.android.app.myfiles.PICK_DATA") puede intentar poner String extra "FOLDERPATH" o "START_FOLDER"
Chupik
41

este trabajo para mí en Galaxy Note es mostrar contactos, administradores de archivos instalados en el dispositivo, galería, reproductor de música

private void openFile(Int  CODE) {
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.setType("*/*");
    startActivityForResult(intent, CODE);
}

aquí entra en onActivityResultactividad.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     String Fpath = data.getDataString();
    // do somthing...
    super.onActivityResult(requestCode, resultCode, data);

}
alireza
fuente
6
¿Cómo convertir la obtención de uri en un archivo util.?
Anand Savjani
No estoy seguro de obtener java.io.File, pero se puede abrir con: developer.android.com/reference/android/content/… Cómo obtener un nombre simple está aquí: stackoverflow.com/a/23270545/755313
demaksee
3
¿cómo elegir una carpeta?
hornet2319
6

Esto me da el mejor resultado:

    Intent intent;
    if (android.os.Build.MANUFACTURER.equalsIgnoreCase("samsung")) {
        intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
        intent.putExtra("CONTENT_TYPE", "*/*");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
    } else {

        String[] mimeTypes =
                {"application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .doc & .docx
                        "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation", // .ppt & .pptx
                        "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // .xls & .xlsx
                        "text/plain",
                        "application/pdf",
                        "application/zip", "application/vnd.android.package-archive"};

        intent = new Intent(Intent.ACTION_GET_CONTENT); // or ACTION_OPEN_DOCUMENT
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
    }
Islam Khaled
fuente
¿Puedes compartir tu onActivityResultCode @Islam Khaled
Kishan Donga
1
Vea también org.openintents.action.PICK_FILE para una tercera opción. openintents.org/action/org-openintents-action-pick-file Su código también asume que todos en un teléfono Samsung usan y (aún) tienen el administrador de archivos Samsung. Usar intent.resolveActivity con Samsung como alternativa sería más sólido.
Marcus Wolschon
1

Resulta que el explorador de archivos de Samsung usa una acción personalizada. Es por eso que pude ver el explorador de archivos de Samsung cuando busco un archivo de las aplicaciones de Samsung, pero no de la mía.

La acción es "com.sec.android.app.myfiles.PICK_DATA"

Creé un Selector de actividades personalizado que muestra actividades que filtran ambas intenciones.

ErGo_404
fuente
Hola, ¿puedes explicar esto un poco más? Para los teléfonos samsung galaxy utilizo Intent selectFile = new Intent ("com.sec.android.app.myfiles.PICK_DATA"); pero causa un error
steliosf
No estoy seguro ahora, pero puedo comprobarlo más tarde. Creo que es la excepción Actividad no encontrada. ¿Tiene alguna solución de trabajo? Casi probé todo y no
pude
Esta intención me ha funcionado en el Galaxy SII. Lo probé en un GT-B5510 (Galaxy Y Pro) y no funcionó. Creo que simplemente no es confiable si desea apuntar a todos los dispositivos Samsung. Terminé integrando un administrador de archivos de código abierto en mi aplicación, pero es una solución pesada para una necesidad tan básica.
ErGo_404
¿Cómo configurar el URI para esta intención? ¿Pueden ayudarme?
PriyankaChauhan
0

Si desea saber esto, existe una biblioteca de código abierto llamada aFileDialog que es pequeña y fácil de usar y que proporciona un selector de archivos.

La diferencia con las bibliotecas de otro selector de archivos para Android es que aFileDialog le da la opción de abrir el selector de archivos como un diálogo y como una actividad.

También le permite seleccionar carpetas, crear archivos, filtrar archivos usando expresiones regulares y mostrar cuadros de diálogo de confirmación.

danigonlinea
fuente