¿Cómo hacer intent.setType para archivos pdf, xlsx y txt en Android?

6 minutos de lectura

Quiero elegir solo archivos pdf, xlsx y txt del almacenamiento, pero intent.setType solo puede hacer un archivo (por ejemplo, solo archivo .txt (o) solo archivo pdf). ¿Es posible obtener los tres archivos codificando intent.setType() y hay alguna forma de hacerlo?

Aquí hay algo de mi código.

  private void showFileChooser() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("application/pdf");
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    try {
        startActivityForResult(
                Intent.createChooser(intent, "Select txt file"),
                0);
    } catch (android.content.ActivityNotFoundException ex) {
        // Potentially direct the user to the Market with a Dialog

    }
}

  • deberías mirar stackoverflow.com/a/33117677/5597641

    – Dani Akash

    24 de febrero de 2017 a las 7:19

  • ¿Posible duplicado de cómo elegir algunos tipos de archivos a través de la intención en Android?

    – Dani Akash

    24 de febrero de 2017 a las 7:30

Avatar de usuario de Zia
zia

La forma de @Fatehali Asamadi está bien, pero necesita agregar algo para un uso apropiado. Para los documentos de Microsoft se utilizan las extensiones (.doc o .docx), (.ppt o .pptx), (.xls o .xlsx). Para admitir o explorar estas extensiones, debe agregar más mimeTypes.

Utilice el siguiente método para buscar documentos donde REQUEST_CODE_DOC es RequestCode para onActivityResult(final int requestCode, final int resultCode, final Intent data) @Override method.

private void browseDocuments(){

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

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

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        intent.setType(mimeTypes.length == 1 ? mimeTypes[0] : "*/*");
        if (mimeTypes.length > 0) {
            intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
        }
    } else {
        String mimeTypesStr = "";
        for (String mimeType : mimeTypes) {
            mimeTypesStr += mimeType + "|";
        }
        intent.setType(mimeTypesStr.substring(0,mimeTypesStr.length() - 1));
    }
    startActivityForResult(Intent.createChooser(intent,"ChooseFile"), REQUEST_CODE_DOC);

}

Puede obtener un concepto claro y agregar los mimeTypes requeridos desde aquí

  • No puedo ver documentos en la aplicación mientras uso este código. Puede usted ayudar

    – Pawandeep

    16 de abril de 2019 a las 17:36

  • Mi aplicación es compatible con Kitkat y superior. Entonces, solo uso la primera condición lógica. Sin embargo, de alguna manera, muestra todo en lugar de solo los previstos. estoy dudando de esta linea intent.setType(mimeTypes.length == 1 ? mimeTypes[0] : "*/*");. ¿No hace que lo muestre todo?

    – Yusril Maulidan Raji

    12 sep 2019 a las 10:05


  • ¿Cuál es el propósito de esa línea? intent.setType(mimeTypes.length == 1 ? mimeTypes[0] : “/“);.

    – moumen Shobakey

    9 de junio de 2020 a las 9:11

  • Pasé demasiado tiempo buscando el tipo docx Mime “application/vnd.openxmlformats-officedocument.wordprocessingml.document”, que necesitaba para el parámetro CrossFilePicker.Current.PickFile() allowTypes. Gracias 🙂

    – chri3g91

    1 de julio de 2020 a las 9:58

  • use este código para detectar el archivo mimetype File = new File(filePath); Extensión de cadena = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString()); String mimeType = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extensión);

    – usuario2094075

    3 de febrero de 2021 a las 11:05

intent.setType("image/*|application/pdf|audio/*");

Tal vez esto es lo que quieres.

  • ¿Está esto documentado en alguna parte? Cuando intenté combinar varios tipos como este, la intención no seleccionó ningún tipo de archivo.

    – arlomedia

    15 de enero de 2019 a las 20:47

  • sí, es más claro pero no funciona con ‘|’ operador, lo he intentado y no funcionó.

    – Yogui Arif Widodo

    17 de noviembre de 2021 a las 23:31

  • Sí, lo mismo aquí. no funciona con “|”

    – Gulab Sagevadiya

    3 de julio de 2022 a las 14:28

Avatar de usuario de Fatehali Asamadi
Fatehali Asamadi

Deberías revisar este enlace http://www.androidsnippets.com/open-any-type-of-file-with-default-intent.html. Lea también Mime Type.

Así es como lo he implementado para cualquier archivo o archivo tipo mime seleccionado

String[] mimeTypes =
{"image/*","application/pdf","application/msword","application/vnd.ms-powerpoint","application/vnd.ms-excel","text/plain"};

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    intent.setType(mimeTypes.length == 1 ? mimeTypes[0] : "*/*");
    if (mimeTypes.length > 0) {
       intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
    }
} else {
    String mimeTypesStr = "";
    for (String mimeType : mimeTypes) {
        mimeTypesStr += mimeType + "|";
    }
    intent.setType(mimeTypesStr.substring(0,mimeTypesStr.length() - 1));
}
startActivityForResult(Intent.createChooser(intent,"ChooseFile"), 0);

Avatar de usuario de Daniel Nugent
daniel nugent

Parece que solo quieres ver si esos intentos se pueden resolver. Este podría ser un mejor enfoque:

 private void showFileChooser() {

    Intent intentPDF = new Intent(Intent.ACTION_GET_CONTENT);
    intentPDF.setType("application/pdf");
    intentPDF.addCategory(Intent.CATEGORY_OPENABLE);

    Intent intentTxt = new Intent(Intent.ACTION_GET_CONTENT);
    intentTxt.setType("text/plain");
    intentTxt.addCategory(Intent.CATEGORY_OPENABLE);

    Intent intentXls = new Intent(Intent.ACTION_GET_CONTENT);
    intentXls.setType("application/x-excel");
    intentXls.addCategory(Intent.CATEGORY_OPENABLE);

    PackageManager packageManager = getPackageManager();

    List activitiesPDF = packageManager.queryIntentActivities(intentPDF,
    PackageManager.MATCH_DEFAULT_ONLY);
    boolean isIntentSafePDF = activitiesPDF.size() > 0;

    List activitiesTxt = packageManager.queryIntentActivities(intentTxt,
    PackageManager.MATCH_DEFAULT_ONLY);
    boolean isIntentSafeTxt = activitiesTxt.size() > 0;

    List activitiesXls = packageManager.queryIntentActivities(intentXls,
    PackageManager.MATCH_DEFAULT_ONLY);
    boolean isIntentSafeXls = activitiesXls.size() > 0;

    if (!isIntentSafePDF || !isIntentSafeTxt || !isIntentSafeXls){

        // Potentially direct the user to the Market with a Dialog

    }

}

Referencias:

http://developer.android.com/training/basics/intents/sending.html

¿Cómo puedo determinar si Android puede manejar PDF?

La solución sencilla es

   Intent gallery=new Intent();
        gallery.setType("application/*");
        gallery.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(gallery,pick);

Nota: la selección es una variable int.

avatar de usuario de rdonuk
rodonuk

Puedes usar Intent.ACTION_OPEN_DOCUMENT,

Cada documento se representa como un URI content:// respaldado por un DocumentsProviderque se puede abrir como una secuencia con openFileDescriptor(Uri, String)o consultado por DocumentsContract.Document metadatos

Todos los documentos seleccionados se devuelven a la aplicación de llamada con permisos persistentes de lectura y escritura. Si desea mantener el acceso a los documentos a través de los reinicios del dispositivo, debe tomar explícitamente los permisos persistentes usando takePersistableUriPermission(Uri, int).

Las personas que llaman deben indicar los tipos MIME de documentos aceptables a través de setType(String). Por ejemplo, para seleccionar fotos, utilice image/*. Si se aceptan varios tipos MIME disjuntos, defínalos en EXTRA_MIME_TYPES y setType(String) a */*.

Para obtener más detalles, consulte este enlace

http://developer.android.com/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT

Tenga en cuenta que esto solo está disponible en el nivel API 19+.

avatar de usuario de vishnu benny
vishnu benny

Aquí está la forma kotlin:

  val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
  val mimeType = arrayOf(
    "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"
  ).joinToString("|")
  intent.type = mimeType
  intent.addCategory(Intent.CATEGORY_OPENABLE)
  val chooserIntent = Intent
    .createChooser(intent, fragment.getString(R.string.str_attachfile_chooser_message))
  launcher.launch(chooserIntent)

El lanzador puede ser como:

val launcher = registerForActivityResult(StartActivityForResult()) { result: ActivityResult ->
    if (result.resultCode == Activity.RESULT_OK) {
        val intent = result.data
        // handle stuff here
    }
}

¿Ha sido útil esta solución?