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
}
}
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
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);
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.
rodonuk
Puedes usar Intent.ACTION_OPEN_DOCUMENT,
Cada documento se representa como un URI content:// respaldado por un DocumentsProvider
que 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+.
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
}
}
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