J'ai un type / une extension de fichier personnalisé auquel je souhaite associer mon application.
Pour autant que je sache, l'élément de données est conçu à cet effet, mais je ne peux pas le faire fonctionner. http://developer.android.com/guide/topics/manifest/data-element.html Selon la documentation et de nombreux messages du forum, cela devrait fonctionner comme ceci:
<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>
Eh bien, ça ne marche pas. Qu'ai-je fait de mal? Je veux simplement déclarer mon propre type de fichier.
Réponses:
Vous avez besoin de plusieurs filtres d'intention pour traiter les différentes situations que vous souhaitez gérer.
Exemple 1, gérer les requêtes http sans les types MIME:
Gérer avec les types MIME, où le suffixe n'est pas pertinent:
Gérez l'intention à partir d'une application de navigateur de fichiers:
la source
Les autres solutions ne fonctionnaient pas de manière fiable pour moi jusqu'à ce que j'ajoute:
Avant cela, cela fonctionnait dans certaines applications, dans d'autres non ...
solution complète pour moi:
la source
mimeType
et une sans si vous voulez être complète. Voir developer.android.com/guide/components/…Les réponses données par Phyrum Tea et yuku sont déjà très informatives.
Je veux ajouter qu'à partir d' Android 7.0 Nougat, il y a un changement dans la façon dont le partage de fichiers entre les applications est géré:
À partir des modifications officielles d' Android 7.0 :
Si vous avez votre propre fichier personnalisé se terminant sans un spécifique
mime-type
(ou je suppose même avec un), vous devrez peut-être ajouter une deuxièmescheme
valeur à votreintent-filter
pour le faire fonctionnerFileProviders
aussi.Exemple:
L'important ici est l'ajout de
au filtre.
J'ai eu du mal à découvrir ce petit changement qui a empêché mon activité de s'ouvrir sur les appareils Android 7.0 alors que tout allait bien sur les anciennes versions. J'espère que cela aide quelqu'un.
la source
File(uri.path)
, il plantera en raison deNo such file or directory
- devra gérer ce scénario différemment lors de la mise à jour pour prendre en charge Nougat +!Mes découvertes:
Vous avez besoin de plusieurs filtres pour gérer les différentes manières de récupérer un fichier. c'est à dire, par pièce jointe gmail, par explorateur de fichiers, par HTTP, par FTP ... Ils envoient tous des intentions très différentes.
Et vous devez filtrer l'intention qui déclenche votre activité dans votre code d'activité.
Pour l'exemple ci-dessous, j'ai créé un faux type de fichier new.mrz. Et je l'ai récupéré à partir de la pièce jointe Gmail et de l'explorateur de fichiers.
Code d'activité ajouté dans onCreate ():
Filtre des pièces jointes Gmail:
Filtre de l'explorateur de fichiers:
Filtre HTTP:
Fonctions privées utilisées ci-dessus:
la source
le
pathPattern
ne fonctionne pas si le chemin du fichier contient un ou plusieurs points avant ".pdf".
Cela fonctionnera:
Ajoutez-en plus si vous souhaitez prendre en charge plus de points.
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
Markus Ressel a raison. Android 7.0 Nougat ne permet plus le partage de fichiers entre les applications à l'aide d'un URI de fichier. Un URI de contenu doit être utilisé. Cependant, un URI de contenu ne permet pas de partager un chemin de fichier, uniquement un type mime. Vous ne pouvez donc pas utiliser un URI de contenu pour associer votre application à votre propre extension de fichier.
Drobpox a un comportement intéressant sur Android 7.0. Lorsqu'il rencontre une extension de fichier inconnue, il semble former une intention URI de fichier, mais au lieu de lancer l'intention, il appelle le système d'exploitation pour savoir quelles applications peuvent accepter l'intention. S'il n'y a qu'une seule application qui peut accepter cet URI de fichier, elle envoie alors un URI de contenu explicite directement à cette application. Ainsi, pour travailler avec Dropbox, vous n'avez pas besoin de modifier les filtres d'intention de votre application. Il ne nécessite pas de filtre d'intention d'URI de contenu. Assurez-vous simplement que l'application peut recevoir un URI de contenu et que votre application avec votre propre extension de fichier fonctionnera avec Dropbox comme avant Android 7.0.
Voici un exemple de mon code de chargement de fichier modifié pour accepter un URI de contenu:
la source
Vous essayez cela, cela vous aidera. Au lieu de pdf, vous pouvez également utiliser d'autres extensions. Vous devez d'abord ajouter une autorisation de lecture de stockage externe dans le fichier androidmanifest.xml .
Ensuite, dans le fichier androidmanifest de la balise Activity, vous ajoutez un filtre d'intention comme indiqué ci-dessous.
Enfin dans votre code, vous obtenez le chemin du fichier pdf comme indiqué ci-dessous:
la source
Essayez d'ajouter
la source
Pour les pièces jointes Gmail, vous pouvez utiliser:
Ajoutez autant de types mime que nécessaire. Je n'en ai besoin que pour mon projet.
la source
Notez que cela permettra à votre application d'ouvrir toutes les pièces jointes gmail, il n'y a aucun moyen de le contourner
la source
Ceux qui ont des problèmes avec d'autres applications File Manager \ Explorer, comme l'ont répondu @yuku et @ phyrum-tea
Cela fonctionne avec l'application de gestion de fichiers par défaut de LG
mais ne pouvait pas fonctionner avec ES File Explorer et d'autres gestionnaires de fichiers alors j'ai ajouté
alors cela fonctionne avec ES Explorer mais le gestionnaire de fichiers LG n'a pas pu détecter le type de fichier donc ma solution est
la source
Content URI ftw, et avec le filtre d'intention dans le manifeste ... si vos fichiers ont une extension personnalisée .xyz, ajoutez un type mime correspondant:
Certaines applications telles que le courrier électronique semblent convertir l'extension en un type mime. Maintenant, je peux cliquer sur la pièce jointe dans l'e-mail et l'ouvrir dans mon application.
la source
Lire le fichier d'ouverture dans kotlin:
la source
Placez ce filtre d'intention dans la balise d'activité du manifeste que vous souhaitez ouvrir en touchant le fichier:
la source
// J'ai essayé ce code. Et cela fonctionne bien. Vous pouvez utiliser ce code pour accepter le fichier pdf.
la source