Monthly Archives

3 Articles
Envoyer un mail sans application tierce.

Envoyer un mail sans application tierce.

Bonjour à tous, Aujourd’hui nous allons nous attaquer à l’envoi de mail sans passer par une application tierce. Tout cela sera réalisé avec la librairie JavaMail.

Dans quel cas utiliser cette méthode ?

Plutôt que d’utiliser des applications beaucoup plus optimisées, moi je l’utilise au travail, pour envoyer les crash de mes applications en background (caché de mon utilisateur). Vous allez me dire, il y a bien ACRA, mais il demande une interaction utilisateur, et parfois les personnes ne prennent pas le temps de faire « send report »… 

Il est possible de recevoir/envoyer des mails, ajouter des pièces jointes etc. Très complète comme librairie. Mais je ne vais vous présenter que l’envoi via une petite application très rapide.

Bien entendu, c’est un tuto, beaucoup de tests (adresse mail, etc), de gestion de spam de clique « envoyé » ne sont pas présents.

Nous allons nous pencher légèrement sur la classe Mail, elle défini en gros toutes les options et les paramètres de l’envoi de mail.

public class Mail extends javax.mail.Authenticator {

    private String _user;
    private String _pass;
    private String[] _to;
    private String _from;
    private String _port;
    private String _sport;
    private String _host;
    private String _subject;
    private String _body;
    private boolean _auth;
    private boolean _debuggable;
    private Multipart _multipart;

    public Mail() {
        _host = "smtp.gmail.com";
        _port = "25";
        _sport = "465";
        _subject = "";
        _body = "";
        _debuggable = false;
        _auth = true;
        _multipart = new MimeMultipart();

        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
        CommandMap.setDefaultCommandMap(mc);
    }

    public Mail(String user, String pass) {
        this();
        _user = user;
        _pass = pass;
    }

    public boolean send() throws Exception {
        Properties props = _setProperties();
        if (!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) {
            Session session = Session.getInstance(props, this);
            Transport transport = session.getTransport("smtp");
            if (!transport.isConnected()) {
                /** ouvre la connexion si elle ne l'est pas faite ! */
                transport.connect(_user, _pass);
            }
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(_from));
            InternetAddress[] addressTo = new InternetAddress[_to.length];
            for (int i = 0; i < _to.length; i++) {
                addressTo[i] = new InternetAddress(_to[i]);
            }
            msg.setRecipients(MimeMessage.RecipientType.TO, addressTo);
            msg.setSubject(_subject);
            msg.setSentDate(new Date());
            BodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText(_body);
            _multipart.addBodyPart(messageBodyPart);
            msg.setContent(_multipart);
            //   Transport.send(msg);
            transport.sendMessage(msg, msg.getAllRecipients());
            System.out.println("envoyé");
            return true;
        } else {
            return false;
        }
    }

    public void addAttachment(String filename) throws Exception {
        BodyPart messageBodyPart = new MimeBodyPart();
        FileDataSource source = new FileDataSource(filename);
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName(filename);

        _multipart.addBodyPart(messageBodyPart);
    }

    @Override
    public PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(_user, _pass);
    }

    private Properties _setProperties() {
        Properties props = new Properties();
        props.put("mail.smtp.host", _host);
        if (_debuggable) {
            props.put("mail.debug", "true");
        }
        if (_auth) {
            props.put("mail.smtp.auth", "true");
        }
        props.put("mail.smtp.port", _port);
        props.put("mail.smtp.socketFactory.port", _sport);
        props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");
        return props;
    }
//getter and setter
}

Ensuite elle réalise déjà pas mal de test, sur les paramètres obligatoires d’un mail, et renverra faux à l’envoi. Donc elle réalisé déjà le gros de votre travail si vous oubliez des champs… Transport a deux méthodes send. Une send et une autre sendMessage. Il y a une grosse différence entres les deux.

Tout d’abord send() est une static, et dans l’API il est dit « unlike this method »… En plus, juste avant l’appel de l’envoi, nous instancions Transport, pour tester si l’utilisateur (user dans l’app) est bien connecté, si non, il le ferra. Donc autant utiliser la meilleure méthode qui n’appellera pas le saveChanges et donc ira plus vite à l’envoi.

Encore une idée d’apparence de formulaire 😀

Ensuite, pour en revenir à l’application tuto, nous réalisons qu’il est très facile d’utilisation la création de mail. N’oubliez pas qu’elle doit être envoyé dans un Thread a part. Sinon l’application freezera jusqu’à ce que l’envoi soit réalisé.

public class TutoSendMail extends Activity implements OnClickListener{

    public Mail m;

    private EditText mailEdit;
    private EditText pwdEdit;
    private EditText toEdit;
    private EditText subjectEdit;
    private Button sendMail;

    private String user;
    private String pwd;
    private String to;
    private String subject;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.tutosendmail_view);

        mailEdit = (EditText) findViewById(R.id.editMail);
        pwdEdit  = (EditText) findViewById(R.id.editMdp);
        toEdit = (EditText) findViewById(R.id.editTo);
        subjectEdit = (EditText) findViewById(R.id.editSubject);
        sendMail = (Button) findViewById(R.id.buttonSend);
        /** surtout pas oublier d'assigner le onclick au bouton */
        sendMail.setOnClickListener(this);
    }

    /**
     * AsyncTask pour envoyer le mail
     * @author fritte
     *
     */
    private class SendMail extends AsyncTask<Void, Void, String[]> {
        private boolean envoye;

        @Override
        protected String[] doInBackground(Void... params) {

            /** user et pwd de qui envoie */
            m = new Mail(user, pwd);
            /** a qui j'envoie */
            String[] toArr = {
                to
            };
            m.set_to(toArr);
            /** le 'from' de qui vient le mail */
            m.set_from(user);
            /** le sujet */
            m.set_subject("Test envoi mail via javamail");
            /** et le message */
            m.set_body(subject);
            try {
                /** l'envoi */
                if (m.send()) {
                    envoye = true;
                } else {
                    envoye = false;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String[] result) {
            super.onPostExecute(result);
            if (envoye) {
                Crouton.makeText(TutoSendMail.this, getString(R.string.envoye), Style.CONFIRM).show();
            } else {
                Crouton.makeText(TutoSendMail.this, getString(R.string.pasenvoye), Style.ALERT).show();
            }
        }
    }

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.buttonSend:
                if (testIfNull()) {
                    /** on pourrait même lancer une progressDialogue dans l'action barre, comme pour le refresh G+ etc */
                    new SendMail().execute();
                }
                break;
        }
    }

    /**
     * on peut tester aussi avec un regex les mails s'ils sont correct etc...
     * @return
     */
    private boolean testIfNull() {
        boolean OK;
        if (mailEdit.getText().toString().length() > 0
            && pwdEdit.getText().toString().length() > 0
            && toEdit.getText().toString().length() > 0
            && subjectEdit.getText().toString().length() > 0) {

            user = mailEdit.getText().toString();
            pwd = pwdEdit.getText().toString();
            to = toEdit.getText().toString();
            subject = subjectEdit.getText().toString();
            OK = true;
        } else {
            OK = false;
            Crouton.makeText(TutoSendMail.this, getString(R.string.erreur_champs_vides), Style.ALERT).show();
        }
        return OK;
    }
}

Si vous avez des questions, n’hésitez pas. Voici le lien vers le code source de l’application avec le tutorial d’avant, Crouton et Toast  https://code.google.com/p/fritte-tuto-master/

Nexus 4 Review (et un de plus)
Rien à redire devant un téléphone aussi bien réussi

Nexus 4 Review (et un de plus)

Aujourd’hui, et après une semaine en sa possession, je vais vous faire mon retour sur le Nexus 4. Un retour assez bref car avec toutes les Reviews qui traînent entre le prototype, la version finale, la version qui est en rupture, celle livrée dans 3 semaines, celle en forme de pizza, … Il y a de quoi faire. Donc, je vais vous présenter le Nexus 4 en apparence, avec le packaging fait par google, ensuite je vais vous parler de l’expérience Android qui va avec car, comparé aux téléphones, la game nexus donne une expérience pure d’Android (aucune surcouche pourrie made in Samsung, Orange et consort). Je terminerai pas vous parler de la partie multimédia de ce superbe appareil avant de conclure.

Packaging et Apparence

Pour ma part, quand j’ai reçu le Nexus 4, j’ai été impressionné par la taille du colis. Sur le coup, j’ai cru qu’ils avaient confondu avec une Nexus 10. J’en viens à penser que les excuses de retard et d’épuisement viennent du fait que Google n’avait pas prévu assez de colis. Bref, après avoir bataillé pour enlever le papier à bulle, je suis tombé sur cette magnifique boîte :

Bon, elle est abîmée à cause de ma sortie du papier bulle. Ne vous en faites pas.

Comme d’habitude, la boîte contient un câble USB/micro USB, adaptateur secteur, écouteurs et bien entendu, un Nexus 4. Le Nexus 4 quand à lui est de très très bonne qualité. Pour ma part, je dirais même qu’il s’agit de la meilleure qualité de téléphone que j’ai pu voir jusqu’à maintenant (même l’Iphone 5 ne nui arrive pas à la cheville). Au premier coup d’oeil, on peut se dire qu’il fait bien gros et qu’on aura du mal à le tenir. Je vous rassure, ayant utilisé toutes les tailles de téléphones Android jusqu’ici, je le trouve vraiment pratique à tenir avec même une meilleure prise en main qu’un Galaxy S2 par exemple. J’ai même testé la différence entre lui et un S3 et c’est sans appel : le Nexus 4 a une bien meilleure prise en main que son homologue.

Oh mon dieu, mais c’est énorme!

A noter aussi (et tout le monde le met dans sa review) le dos holographique du Nexus 4 qui, malgré ce que je pensais, n’est pas si voyant et qui donne un effet encore plus « classe » à notre smartphone. Ce dos, qui se trouve être aussi en verre, peut vous sembler fragile et, après un semaine d’utilisation, je n’ai aucune rayure, trace, … En fait, si vous ne le savez pas, depuis l’Iphone 4, le dos est aussi en verre et personne a crié « oh mon dieu, mais c’est fragile » mais plus tôt « oh mon dieu c’est trop classe ». Pour le Nexus 4, je serais d’avis de crier aussi la seconde phrase.

Enfin réussi à prendre une photo avec le dos holographique

Petit effet qui a son charme et qui, je trouve, donne un vrai plus au confort d’utilisation, c’est le petit arrondi qu’il y a sur les côté droit et gauche de l’écran. Les tranches de l’appareil sont carrées mais douces au toucher avec un petit style d' »allu brossé » sur le dessus. Les boutons, ayant le même style pour régler le son et déverouiller l’écran sont eux placés comme la plupart des nouveaux smartphones (enfin une norme de placement?). Le micro USB est très bien placé (comme les autres nexus) en bas de l’appareil pour permettre, dans un futur proche, la compatibilité avec toutes les stations d’accueil micro USB. Pour ce qui est de la prise Jack en haut, certains ont criés au scandal car depuis le Nexus S, il est placé en bas. Moi je trouve ça plus pratique car, si vous mettez votre téléphone sur une station de charge micro USB, vous n’avez plus accès au jack et donc, vous ne pouvez pas brancher vos écouteurs. Là, vous pouvez concilier les deux facilement.

Rien à redire devant un téléphone aussi bien réussi

Pour ce qui est du poids, je l’ai trouvé quasi aussi lourd que le Galaxy S3. Pourtant, le S3 me semble beaucoup plus cheap que le Nexus S que ce soit au touché ou à la main. Pour vous donner une idée, malgrès une taille d’écran plus grande, le Nexus 4 se trouve être plus petit de quelques milimètres que le S3 pour une épaisseur équivalente.

Expérience Android

Comme dit au cours de l’introduction, le Nexus 4 utilise le design de base d’Android. Vous aurez donc l’utilisation la plus pure du système avec un total respect des guidelines dans les applications de base. Il faut savoir que normalement, depuis android 4.0, la touche dite menu n’existe plus. Une autre touche, permettant elle d’avoir accès à votre historique d’applications lancées, a fait son apparition. Ces 3 touches de base (avec la touche retour) suffisent à naviguer au sein d’Android (pas comme le gros bouton home physique de chez Samsung).

Plus aucun bouton physique

Si vous ne le savez ps, le Nexus 4 est installé avec la dernière version en date d’Android. A savoir la version 4.2 Jelly Bean. Cette version n’a pas trop de nouveautés par rapport à la version précédente si ce n’est ce que je vais vous indiquer dans la suite du sujet. Nous allons faire un tour bref des nouveautés avec l’interface pure  d’Android 4.2.

Voici un de mes bureau. Celui-ci, c’est le social.

Tout d’abord, nous allons voir la Home et le launcher. Si vous êtes un habitué d’Android, vous n’êtes pas sans savoir que, comparé à ses concurents, on a accès à un Bureau et à la liste des applications séparéments. Ce bureau peut, comme le bureau Windows, avoir certains raccourcis d’application. Il peut aussi avoir des widgets et, cerise sur le gâteau, vous pouvez définir un fond d’écran. Autant sur Iphone, vous pouvez personnaliser la coque avec un bumper, autant avec Android vous pouvez personnaliser votre écran. A savoir que l’écran définit pour le bureau sera le même que celui de votre lockscreen. De base, le « Home » contient 5 bureaux. Dans la version basique d’Android, il n’est pas possible de changer le nombre de bureau, leur placement ou l’animation de transition entre les bureaux.

On est passé de 4 items par ligne à 5 items avec la 4.2

Pour ce qui est de la liste des applications, dans les anciennes versions, elles étaient disposées en 4×5 à l’écran. Depuis la 4.2, Google a un peu tassé le tout avec du 5×5 (ah, on me dit dans l’oreillette que seul ne nexus 4 est touché par cette modification). Personnellement, je ne suis pas trop fan de ce tassage car certaines applications ont leur nom qui colle avec la suivante ce qui peut donner un effet de mal finit. L’onglet Widget ne change pas du tout par rapport à l’ancienne version. Vous sélectionnez votre widget et vous le faites glisser sur le bureau à l’emplacement voulu. Idem pour l’icône d’accès au market qui n’a pas changé depuis la 4.0.

Enfin des raccourcis de paramètres

L’une des nouveautés de la 4.2, qui a été découverte avec le Nexus 4, c’est le fait d’avoir accès à des raccourcis de réglages directement dans la barre de notification. Pour y accéder, vous avez deux possibilités. Soit vous accédez à la barre de notification standard et vous cliquez sur le bouton vous affichant les raccourcis, soit vous faites glisser la barre de notification avec deux doigts et vous y êtes directement. Ces raccourcis ont été, au début, identifier comme des boutons ON:OFF de réglages comme ce que font les Samsung et autres téléphones sous Cyanogen. Malheureusement il s’agit juste de réglages vers des endroits des paramètres. Enfin sauf pour le bouton du mode avion qui fait bien office d’interrupteur. Ce que je trouve dommage aussi, c’est de ne pas pouvoir enrichir cet écran avec de nouveaux raccourcis et/ou interrupteurs. A voir avec une mise à jour si Google va améliorer ça.

Voici un vrai Lockscreen

Ensuite, l’autre grosse nouveauté, est le fait d’avoir des widgets sur le lockscreen. De base, deux widgets sont disponibles : l’horloge et l’appareil photo. Lors du déverrouillage de l’écran, vous n’avez plus accès directement à l’appareil Photo, il faudra passer au nouveau widget disponible à droite de l’horloge (en tout cas de base). De base, vous avez la possibilité de rajouter les widgets suivants : Gmail, Agenda, Horloge et SMS.

Voici le nouveau raccourcis vers l’appareil photo

Vous remarquerez un petit cercle en lieu et place de nos trois boutons de navigation sur l’écran de verrouillage. Il s’agit simplement d’un raccourcis pour lancer GoogleNow au déverrouillage du téléphone.

Nous irons vor les autres nouveautés qui, elles concernent le multimiédia, dans la partie suivante.

Multimédia

Niveau multimédia, le Nexus 4 a de quoi faire. Il permet de lire facilement la plupart des formats vidéos disponibles sur le marché. Si ça ne marche pasz, optez pour une application dédiée à la lecture vidéo comme MxPlayer qui, selon moi, est le meilleur des lecteurs vidéos disponible sur Android. Outre ceci, sachez que Le Nexus 4 a d’installé par défaut les services Googles disponibles en France (store, musique, vidéo, livre), le grand absent étant magazine pour le moment en France.

Google Musique, c’est vraiment LE service qu’il manquait sur la plateforme Android

Malgrés l’espace interne ne pouvant être étendu par une carte SD, vous avez de quoi faire (sauf si vous mettez un blueray RIP dans votre mémoire interne). Même en musique (16Go permet de stocker facilement une bonne vingtaine d’albums). De plus, grâce à Play Musique, vous pourrez mettre toute votre musique personnelle dans le Cloud (20000 titres disponibles) et mettre celles que vous voulez en cache sur votre smartphone. De plus, j’ai l’impression que l’application compresse le musiques mises en cache.

Maintenant, on accède au réglage en restant appuyé sur l’écran

La plus grosse nouveauté au sein de l’expérience multimédia avec cette version, c’est l’appareil photo qui a été complètement revu et corrigé. Vous pouvez maintenant accéder aux réglages de l’appareil photo par un simple appui Long sur l’écran puis glisser sur le réglage souhaité. Le mode Panorama a été amélioré avec la possibilité de le faire autant verticalement qu’horizontalement. Le mode vidéo permet aussi de réaliser des vidéos en Timelapse avec un temps prédéfini entre chaque prise. Vous pouvez aussi prendre des photos tout en continuant de filmer. Un nouveau mode a fait son apparition, il s’agit de photosphere qui va vous permettre de réaliser facilement, des photos à 360° où vous pourrez bouger à la façon de streetView. Le seul défaut, c’est que le zoom n’est plus possible avec un seul doigts. Seul le zoom/dézoom avec le geste de pincement permet de le réaliser.

Maintenant, on peut encore plus personnaliser nos photos qu’Instagram

La galerie aussi a eu une petite refonte. De plus, vous pouvez personnaliser la plupart de vos photos, qu’elles soient sur l’appareil ou sur picasa, grâce au bouton prévu à cet effet en bas à gauche. Vous devriez avoir beaucoup plus d’options que ce très cher Instagram. Comme d’habitude, vous avez la possibilité de les partager très facilement grâce à l’icône de partage en haut à droite et vous avez un raccourcis pour pouvoir lancer l’appareil photo.

JetPack Joyride est un classique du jeu mobile

Pour ce qui est des jeux, Le nexus 4 n’est pas en reste et m’a permis de jouer à bon nombre de jeux sans lag ni plantage. Par contre, passé un certain temps,  vous ressentirez de la chaleur dans le dos du smartphone. Ceci est un petit défaut sur le choix du verre comme coque car il n’est pas adapté pour la dissipation thermique.

Je finirai en disant que pour tout ce qui est multimédia en déplacement, le Nexus 4 vous satisfera amplement. De plus, son écran permet un bon confort que ce soit pour les yeux, ou pour le placement des mains.

Conclusion

Je ne vous conseille que grandement de passer au nexus4 si vous avez un smartphone de plus de 2 ans ou si vous êtes un développeur Android. Pour les autres, tout dépend de vos choix. Bien que le nexus 4 a tout pour plaire sur le papier et en utilisation, il y a quand même certains points qui font baisser sa note finale.

Pour commencer, la chauffe du téléphone dès qu’on l’utilise un peu trop. Si vous lancez une application gourmande en ressource, vous aurez votre téléphone qui chauffera assez rapidement. Enfin, après une semaine d’utilisation, le phénomène a tendance à arriver de moins en moins souvent. A vérifier avec le temps.

Ensuite, l’un des gros défaut est qu’il est mentionné sur le site de Google que le Nexus 4 peut se recharger sans fil. Malheureusement, le chargeur prévu à cet effet par Google, nommé Orb, n’est pas encore disponible et ne le serait pas avant début 2013. Dommage, d’après les différentes vidéos de test, il permettrait de tenir le téléphone dans n’importe quel sens et permettrai de tenir le rôle d’une station d’accueil intelligente. Intelligente car les chargeurs sans fil ne chargent plus le téléphone s’il n’en a pas besoin et donc permet de garder la batterie en vie plus longtemps.

Malgré ces deux points noirs, le nexus 4 est un produit innovant, très classe, et peu cher (à partir de 300€ sur le play store).

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

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

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.