Voici comment j'ai défini mon activité dans mon AndroidManifest.xml pour que cela fonctionne.
<activity android:name="com.keepassdroid.PasswordActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file" />
<data android:mimeType="*/*" />
<data android:pathPattern=".*\\.kdb" />
<data android:host="*" />
</intent-filter>
</activity>
Le scheme
of file
indique que cela devrait se produire lorsqu'un fichier local est ouvert (plutôt qu'un protocole comme HTTP).
mimeType
peut être défini sur \*/\*
pour correspondre à n'importe quel type de mime.
pathPattern
est l'endroit où vous spécifiez l'extension à associer (dans cet exemple .kdb
). Le .*
au début correspond à n'importe quelle séquence de caractères. Ces chaînes nécessitent un double échappement, donc \\\\.
correspond à un point littéral. Ensuite, vous terminez avec votre extension de fichier. Une mise en garde avec pathPattern est qu'il .*
ne s'agit pas d'une correspondance gourmande comme on pourrait s'y attendre s'il s'agissait d'une expression régulière. Ce modèle ne correspondra pas aux chemins contenant un .
avant le .kdb
. Pour une discussion plus détaillée de ce problème et une solution de contournement, cliquez ici
Enfin, selon la documentation Android, les attributs host
et les deux scheme
sont nécessaires pour que l' pathPattern
attribut fonctionne, il suffit donc de le définir sur le caractère générique pour qu'il corresponde à tout.
Maintenant, si vous sélectionnez un .kdb
fichier dans une application telle que Linda File Manager, mon application apparaît comme une option. Je dois noter que cela seul ne vous permet pas de télécharger ce type de fichier dans un navigateur, car cela ne s'enregistre qu'avec le schéma de fichier. Avoir une application comme Linda File Manager sur votre téléphone résiste de manière générique, vous permettant de télécharger n'importe quel type de fichier.
.kdbx
extension pour permettre à l'explorateur de fichiers ES d'ouvrir les fichiers kdbx lorsque j'ai été pointé vers ce message. Apparemment, si l'intention a un type MIME vide, ce filtre d'intention ne fonctionnera pas !! De plus, il est possible d'avoir une intention avec une chaîne VIDE comme action et juste un URI. Google Docs a répondu à cette intention, il doit donc être valide.<data>
balise avec quatre attributs. Avoir 4 balises est logique OU - qui fonctionnait avec Android 2 - mais Android 4 est plus strict. Voir stackoverflow.com/questions/20650378/…\\\\.
correspond à un point littéral, pourquoi ne l'utilisez-vous pas pour former une.kdb
extension comme celle-ci\\\\.kdb
:?Il y a beaucoup de désinformation sur ce sujet, notamment de la propre documentation de Google. Le meilleur, et étant donné la logique étrange, la seule vraie documentation est peut-être le code source.
L' implémentation du filtre d'intention a une logique qui défie presque toute description. Le code de l'analyseur est l'autre pièce pertinente du puzzle.
Les filtres suivants sont assez proches du comportement raisonnable. Les modèles de chemin s'appliquent, pour les intentions de schéma de «fichier».
La correspondance de modèle de type mime global correspondra à tous les types tant que l'extension de fichier correspond. Ce n'est pas parfait, mais c'est le seul moyen de faire correspondre le comportement des gestionnaires de fichiers comme ES File Explorer, et il est limité aux intentions où l'URI / l'extension de fichier correspond.
Je n'ai pas inclus d'autres schémas comme "http" ici, mais ils fonctionneront probablement très bien sur tous ces filtres.
Le schéma étrange est "contenu", pour lequel l'extension n'est pas disponible pour le filtre. Mais tant que le fournisseur indique votre type MIME (par exemple, Gmail transmettra le type MIME pour la pièce jointe sans entrave), le filtre correspondra.
Il faut être conscient de:
Avec tout cela à l'esprit, voici un exemple avec des commentaires:
la source
<data android:mimeType="*/*" />
dans les trois options et cela a fonctionné comme un charme pour toutes les applications, y compris Google Drive et Gmail.Je dois admettre que la simple tâche d'ouvrir les pièces jointes des e-mails et des fichiers du système de fichiers sur Android a été l'une des expériences les plus exaspérantes jamais vues. Il est facile de gérer trop ou trop peu de fichiers. Mais il est difficile de bien faire les choses. La plupart des solutions publiées sur stackoverflow ne fonctionnaient pas correctement pour moi.
Mes exigences étaient:
La meilleure façon d'accomplir cette tâche est probablement de spécifier un type MIME personnalisé pour vos pièces jointes. Et vous choisirez probablement également d'avoir une extension de fichier personnalisée. Alors disons que notre application s'appelle "Cool App" et que nous générons des pièces jointes qui ont ".cool" à la fin.
C'est le plus proche de mon objectif et cela fonctionne ... satisfaisant.
Remarques:
pathPattern
semble être plus ou moins ignoré pour les pièces jointes (lors de l'utilisationandroid:scheme="content"
). Si quelqu'un obtient le pathPattern pour ne répondre qu'à certains modèles, je serais ravi de voir comment.android:host="*"
attribut.intent-filter
blocs sont fusionnés mais je ne l'ai pas vérifié.android:scheme="http"
peut être utilisé. Notez que certains navigateurs peuvent gâcher l'android:mimeType
expérienceandroid:mimeType="*/*"
et vérifier dans le débogueur ce qui est réellement passé, puis resserrer le filtrage pour ne pas devenir cette application ennuyeuse qui gère tout .intent-filter
été testé avec l'application "Mes fichiers" de Samsung sur un Galaxy S3. L'Explorateur FX refuse toujours d'ouvrir correctement le fichier et j'ai également remarqué que l'icône de l'application n'est pas utilisée pour les fichiers. Encore une fois, si quelqu'un obtient que cela fonctionne, veuillez commenter ci-dessous.J'espère que vous trouverez cela utile et que vous n'aurez pas à perdre des jours à parcourir toutes les combinaisons possibles. Il y a place à l'amélioration, donc les commentaires sont les bienvenus.
la source
android:label
filtre d'intention est la chaîne que l'utilisateur verra dans le menu de sélection. Par défaut, le nom de l'application est utilisé.La réponse de Brian ci-dessus m'a conduit à 90% du chemin. Pour finir, pour le type de mime que j'ai utilisé
Je soupçonne que les affiches précédentes ont tenté de publier le même détail, mais sans trop noter l'étoile de la barre oblique en tant que code, stackoverflow l'affiche comme une simple barre oblique.
la source
Plutôt que d'
android:path
essayerandroid:mimeType
, avec une valeur du type MIME de ce contenu particulier. De plus,android:path
n'accepte pas les caractères génériques - utilisezandroid:pathPattern
pour cela.la source
J'essaie de faire fonctionner cela depuis des lustres et j'ai essayé fondamentalement toutes les solutions suggérées et je n'arrive toujours pas à faire reconnaître à Android des extensions de fichiers spécifiques. J'ai un filtre d'intention avec un
"*/*"
type MIME qui est la seule chose qui semble fonctionner et les navigateurs de fichiers répertorient maintenant mon application comme une option pour ouvrir des fichiers, mais mon application est maintenant affichée comme une option pour ouvrir TOUT TYPE de fichier même si J'ai spécifié des extensions de fichier spécifiques à l'aide de la balise pathPattern. Cela va si loin que même lorsque j'essaie d'afficher / de modifier un contact dans ma liste de contacts, Android me demande si je veux utiliser mon application pour afficher le contact, et ce n'est qu'une des nombreuses situations où cela se produit, TRÈS TRÈS ennuyeux.Finalement, j'ai trouvé ce post de groupes Google avec une question similaire à laquelle un véritable ingénieur du framework Android a répondu. Elle explique qu'Android ne sait tout simplement rien sur les extensions de fichiers, seulement les types MIME ( https://groups.google.com/forum/#!topic/android-developers/a7qsSl3vQq0 ).
Donc, d'après ce que j'ai vu, essayé et lu, Android ne peut tout simplement pas faire la distinction entre les extensions de fichier et la balise pathPattern est fondamentalement une énorme perte de temps et d'énergie. Si vous avez la chance de n'avoir besoin que de fichiers d'un certain type mime (par exemple, texte, vidéo ou audio), vous pouvez utiliser un filtre d'intention avec un type mime. Si vous avez besoin d'une extension de fichier spécifique ou d'un type mime non connu par Android, vous n'avez pas de chance.
Si je me trompe à propos de tout cela, veuillez me le dire, jusqu'à présent, j'ai lu tous les articles et essayé toutes les solutions proposées que j'ai pu trouver, mais aucune n'a fonctionné.
Je pourrais écrire une autre page ou deux sur la fréquence à laquelle ce genre de choses semble être dans Android et à quel point l'expérience des développeurs est foirée, mais je vais vous épargner mes élucubrations furieuses;). J'espère que j'ai sauvé des ennuis à quelqu'un.
la source
La réponse de Brian est très proche, mais voici un moyen propre et sans erreur d'invoquer votre application lorsque vous essayez d'ouvrir un fichier avec votre propre extension personnalisée (pas besoin de schéma ou d'hôte):
la source
<data>
balise avec quatre attributs. Votre solution pourrait fonctionner avec Android 2 - mais les règles sont devenues plus strictes: stackoverflow.com/questions/20650378/...host
etscheme
sont obligatoires!Sur Android 4, les règles sont devenues plus strictes qu'autrefois. Utilisation:
la source
J'ai eu beaucoup de mal avec cela pour une extension de fichier personnalisée, moi-même. Après de nombreuses recherches, j'ai trouvé cette page Web où l'affiche a découvert que la classe patternMatcher d'Android (qui est utilisée pour la correspondance pathPattern dans Intent-Filters) a un comportement inattendu lorsque votre chemin contient le premier caractère de votre modèle de correspondance ailleurs dans le chemin (comme si vous essayez de faire correspondre "* .xyz", la classe patternMatcher s'arrête s'il y a un "x" plus tôt dans votre chemin). Voici ce qu'il a trouvé pour une solution de contournement et a travaillé pour moi, bien que ce soit un peu un hack:
la source
Aucun des éléments ci-dessus ne fonctionne correctement, pour les actions VIEW ou SEND, si le suffixe n'est pas enregistré avec un type MIME dans la base de données MIME system = wide d'Android. Les seuls paramètres que j'ai trouvés qui se déclenchent pour le suffixe spécifié incluent
android:mimeType="*/*"
, mais l'action se déclenche pour TOUS les fichiers. Clairement PAS ce que vous voulez!Je ne peux pas trouver de solution appropriée sans ajouter le mime et le suffixe à la base de données mime d'Android, jusqu'à présent, je n'ai pas trouvé de moyen de le faire. Si quelqu'un sait, un pointeur serait formidable.
la source
Lorsqu'une intention répond à un
intent-filter
, voici lesintent-filter
exigences: (imaginez une liste de contrôle).<action>
<category>
<data mimeType>
(solution simple: " / ")En option:
Toute correspondance
<data scheme>
(fixe facile:<data android:scheme="file" /> <data android:scheme="content" />
)Toute correspondance
<data host>
(solution simple: "*")<data pathPattern/etc.>
(par exemple.*\\.0cc
)La définition de plusieurs
<data $type="">
éléments vérifie la case $ type ssi l'un<data $type=>
correspond à laIntent
.Omettre mimeType casse votre
intent-filter
, même si cela semble redondant. L'omission<data scheme/host/pathPattern>
fait que votre filtre correspond à tout.https://f-droid.org/en/packages/de.k3b.android.intentintercept/ est une application conçue pour recevoir toutes les intentions et vous permet d'inspecter l'intention. J'ai appris que les extensions de fichiers non reconnues ouvertes via Simple File Manager sont livrées avec le type MIME
application/octet-stream
.https://stackoverflow.com/a/4621284/2683842 signale
<data pathPattern=>
.*xyz
qu'interrompt dèsx
qu'il voit, et échouera immédiatement s'il n'est pas suivi deyz
. Donc/sdcard/.hidden/foo.0cc
ne passera pas à.*\\.0cc
moins que vous n'essayiez à la.*\\..*\\.0cc
place.Résultat final:
la source
Si vous souhaitez que les fichiers soient ouverts directement depuis Gmail, Dropbox ou l'un des outils de fichiers Android intégrés, utilisez le code suivant (supprimez 'android: host = "*"' qui a rendu le fichier inaccessible pour gmail):
Le filtre de données doit être écrit dans une seule instruction selon la version Android 4.x
la source
Utilisation du filtre comme ci-dessous pour ouvrir à partir du navigateur, de gmail et du navigateur de fichiers (testé). REMARQUE: veuillez ne pas fusionner deux filtres, car le navigateur ignorera votre application (testé).
la source
Mise à jour 2020
Android est passé aux URI de contenu et aux types MIME pour les filtres d'intention.
Le problème
Un URI de contenu ne doit pas nécessairement contenir l'extension ou le nom du fichier et il sera différent entre les différentes applications qui fournissent le contenu / fichier.
Voici quelques exemples d'URI de contenu provenant de différentes applications de messagerie pour la même pièce jointe:
Gmail ->
content://com.google.android.gm.sapi/[email protected]/message_attachment_external/%23thread-a%3Ar332738858767305663/%23msg-a%3Ar-5439466788231005876/0.1?account_type=com.google&mimeType=application%2Foctet-stream&rendition=1
Outlook ->
content://com.microsoft.office.outlook.fileprovider/outlookfile/data/data/com.microsoft.office.outlook/cache/file-download/file--2146063402/filename.customextention
Application de messagerie Samsung ->
content://com.samsung.android.email.attachmentprovider/1/1/RAW
Comme vous pouvez le voir, ils sont tous différents et ne sont pas garantis de contenir quoi que ce soit lié à votre fichier réel. Ainsi, vous ne pouvez pas utiliser ce
android:pathPattern
que la plupart ont suggéré.Une solution de contournement pour les pièces jointes aux e-mails
Grâce à des tests, j'ai trouvé les types MIME utilisés par Gmail, Outlook et Samsung Email et les ai ajoutés à mon filtre d'intention.
Mises en garde / Gotchas
J'ai trouvé qu'avec ma solution ci-dessus, si j'ouvrais un fichier de type binaire, cela lancerait automatiquement mon application. J'ai géré cela dans mon activité en affichant un état d'échec si nous ne pouvions pas analyser le fichier. J'ai pensé que c'était un événement assez rare, donc ce serait acceptable.
Je n'ai trouvé aucun moyen de lancer mon application via le navigateur de fichiers sans ajouter
<data android:mimeType="*/*"/>
à mon filtre d'intention. Je ne pouvais pas l'utiliser car cela lancerait ensuite mon application chaque fois que l'utilisateur cliquait sur un fichier sur son téléphone (pas seulement ceux avec l'extension de fichier personnalisé). Je ne recommanderais pas d'ajouter ceci à votre filtre d'intention.Dernières pensées
la source