Tengo un tipo / extensión de archivo personalizado con el que quiero asociar mi aplicación.
Hasta donde yo sé, el elemento de datos está hecho para este propósito, pero no puedo hacerlo funcionar. http://developer.android.com/guide/topics/manifest/data-element.html De acuerdo con los documentos, y muchas publicaciones en el foro, debería funcionar así:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="application/pdf" />
</intent-filter>
Bueno, no funciona. ¿Qué hice mal? Simplemente quiero declarar mi propio tipo de archivo.
Respuestas:
Necesita varios filtros de intención para abordar las diferentes situaciones que desea manejar.
Ejemplo 1, maneje solicitudes http sin tipos MIME:
Manejar con mimetypes, donde el sufijo es irrelevante:
Manejar la intención desde una aplicación de navegador de archivos:
fuente
Las otras soluciones no funcionaron de manera confiable para mí hasta que agregué:
Antes de eso funcionaba en algunas aplicaciones, en otras no ...
solución completa para mí:
fuente
mimeType
y otra sin él, si quieres ser completa. Ver developer.android.com/guide/components/…Las respuestas dadas por Phyrum Tea y yuku son muy informativas.
Quiero agregar eso comenzando con Android 7.0 Nougat hay un cambio en la forma en que se maneja el intercambio de archivos entre aplicaciones:
De los cambios oficiales de Android 7.0 :
Si tiene su propio archivo personalizado que termina sin un específico
mime-type
(o supongo que incluso con uno), es posible que deba agregar un segundoscheme
valor paraintent-filter
que funcioneFileProviders
también.Ejemplo:
Lo importante aquí es la adición de
al filtro.
Me costó mucho descubrir este pequeño cambio que impidió que mi actividad se abriera en dispositivos con Android 7.0 mientras todo estaba bien en versiones anteriores. Espero que esto ayude a alguien.
fuente
File(uri.path)
, se bloqueará debido aNo such file or directory
: ¡tendrá que manejar ese escenario de manera diferente al actualizar para admitir Nougat +!Mis hallazgos:
Necesita varios filtros para lidiar con las diferentes formas de recuperar un archivo. es decir, por adjunto de Gmail, por explorador de archivos, por HTTP, por FTP ... Todos envían intenciones muy diferentes.
Y debe filtrar la intención que desencadena su actividad en su código de actividad.
Para el siguiente ejemplo, creé un tipo de archivo falso new.mrz. Y lo recuperé del archivo adjunto de gmail y del explorador de archivos.
Código de actividad agregado en onCreate ():
Filtro de archivos adjuntos de Gmail:
Filtro del explorador de archivos:
Filtro HTTP:
Funciones privadas utilizadas anteriormente:
fuente
los
pathPattern
no funciona si la ruta del archivo contiene uno o más puntos antes de ".pdf".
Esto funcionará:
Agregue más si desea admitir más puntos.
fuente
He intentado que esto funcione durante años y he probado básicamente todas las soluciones sugeridas y todavía no puedo hacer que Android reconozca extensiones de archivo específicas. Tengo un filtro de intención con un tipo
"*/*"
MIME que es lo único que parece funcionar y los navegadores de archivos ahora enumeran mi aplicación como una opción para abrir archivos, sin embargo, mi aplicación ahora se muestra como una opción para abrir CUALQUIER TIPO de archivo aunque He especificado extensiones de archivo específicas usando la etiqueta pathPattern. Esto va tan lejos que incluso cuando intento ver / editar un contacto en mi lista de contactos, Android me pregunta si quiero usar mi aplicación para ver el contacto, y esa es solo una de las muchas situaciones en las que esto ocurre, MUY MUY molesto.Finalmente encontré esta publicación de grupos de Google con una pregunta similar a la que respondió un ingeniero de marco de Android real. Ella explica que Android simplemente no sabe nada sobre extensiones de archivo, solo tipos MIME ( https://groups.google.com/forum/#!topic/android-developers/a7qsSl3vQq0 ).
Entonces, por lo que he visto, probado y leído, Android simplemente no puede distinguir entre extensiones de archivo y la etiqueta pathPattern es básicamente una pérdida gigantesca de tiempo y energía. Si tiene la suerte de que solo necesite archivos de cierto tipo de mímica (por ejemplo, texto, vídeo o audio), puede utilizar un filtro de intención con un tipo de mímica. Sin embargo, si necesita una extensión de archivo específica o un tipo de mimo que Android no conoce, no tiene suerte.
Si me equivoco en algo de esto, por favor dígame, hasta ahora he leído todas las publicaciones y he probado todas las soluciones propuestas que pude encontrar, pero ninguna ha funcionado.
Podría escribir otra página o dos sobre lo común que parecen ser este tipo de cosas en Android y lo arruinada que es la experiencia del desarrollador, pero te ahorraré mis divagaciones;). Espero haberle ahorrado algunos problemas a alguien.
fuente
Markus Ressel tiene razón. Android 7.0 Nougat ya no permite compartir archivos entre aplicaciones usando un URI de archivo. Se debe utilizar un URI de contenido. Sin embargo, un URI de contenido no permite compartir una ruta de archivo, solo un tipo mime. Por lo tanto, no puede usar un URI de contenido para asociar su aplicación con su propia extensión de archivo.
Drobpox tiene un comportamiento interesante en Android 7.0. Cuando se encuentra con una extensión de archivo desconocida, parece formar una intención de URI de archivo, pero en lugar de iniciar la intención, llama al sistema operativo para averiguar qué aplicaciones pueden aceptar la intención. Si solo hay una aplicación que puede aceptar ese URI de archivo, envía un URI de contenido explícito directamente a esa aplicación. Entonces, para trabajar con Dropbox, no es necesario cambiar los filtros de intención en su aplicación. No requiere un filtro de intención de URI de contenido. Solo asegúrese de que la aplicación pueda recibir un URI de contenido y que su aplicación con su propia extensión de archivo funcionará con Dropbox como lo hacía antes de Android 7.0.
Aquí hay un ejemplo de mi código de carga de archivos modificado para aceptar un URI de contenido:
fuente
Si lo intenta, le ayudará. En lugar de pdf, también puede usar otras extensiones. Primero debe agregar el permiso de lectura de almacenamiento externo en el archivo androidmanifest.xml .
Luego, en el archivo androidmanifest en la etiqueta de actividad, agrega un filtro de intención como se muestra a continuación.
Finalmente, en su código, obtiene la ruta del archivo pdf como se muestra a continuación:
fuente
Intenta agregar
fuente
Para el archivo adjunto de Gmail, puede utilizar:
Agrega tantos tipos de mímica como necesites. Solo los necesito para mi proyecto.
fuente
Tenga en cuenta que esto hará que su aplicación abra todos los archivos adjuntos de gmail, no hay forma de evitarlo
fuente
Aquellos que tienen problemas con otras aplicaciones File Manager \ Explorer, como respondieron @yuku y @ phyrum-tea
Esto funciona con la aplicación de administrador de archivos predeterminada de LG
pero no pude funcionar con ES File Explorer y otros administradores de archivos, así que agregué
luego funciona con ES Explorer pero el administrador de archivos LG no pudo detectar el tipo de archivo, por lo que mi solución es
fuente
URI de contenido ftw, y con el filtro de intención en el manifiesto ... si sus archivos tienen una extensión personalizada .xyz, agregue un tipo de mime coincidente:
Algunas aplicaciones, como el correo electrónico, parecen convertir la extensión en un tipo mimo. Ahora puedo hacer clic en el archivo adjunto en el correo electrónico y abrirlo en mi aplicación.
fuente
Leer el archivo de apertura en kotlin:
fuente
Coloque este filtro de intención dentro de la etiqueta de actividad en el manifiesto que le gustaría abrir tocando el archivo:
fuente
// He probado este código. Y está funcionando bien. Puede utilizar este código para aceptar archivos pdf.
fuente