Introduction aux Intents et récupération d’un fichier

Lundi 5 novembre 2012, 13:55

Il se peut que vous ayez à implémenter une action redondante au système Android pour pouvoir réaliser une action. Afficher la galerie, lancer une vidéo, récupérer un fichier, … Autant de choses disponibles grâces à des applications systèmes et/ou tierces que vous aimeriez utiliser. C’est pourquoi, le système d’Intent existe. En fonction de l’action demandée, vous allez pouvoir réutiliser, en toute transparence, les fonctionnalités des autres applications au sein de la votre. Attention par contre, il se peut que l’action à appeler n’existe pas sur certains smartphones (un apperçu d’image sur certaines ROM constructeur).

Introduction

Il faut savoir que quand vous lancez une Activity ou un Service au sein de votre application, vous utilisez les Intents. En fonction de leur déclaration dans votre Manifest, vos Activities répondront à certaines actions d’intent demandées au sein de l’environnement Android. Pensez-y lors de votre développement. Mais, ne nous attardons pas trop, ici, nous allons voir comment appeler un Intent externe et non une Activity/Service interne. Sachez que les Intents (lors de l’appel d’action) sont composés de deux pièces principales :

  • l’action : l’action à appeler(ACTION_VIEW, ACTION_MAIN, …)
  • la data : un numéro de téléphone, un email, le chemin complet vers un fichier, … Lors de l’appel à une Activity ou un Service interne à votre application, ces deux éléments sont rarement nécessaires car vous savez quel Intent appeler. Les Intents ont aussi d’autres options qui sont, elles, optionnelles :
  • la catégorie : Donne des informations supplémentaires sur l’action à exécuter. Par exemple, CATEGORY_LAUNCHER signifie qu’il doit apparaître dans le Lanceur comme une application de haut niveau.
  • le type : Ici il s’agit du MIME-TYPE. Le plus souvent indiquée quaond on cherche par exemple un fichier d’un format spécial (ex : application/pdf)
  • le composant : Spécifie un nom explicite d’une classe de composants à utiliser pour l’intent.
  • les extras : Passés grâce à un Bundle, les extras sont des données qui transitent entre les intents (souvent utilisés pour passer des informations entre les activities d’une même application).

Je ne traiterai pas plus en détail la composition des intents. Google l’a très bien fait dans la documentation sur les intents. Mais je finirai quand meme par la liste des principales actions disponibles pour les Intents :

  • ACTION_VIEW : En fonction des informations passées dans les datas, ouvrira soit la galerie, la feuille d’un contact, …
  • ACTION_DIAL : Affichera le clavier téléphonique avec le numéro passé en data.
  • ACTION_EDIT : En fonction des données passées dans data, affichera le formulaire d’édition d’un évènement de l’agenda, d’un contact, …

Cas Pratique :

Récupération d’un fichier Maintenant que nous avons vu comment lancer un Intent pour effectuer une action redondante dans notre application, nous allons voir comment récupérer un fichier PDF au sein de notre téléphone. Sachez que pour réaliser ceci, nous allons utiliser l’action

ACTION_GET_CONTENT. Je pense que le nom est assez explicite pour tous. Dans le cas contraire, ça veut dire que nous cherchons les Intents pouvant nous permettre de récupérer du contenu. Voici le code nécessaire à l’utilisation d’un tel Intent :

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
startActivity(intent);

Bien évidemment, lancer l’intent avec un startActivity() lancera bien l’action désirée mais nous n’auront aucun retour. Pour pouvoir avoir un retour, nous devrons utiliser startActivityForResult() :

private static final int PICK_FILE_RESULT_CODE = 1;

//...

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
try {
    startActivityForResult(intent,PICK_FILE_RESULT_CODE);
} catch (Exception e) {
    e.printStackTrace();
}

L’utilisation du Try/Catch ici est nécessaire et prévient les erreurs si jamais aucun Intent pour l’action demandée n’existe. La variable PICK_FILE_RESULT_CODE va nous servire pour vérifier le retour de l’intent dans notre onActivityResult().

Bien entendu, vous pouvez utiliser un autre code retour. Ici il n’a que valeur d’exemple. Bien entendu, notre code est incomplet. Lancé tel quel, vous récupérerez du PDF comme du MP3 en passant par les images. Pour pouvoir récupérer uniquement du PDF, il faudra indiquer le mime-type dans la fonction setType(). De plus, même avec ceci, Android listera aussi les fichiers ne pouvant être ouvert.

Pour pouvoir les masquer, il faudra rajouter la catégorie CATEGORY_OPENABLE à notre Intent. Pour finir, avec le code actuel, Android ne vous permettra pas de choisir entre plusieurs Intent celui que vous préférez pour effectuer l’action. Pour pouvoir le faire, il faudra créer un nouvel Intent grâce au premier grâce à la méthode statique createChooser().

Le code final devrait donc ressembler à ceci :

private static final int PICK_FILE_RESULT_CODE = 1;

//...

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("application/pdf");
intent.addCategory(Intent.CATEGORY_OPENABLE);
Intent i = Intent.createChooser(intent, "File");
try {
    startActivityForResult(i,PICK_FILE_RESULT_CODE);
} catch (Exception e) {
    e.printStackTrace();
}

Attention : Il n’est pas possible de sélectionner différents Mime-Type en même temps autrement qu’avec les opérateurs ‘*’ (ex : application/*). Si vous voulez certains types de fichier il faudra effectuer les tests dans le onActivityResult().

Pour pouvoir récupérer le résultat de l’Intent et, par la même occasion, votre fichier, il vous suffira d’implémenter la fonction onActivityResult() comme ceci :

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
         case PICK_FILE_RESULT_CODE: {
             if (resultCode == Activity.RESULT_OK && 
                 data!=null && data.getData()!=null) 
             {
                 String theFilePath = data.getData().getPath();
             }
             break;
          }
    }
} 

Attention : Si vous lancez l’Intent dans un Fragment avec getActivity().startActivityForResult(), il faudra implémenter onActivityResult() dans l’Activity du Fragment. Si vous lancez l’intent sans le getActivity(), vous devrez implémenter le onActivityResult() dans le Fragment.

Conclusion

Maintenant vous savez utiliser en partie les Intent pour effectuer des action déjà existantes au sein de l’écosystème Android. Sachez que vous pouvez changer facilement le type d’applications lazncées dans l’exemple juste en changeant le Mime-Type. Essayez de récupérer une image pour voir.

Bref, pour en revenir à une vrai conclusion, l’une des forces majeures d’Android reste son système d’Intent. Vous pouvez facilement récupérer des données systèmes et utiliser des applications tierces grâce àcette méthode et grâce aux droits associés. (Essayez de lancer un appel téléphonique sans l’autorisation nécessaire et c’est le drame). Toutefois, n’en abusez pas trop et, vérifiez avant leur utilisation si vous êtes certains que telle ou telle action est disponible sur tous les Devices.

Selon certaines ROM de constructeurs (oui, toi SAMSUNG, et toi Orange), certains Intent systèmes ont été tout bonnement et simplement supprimés et non remplacés.

Throrïn
A propos de l'auteur
Benjamin Besse

Je suis Analyste Développeur chez Goomeo et je suis passioné par tout ce qui touche aux technologies du Web. J'ai commencé par apprendre l'utilisation du Framework Zend et j'ai continué naturellement via Android. Le tout seulement avec les bases acquises en DUT et Licence professionnelle Informatique.

Laisser un commentaire

Commentaires

Introduction aux Intents et récupération d’un fichier http://t.co/tr9FBklJ via @throrin19

RT @ygort: Introduction aux Intents et récupération d’un fichier http://t.co/tr9FBklJ via @throrin19

RT @ygort: Introduction aux Intents et récupération d’un fichier http://t.co/tr9FBklJ via @throrin19