42 votes

Comment ajouter un type de mime personnalisé ?

Ce que je veux : Pouvoir envoyer mon fichier personnalisé par courrier et l'importer avec mon application à partir du bouton d'aperçu dans GMail ou en l'ouvrant dans un navigateur de fichiers.

Ce que je sais : J'ai lu beaucoup de choses sur les gestionnaires de type mime personnalisés, qu'Android ne se soucie pas de l'extension du fichier, etc., mais comment créer le type mime pour mon fichier personnalisé ?

La question : Dois-je être un fournisseur de contenu ? Je veux juste importer des fichiers (à partir d'une sauvegarde), sans fournir quoi que ce soit. J'ai vu des gens qui avaient des gestionnaires pour "application/abc" et qui disaient que ça fonctionnait bien, mais comment ajouter cette connexion pour mon fichier "myFile.abc" et le type mime ?

Des indications sur la manière d'enregistrer ou de mapper des types de mime personnalisés seraient appréciées. :)

0 votes

Intent-Filter devrait suffire. Jetez un coup d'œil à stackoverflow.com/questions/1733195/

0 votes

Vous n'avez pas vraiment besoin de créer votre propre mimeType. Vous pouvez utiliser une extension de fichier. Regardez dans cette réponse stackoverflow.com/a/2062112/1298357 . C'est très utile !

0 votes

Des nouvelles à ce sujet ?

5voto

DigCamara Points 3345

Pour autant que je sache, les types mime sont assez flexibles (j'ai créé le mien en tant que application/whatever ) et ils sont acceptés immédiatement par Android, dès la version 2.1 de Dalvik. Pour les gérer correctement, j'ai ajouté ce filtre d'intention :

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeType="application/whatever" />
</intent-filter>

Il y a toutefois un bémol. Même si j'ai toujours défini le type de l'Intent d'envoi avec la valeur intent.setType("application/whatever"); sur certains téléphones, j'ai vu que les données réelles à l'arrivée étaient les suivantes application/octet (pour voir la valeur, j'ai assigné l'Intent entrant et inspecté sa valeur directement. Intent currentIntent = getIntent(); ). L'appareil Android récepteur ne savait pas quoi faire avec les données entrantes et me l'a dit. J'ai donc ajouté

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeType="application/octet-stream" />
</intent-filter>

Cette approche pourrait bien sûr être gênante, mais le problème avec Gmail au moins est qu'il n'écrit pas nécessairement le fichier avec le nom tel qu'il arrive, ce qui rend inutile tout chemin que je choisis de définir. Et au moins avec un fichier entrant octet-stream vous savez que ce ne sont pas les données spécifiques d'une application que vous volez... Néanmoins, vous devriez valider les données après coup et ne pas simplement supposer qu'elles sont valables pour votre application.

2voto

Slava Kamzen Points 73
<activity
    android:name="MainActivity"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
    <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:host="{your mime}.com"
               android:scheme="http" >            
        </data>
    </intent-filter>
</activity>

<!--
android:scheme="http" will make android "think" thats this is a link
-->

Maintenant, quand vous recevez un sms avec le texte "http://{your mime}.com" ou en cliquant sur un lien sur le web avec ce texte, votre activité (MainActivity) s'exécutera.

Vous pouvez également ajouter des paramètres :

text = "http://{your mime}.com/?number=111";

Puis dans les méthodes onCreate() ou onResume() vous ajouterez :

Intent intentURI = getIntent();
Uri uri = null;   
String receivedNum = "";  
Log.d("TAG", "intent= "+intentURI);   
if (Intent.ACTION_VIEW.equals(intentURI.getAction())) {  
    if (intentURI!=null){     
        uri = intentURI.getData();   
        Log.d("TAG", "uri= "+uri);   
    }   
    if (uri!=null)   
        receivedNum = uri.getQueryParameter("number");    
}

0 votes

Pouvez-vous, s'il vous plaît, jeter un coup d'œil à cette question ? Elle est en quelque sorte liée à la question posée dans ce fil de discussion. stackoverflow.com/questions/16441330/ stackoverflow.com/questions/16413498/blue-tooth-file-not-

0 votes

Dévalorisé car la question porte sur l'enregistrement d'une extension de fichier avec un type MIME personnalisé, et non sur la création d'un filtre d'intention personnalisé (ce que fournit cette réponse).

2voto

matto1990 Points 1634

Non testé, mais quelque chose comme ça devrait fonctionner. Mettez-le dans votre AndroidManifest.xml avec l'activité dans laquelle vous voulez ouvrir le fichier :

<activity name=".ActivityHere">
    <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="mimeTypeHere" />
    </intent-filter>
</activity>

2voto

Alex Klimashevsky Points 834

Vous n'avez pas vraiment besoin de créer votre propre mimeType. Vous pouvez utiliser une extension de fichier.
Regardez dans cette réponse http://stackoverflow.com/a/2062112/1298357 . C'est très utile !

-3voto

gheese Points 709

Enregistrer un type mime personnalisé en utilisant Android.webkit.MimeTypeMap

1 votes

Pouvez-vous fournir un exemple de la manière de procéder ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X