Filtre d'intention Android: associez l'application à l'extension de fichier


92

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.


Ajouter android: label = "@ string / app_name" dans le filtre d'intention
Prashant

Réponses:


116

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:

  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" />
    <data android:host="*" />
    <data android:pathPattern=".*\\.pdf" />
  </intent-filter>

Gérer avec les types MIME, où le suffixe n'est pas pertinent:

  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" />
    <data android:host="*" />
    <data android:mimeType="application/pdf" />
  </intent-filter>

Gérez l'intention à partir d'une application de navigateur de fichiers:

  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="file" />
    <data android:host="*" />
    <data android:pathPattern=".*\\.pdf" />
  </intent-filter>

J'ai pensé que l'hôte = "*" pouvait être omis, mais il a commencé à être trop large.
Phyrum Tea

@Phyrum Tea: Existe-t-il un moyen d'associer une extension de fichier à une AUTRE application à l'aide de mon application? Mon application génère des fichiers .list que je veux dire à Android qu'il s'agit de fichiers texte et les ouvrir avec un éditeur de texte (mon application n'est PAS un éditeur de texte).
Luis A. Florit

@ LuisA.Florit avez-vous essayé d'appeler vos fichiers * .txt? Cela peut fonctionner.
Gavriel

l'extension personnalisée ne fonctionne pas sans MimeType. Si je donne le type MIME comme / mon application s'affiche lorsque je clique également sur la notification Gmail.
madan V

1
Ne fonctionne pas .. J'en ai marre maintenant de chercher des 2 derniers jours n'a pas fonctionné. Im using android 9
Ahmad Arslan

49

Les autres solutions ne fonctionnaient pas de manière fiable pour moi jusqu'à ce que j'ajoute:

android:mimeType="*/*" 

Avant cela, cela fonctionnait dans certaines applications, dans d'autres non ...

solution complète pour moi:

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="file"  android:host="*" android:pathPattern=".*\\.EXT" android:mimeType="*/*"  />
</intent-filter>

1
Hou la la! cela m'a aidé. Il semble que la documentation Android soit incorrecte. Tout (schéma, hôte, chemin [Pattern], mimeType) doit être déclaré fonctionner
Gavriel

Vous devriez avoir à la fois une règle avec mimeTypeet une sans si vous voulez être complète. Voir developer.android.com/guide/components/…
Andrew Sun

1
Que faire si vous souhaitez ouvrir votre application de fichiers depuis Gmail?
IgorGanapolsky

31

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 :

Pour les applications ciblant Android 7.0, l'infrastructure Android applique la stratégie d'API StrictMode qui interdit d'exposer des URI file: // en dehors de votre application. Si un intent contenant un URI de fichier quitte votre application, l'application échoue avec une exception FileUriExposedException.

Pour partager des fichiers entre applications, vous devez envoyer un content: // URI et accorder une autorisation d'accès temporaire sur l'URI. Le moyen le plus simple d'accorder cette autorisation consiste à utiliser la classe FileProvider. Pour plus d'informations sur les autorisations et le partage de fichiers, consultez Partage de fichiers.

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ème schemevaleur à votre intent-filterpour le faire fonctionner FileProvidersaussi.

Exemple:

<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:scheme="content" />
    <data android:mimeType="*/*" />
    <!--
        Work around Android's ugly primitive PatternMatcher
        implementation that can't cope with finding a . early in
        the path unless it's explicitly matched.
    -->
    <data android:host="*" />
    <data android:pathPattern=".*\\.sfx" />
    <data android:pathPattern=".*\\..*\\.sfx" />
    <data android:pathPattern=".*\\..*\\..*\\.sfx" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\.sfx" />
    <!-- keep going if you need more -->

</intent-filter>

L'important ici est l'ajout de

<data android:scheme="content" />

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.


Sans cette astuce et ces informations supplémentaires, je ne pourrais pas enregistrer mon application auprès des explorateurs de fichiers. Ceci est crucial et devrait être voté pour
u2tall

Vous avez sauvé un jour! Big tnx. Cela devrait être une réponse acceptée!
Andris

⚠️ Si vous essayez d'obtenir le fichier fourni via un schéma de contenu, par exemple File(uri.path), il plantera en raison de No such file or directory- devra gérer ce scénario différemment lors de la mise à jour pour prendre en charge Nougat +!
Jordan H

19

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 ():

        Intent intent = getIntent();
        String action = intent.getAction();

        if (action.compareTo(Intent.ACTION_VIEW) == 0) {
            String scheme = intent.getScheme();
            ContentResolver resolver = getContentResolver();

            if (scheme.compareTo(ContentResolver.SCHEME_CONTENT) == 0) {
                Uri uri = intent.getData();
                String name = getContentName(resolver, uri);

                Log.v("tag" , "Content intent detected: " + action + " : " + intent.getDataString() + " : " + intent.getType() + " : " + name);
                InputStream input = resolver.openInputStream(uri);
                String importfilepath = "/sdcard/My Documents/" + name; 
                InputStreamToFile(input, importfilepath);
            }
            else if (scheme.compareTo(ContentResolver.SCHEME_FILE) == 0) {
                Uri uri = intent.getData();
                String name = uri.getLastPathSegment();

                Log.v("tag" , "File intent detected: " + action + " : " + intent.getDataString() + " : " + intent.getType() + " : " + name);
                InputStream input = resolver.openInputStream(uri);
                String importfilepath = "/sdcard/My Documents/" + name; 
                InputStreamToFile(input, importfilepath);
            }
            else if (scheme.compareTo("http") == 0) {
                // TODO Import from HTTP!
            }
            else if (scheme.compareTo("ftp") == 0) {
                // TODO Import from FTP!
            }
        }

Filtre des pièces jointes Gmail:

        <intent-filter android:label="@string/app_name">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="content" />
            <data android:mimeType="application/octet-stream" />
        </intent-filter>
  • LOG: Intention de contenu détectée: android.intent.action.VIEW: content: //gmail-ls/l.foul@gmail.com/messages/2950/attachments/0.1/BEST/false: application / octet-stream: nouveau. mrz

Filtre de l'explorateur de fichiers:

        <intent-filter android:label="@string/app_name">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:pathPattern=".*\\.mrz" />
        </intent-filter>
  • LOG: intention de fichier détectée: android.intent.action.VIEW: file: ///storage/sdcard0/My%20Documents/new.mrz: null: new.mrz

Filtre HTTP:

        <intent-filter android:label="@string/rbook_viewer">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http" />
            <data android:pathPattern=".*\\.mrz" />
        </intent-filter>

Fonctions privées utilisées ci-dessus:

private String getContentName(ContentResolver resolver, Uri uri){
    Cursor cursor = resolver.query(uri, null, null, null, null);
    cursor.moveToFirst();
    int nameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
    if (nameIndex >= 0) {
        return cursor.getString(nameIndex);
    } else {
        return null;
    }
}

private void InputStreamToFile(InputStream in, String file) {
    try {
        OutputStream out = new FileOutputStream(new File(file));

        int size = 0;
        byte[] buffer = new byte[1024];

        while ((size = in.read(buffer)) != -1) {
            out.write(buffer, 0, size);
        }

        out.close();
    }
    catch (Exception e) {
        Log.e("MainActivity", "InputStreamToFile exception: " + e.getMessage());
    }
}

L'activité doit-elle être de type lanceur ou principal? Parce que j'ai essayé le filtre des pièces jointes Gmail et que cela ne fonctionne pas.
Amit le

15

le pathPattern

<data android:pathPattern=".*\\.pdf" />

ne fonctionne pas si le chemin du fichier contient un ou plusieurs points avant ".pdf".

Cela fonctionnera:

<data android:pathPattern=".*\\.pdf" />
<data android:pathPattern=".*\\..*\\.pdf" />
<data android:pathPattern=".*\\..*\\..*\\.pdf" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.pdf" />

Ajoutez-en plus si vous souhaitez prendre en charge plus de points.


1
Pour l'instant, c'est la seule option pour accéder aux sous-dossiers
LokiDroid

J'utilise le même code mais IDE me donne un avertissement, voir cette question stackoverflow.com/questions/35833776/…
AndreaF

5

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.


5

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:

Uri uri = getIntent().getData();
if (uri != null) {
    File myFile = null;
    String scheme = uri.getScheme();
    if (scheme.equals("file")) {
        String fileName = uri.getEncodedPath();
        myFile = new File(filename);
    }
    else if (!scheme.equals("content")) {
        //error
        return;
    }
    try {
        InputStream inStream;
        if (myFile != null) inStream = new FileInputStream(myFile);
        else inStream = getContentResolver().openInputStream(uri);
        InputStreamReader rdr = new InputStreamReader(inStream);
        ...
    }
}

2

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 .

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Ensuite, dans le fichier androidmanifest de la balise Activity, vous ajoutez un filtre d'intention comme indiqué ci-dessous.

            <action android:name="android.intent.action.SEND" />

            <action android:name="android.intent.action.VIEW" />

             <category android:name="android.intent.category.DEFAULT" />

            <data android:mimeType= "application/pdf" />

            <data android:host="*" />

        </intent-filter>

Enfin dans votre code, vous obtenez le chemin du fichier pdf comme indiqué ci-dessous:

Intent intent=getIntent();

if(intent!=null) {          

        String action=intent.getAction();

        String type=intent.getType();

        if(Intent.ACTION_VIEW.equals(action) && type.endsWith("pdf")) {

            // Get the file from the intent object

            Uri file_uri=intent.getData();

            if(file_uri!=null)

                filepath=file_uri.getPath();

            else

                filepath="No file";

        }

        else if(Intent.ACTION_SEND.equals(action) && type.endsWith("pdf")){

            Uri uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);

            filepath = uri.getPath();

        }

Pour cette Intent.ACTION_VIEW, impossible de récupérer le chemin du fichier, cela provoque l'erreur: java.io.FileNotFoundException: Autorisation refusée. Ce n'est qu'à partir de certaines applications spécifiques, pas à chaque fois. des solutions?
Hardik Joshi

@HardikJoshi Les applications ne définissent peut-être pas l'autorisation GRANT_READ_URI_PERMISSION.
Mira_Cole

1

Essayez d'ajouter

<action android:name="android.intent.action.VIEW"/>

Maintenant que cela fonctionne avec les types de fichiers définis en usine comme application / pdf, comment déclarer mon propre type de fichier? Et quand je dis type de fichier, je veux dire mimeType;)
Tamas

Quel type de fichier voulez-vous que ce type MIME capture? De plus, ce fichier est-il ouvert à partir du navigateur ou du gestionnaire de fichiers ou envoyé à partir d'une autre application que vous avez créée?
magaio du

peut provenir du navigateur, du client de messagerie, du gestionnaire de fichiers ou de n'importe où. Ou ma propre extension de fichier app ofc :) est personnalisée, spécifiée par le client.
Tamas du

Eh bien, je suis toujours coincé ... quelqu'un pourrait-il m'aider s'il vous plaît
Tamas

@Tamas avez-vous tous trié ce problème. Je suis coincé là-dessus!
StuStirling

1

Pour les pièces jointes Gmail, vous pouvez utiliser:

<intent-filter android:label="@string/app_name">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="content" />
  <data android:mimeType="application/pdf" /> <!-- .pdf -->
  <data android:mimeType="application/msword" /> <!-- .doc / .dot -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" /> <!-- .docx -->
  <data android:mimeType="application/vnd.ms-excel" />  <!-- .xls / .xlt / .xla -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />  <!-- .xlsx -->
  <data android:mimeType="application/vnd.ms-powerpoint" />  <!-- .ppt / .pps / .pot / .ppa -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" /> <!-- .pptx -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.slideshow" /> <!-- .ppsx -->
  <data android:mimeType="application/zip" /> <!-- .zip -->
  <data android:mimeType="image/jpeg" /> <!-- .jpeg -->
  <data android:mimeType="image/png" /> <!-- .png -->
  <data android:mimeType="image/gif" /> <!-- .gif -->
  <data android:mimeType="text/plain" /> <!-- .txt / .text / .log / .c / .c++ / ... -->

Ajoutez autant de types mime que nécessaire. Je n'en ai besoin que pour mon projet.


1
         <!--
            Works for Files, Drive and DropBox
        -->
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:mimeType="*/*" />
            <data android:host="*" />
            <data android:pathPattern=".*\\.teamz" />
        </intent-filter>

        <!--
            Works for Gmail
        -->
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:host="gmail-ls" android:scheme="content" android:mimeType="application/octet-stream"/>
        </intent-filter>

Notez que cela permettra à votre application d'ouvrir toutes les pièces jointes gmail, il n'y a aucun moyen de le contourner


Cela gérera chaque fichier envoyé par e-mail à l'utilisateur, pas seulement .teamz
IgorGanapolsky

1

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

     <intent-filter android:label="@string/app_name_decrypt">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:pathPattern=".*\\.lock" />
            <data android:pathPattern=".*\\..*\\.lock" />
            <data android:pathPattern=".*\\..*\\..*\\.lock" />
        </intent-filter>

mais ne pouvait pas fonctionner avec ES File Explorer et d'autres gestionnaires de fichiers alors j'ai ajouté

 android:mimeType="*/*"

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

     <intent-filter android:label="@string/app_name_decrypt">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:pathPattern=".*\\.lock" />
            <data android:pathPattern=".*\\..*\\.lock" />
            <data android:pathPattern=".*\\..*\\..*\\.lock" />
        </intent-filter>
        <intent-filter android:label="@string/app_name_decrypt">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file"/>
            <data android:scheme="content" />
            <data android:mimeType="*/*" />
            <data android:pathPattern=".*\\.lock" />
            <data android:pathPattern=".*\\..*\\.lock" />
            <data android:pathPattern=".*\\..*\\..*\\.lock" />
        </intent-filter>

1

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:

        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />

            <data
                android:host="*"
                android:mimeType="application/xyz"
                android:scheme="content" />
        </intent-filter>

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.


1

Lire le fichier d'ouverture dans kotlin:

private fun checkFileOpening(intent: Intent) {
    if (intent.action == Intent.ACTION_VIEW && (intent.scheme == ContentResolver.SCHEME_FILE
                    || intent.scheme == ContentResolver.SCHEME_CONTENT)) {

        val text = intent.data?.let {
            contentResolver.openInputStream(it)?.bufferedReader()?.use(BufferedReader::readText) 
        }
    }
}

-1

Placez ce filtre d'intention dans la balise d'activité du manifeste que vous souhaitez ouvrir en touchant le fichier:

<intent-filter android:priority="999">
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.OPENABLE" />

    <data android:host="*" />
    <data android:mimeType="application/octet-stream" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\.yourextension" />
    <data android:scheme="content" />
</intent-filter>

-1

// J'ai essayé ce code. Et cela fonctionne bien. Vous pouvez utiliser ce code pour accepter le fichier pdf.

<intent-filter>
   <action android:name="android.intent.action.SEND" />
   <category android:name="android.intent.category.DEFAULT" />
   <data android:mimeType="application/pdf" />
   <data android:pathPattern=".*\\.pdf" />
   <data android:pathPattern=".*\\..*\\.pdf" />
   <data android:pathPattern=".*\\..*\\..*\\.pdf" />
   <data android:pathPattern=".*\\..*\\..*\\..*\\.pdf" />
</intent-filter>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.