{"id":453,"date":"2021-11-01T19:07:50","date_gmt":"2021-11-01T19:07:50","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=453"},"modified":"2022-10-30T20:59:25","modified_gmt":"2022-10-30T20:59:25","slug":"android-lecture-de-fichiers-media","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/android-lecture-de-fichiers-media\/","title":{"rendered":"Lecture multim\u00e9dia"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>La lecture de m\u00e9dia audio ou vid\u00e9o se fait normalement avec des objets de type <a href=\"https:\/\/developer.android.com\/reference\/android\/media\/MediaPlayer\">MediaPlayer<\/a>. Par contre, dans le cas de la lecture vid\u00e9o, la majorit\u00e9 des fonctionnalit\u00e9s accessibles dans la classe \u00ab\u00a0MediaPlayer\u00a0\u00bb sont \u00e9galement accessibles en utilisant le \u00ab\u00a0widget\u00a0\u00bb VideoView. Il est important de comprendre que l&rsquo;utilisation des m\u00e9thodes de \u00ab\u00a0VideoView\u00a0\u00bb ne permet pas de faire tout ce qu&rsquo;un \u00ab\u00a0MediaPlayer\u00a0\u00bb peut effectuer.<\/p>\n<p>Dans cette page, nous d\u00e9buterons par voir comment utiliser la classe \u00ab\u00a0MediaPlayer\u00a0\u00bb pour jouer des fichiers audio. Ensuite, nous verrons comment utiliser un \u00ab\u00a0VideoView\u00a0\u00bb pour g\u00e9rer les fichiers vid\u00e9o. Finalement, nous verrons comment utiliser le \u00ab\u00a0MediaPlayer\u00a0\u00bb inclus dans un \u00ab\u00a0VideoView\u00a0\u00bb afin d&rsquo;utiliser les m\u00eames m\u00e9thodes pour g\u00e9rer, autant les fichiers audio que vid\u00e9o.<\/p>\n<h2>Lecture de fichiers audio<\/h2>\n<h3>Chargement du fichier audio<\/h3>\n<p>Afin de charger un fichier audio dans un \u00ab\u00a0MediaPlayer\u00a0\u00bb, on utilise la m\u00e9thode &lsquo;setDataSource&rsquo; suivie de &lsquo;prepare\u00a0\u00bb. Dans le cas ou l&rsquo;ouverture du m\u00e9dia \u00e9chouerait, il est n\u00e9cessaire de g\u00e9rer un exception de type \u00ab\u00a0IOException\u00a0\u00bb. Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">preparerAudio<\/span><span class=\"p\">(<\/span><span class=\"n\">Uri<\/span> <span class=\"n\">aUri<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">player<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">MediaPlayer<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">player<\/span><span class=\"p\">.<\/span><span class=\"na\">setDataSource<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">,<\/span> <span class=\"n\">aUri<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">player<\/span><span class=\"p\">.<\/span><span class=\"na\">prepare<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"n\">IOException<\/span> <span class=\"n\">e<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"c1\">\/\/ Gestion d&#39;erreur<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Il est important de noter que si l&rsquo;objet \u00ab\u00a0MediaPlayer\u00a0\u00bb a d\u00e9j\u00e0 pr\u00e9alablement charg\u00e9 un fichier audio, il n&rsquo;est pas possible de faire un second &lsquo;setDataSource&rsquo;. Il est n\u00e9cessaire d&rsquo;arr\u00eater la lecture avec &lsquo;stop&rsquo; et de remettre le \u00ab\u00a0MediaPlayer\u00a0\u00bb \u00e0 son \u00e9tat d&rsquo;origine avec &lsquo;reset&rsquo;:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">changerAudio<\/span><span class=\"p\">(<\/span><span class=\"n\">Uri<\/span> <span class=\"n\">aUri<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">player<\/span><span class=\"p\">.<\/span><span class=\"na\">stop<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">player<\/span><span class=\"p\">.<\/span><span class=\"na\">reset<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">player<\/span><span class=\"p\">.<\/span><span class=\"na\">setDataSource<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">,<\/span> <span class=\"n\">aUri<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">player<\/span><span class=\"p\">.<\/span><span class=\"na\">prepare<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"n\">IOException<\/span> <span class=\"n\">e<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"c1\">\/\/ Gestion d&#39;erreur<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Vous pouvez \u00e9galement noter qu&rsquo;il est possible de faire le &lsquo;stop&rsquo; ainsi que le &lsquo;reset&rsquo;, m\u00eame dans le cas ou l&rsquo;objet \u00ab\u00a0MediaPlayer\u00a0\u00bb vient \u00e0 l&rsquo;instant d&rsquo;\u00eatre cr\u00e9\u00e9. Il est \u00e9galement possible de cr\u00e9er un nouvel objet \u00ab\u00a0MediaPlayer\u00a0\u00bb pour jouer un nouveau fichier audio.<\/p>\n<h3>Contr\u00f4le du \u00ab\u00a0MediaPlayer\u00a0\u00bb<\/h3>\n<p>Voici les m\u00e9thodes de contr\u00f4le incluses dans un \u00ab\u00a0MediaPlayer\u00a0\u00bb:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>start: lance la lecture du m\u00e9dia.<\/li>\n<li>pause: arr\u00eate la lecture du m\u00e9dia, mais permets tout de m\u00eame au m\u00e9dia de continuer \u00e0 l&rsquo;endroit o\u00f9 il a \u00e9t\u00e9 arr\u00eat\u00e9 en utilisant la m\u00e9thode &lsquo;start&rsquo; de nouveau.<\/li>\n<li>stop: arr\u00eate la lecture du m\u00e9dia et le d\u00e9charge de la m\u00e9moire. Pour relancer la lecture, il faudra recharger le \u00ab\u00a0MediaPlayer\u00a0\u00bb en utilisant &lsquo;reset&rsquo;, &lsquo;setDataSource&rsquo; et &lsquo;prepare&rsquo; (comme vu plus haut).<\/li>\n<li>getCurrentPosition: permets d&rsquo;acc\u00e9der \u00e0 la position (en milliseconde) en cours dans le m\u00e9dia.<\/li>\n<li>seekto: permets de se d\u00e9placer dans le m\u00e9dia. Cette m\u00e9thode prend en argument le nombre de millisecondes depuis le d\u00e9but du m\u00e9dia qu&rsquo;il faut se d\u00e9placer.<\/li>\n<li>setScreenOnWhilePlaying: Permet de s&rsquo;assurer que l&rsquo;\u00e9cran de l&rsquo;appareil ne devienne pas en veille durant la lecture du m\u00e9dia.<\/li>\n<li>setOnCompletionListener: \u00c9v\u00e9nement lanc\u00e9 lorsque le media se termine.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Lecture de fichier vid\u00e9o<\/h2>\n<p>Pour lire un fichier vid\u00e9o, on peut utiliser un \u00ab\u00a0VideoView\u00a0\u00bb. Ce type de vue s&rsquo;occupe de g\u00e9rer la lecture du vid\u00e9o et de l&rsquo;afficher dans le \u00ab\u00a0layout\u00a0\u00bb de l&rsquo;activit\u00e9.<\/p>\n<h3>Chargement d&rsquo;un fichier vid\u00e9o<\/h3>\n<p>Pour charger un fichier vid\u00e9o dans un \u00ab\u00a0VideoView\u00a0\u00bb, on utilise &lsquo;setVideoURI&rsquo;:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">VideoView<\/span> <span class=\"n\">lVideoVue<\/span> <span class=\"o\">=<\/span> <span class=\"n\">findViewById<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">id<\/span><span class=\"p\">.<\/span><span class=\"na\">video_vue<\/span><span class=\"p\">);<\/span>\r\n<span class=\"n\">lVideoVue<\/span><span class=\"p\">.<\/span><span class=\"na\">setVideoURI<\/span><span class=\"p\">(<\/span><span class=\"n\">lUri<\/span><span class=\"p\">);<\/span>\r\n<\/pre>\n<\/div>\n<h3>Contr\u00f4le du \u00ab\u00a0VideoView\u00a0\u00bb<\/h3>\n<p>Voici les m\u00e9thodes de contr\u00f4le incluses dans un \u00ab\u00a0VideoView\u00a0\u00bb:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>start: lance la lecture du m\u00e9dia.<\/li>\n<li>pause: arr\u00eate la lecture du m\u00e9dia, mais permets tout de m\u00eame au m\u00e9dia de continuer \u00e0 l&rsquo;endroit o\u00f9 il a \u00e9t\u00e9 arr\u00eat\u00e9 en utilisant la m\u00e9thode &lsquo;start&rsquo; de nouveau.<\/li>\n<li>seekto: permets de se d\u00e9placer dans le m\u00e9dia. Cette m\u00e9thode prend en argument le nombre de millisecondes depuis le d\u00e9but du m\u00e9dia qu&rsquo;il faut se d\u00e9placer.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Les m\u00e9thodes fonctionnent de la m\u00eame mani\u00e8re que pour le \u00ab\u00a0MediaPlayer\u00a0\u00bb, mais sont beaucoup plus limit\u00e9es.<\/p>\n<h3>Utiliser un \u00ab\u00a0MediaPlayer\u00a0\u00bb avec un \u00ab\u00a0VideoView\u00a0\u00bb<\/h3>\n<p>Pour avoir tout l&rsquo;avantage du \u00ab\u00a0MediaPlayer\u00a0\u00bb lorsqu&rsquo;un fichier vid\u00e9o est utilis\u00e9, on peut utiliser le \u00ab\u00a0MediaPlayer\u00a0\u00bb inclue \u00e0 l&rsquo;int\u00e9rieur du \u00ab\u00a0VideoView\u00a0\u00bb. Pour se faire, il faut se cr\u00e9er un \u00ab\u00a0OnPreparedListener\u00a0\u00bb et l&rsquo;assigner au \u00ab\u00a0VideoView\u00a0\u00bb. Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">preparerVideo<\/span><span class=\"p\">(<\/span><span class=\"n\">Uri<\/span> <span class=\"n\">aUri<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">VideoView<\/span> <span class=\"n\">lVideoVue<\/span> <span class=\"o\">=<\/span> <span class=\"n\">findViewById<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">id<\/span><span class=\"p\">.<\/span><span class=\"na\">video_vue<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">lVideoVue<\/span><span class=\"p\">.<\/span><span class=\"na\">setOnPreparedListener<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">OnPrepareVideo<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"n\">lVideoVue<\/span><span class=\"p\">.<\/span><span class=\"na\">setVideoURI<\/span><span class=\"p\">(<\/span><span class=\"n\">aUri<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">private<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">OnPrepareVideo<\/span> <span class=\"kd\">implements<\/span> <span class=\"n\">MediaPlayer<\/span><span class=\"p\">.<\/span><span class=\"na\">OnPreparedListener<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onPrepared<\/span><span class=\"p\">(<\/span><span class=\"n\">MediaPlayer<\/span> <span class=\"n\">aMediaPlayer<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">player<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aMediaPlayer<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>En utilisant cette m\u00e9canique, il est possible, une sauvegarder le \u00ab\u00a0MediaPlayer\u00a0\u00bb dans un attribut de l&rsquo;activit\u00e9 de mani\u00e8re \u00e0 pouvoir l&rsquo;utiliser de la m\u00eame mani\u00e8re que pour la lecture des fichiers audio. Par contre, il est important de consid\u00e9rer que le \u00ab\u00a0Listener\u00a0\u00bb n&rsquo;est pas n\u00e9cessairement lanc\u00e9 d\u00e8s le d\u00e9marrage de l&rsquo;activit\u00e9. Pour \u00e9viter des erreurs, il est recommand\u00e9 d&rsquo;initialiser le \u00ab\u00a0MediaPlayer\u00a0\u00bb \u00e0 \u00ab\u00a0null\u00a0\u00bb et de faire des \u00ab\u00a0if (player != null)\u00a0\u00bb \u00e0 chaque utilisation du \u00ab\u00a0MediaPlayer\u00a0\u00bb. Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onPlayClick<\/span><span class=\"p\">(<\/span><span class=\"n\">View<\/span> <span class=\"n\">aVue<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">player<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">player<\/span><span class=\"p\">.<\/span><span class=\"na\">start<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>\u00c9galement, tout comme pour la lecture de fichier audio, si nous souhaitons changer de vid\u00e9o dans le lecteur, il est n\u00e9cessaire de faire un \u00ab\u00a0stop\u00a0\u00bb et \u00ab\u00a0reset\u00a0\u00bb sur le \u00ab\u00a0MediaPlayer\u00a0\u00bb. De plus, puisque le \u00ab\u00a0MediaPlayer\u00a0\u00bb risque d&rsquo;\u00eatre dans un \u00e9tat invalide jusqu&rsquo;\u00e0 ce que le \u00ab\u00a0OnPrepareListener\u00a0\u00bb soit lanc\u00e9, il est recommand\u00e9 de remettre le \u00ab\u00a0MediaPlayer\u00a0\u00bb \u00e0 \u00ab\u00a0null\u00a0\u00bb. Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">changerVideo<\/span><span class=\"p\">(<\/span><span class=\"n\">Uri<\/span> <span class=\"n\">aUri<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">player<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">player<\/span><span class=\"p\">.<\/span><span class=\"na\">stop<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">player<\/span><span class=\"p\">.<\/span><span class=\"na\">reset<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">player<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">preparerVideo<\/span><span class=\"p\">(<\/span><span class=\"n\">aUri<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.louismarchand.me\/index.php\/programmation-android\/\">Retour<\/a><\/p>\n<hr \/>\n<p>Auteur: Louis Marchand<br \/>\n<a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/i.creativecommons.org\/l\/by\/4.0\/80x15.png\" alt=\"Creative Commons License\" \/><\/a><br \/>\nSauf pour les sections sp\u00e9cifi\u00e9es autrement, ce travail est sous licence <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\">Creative Commons Attribution 4.0 International<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction La lecture de m\u00e9dia audio ou vid\u00e9o se fait normalement avec des objets de type MediaPlayer. Par contre, dans le cas de la lecture vid\u00e9o, la majorit\u00e9 des fonctionnalit\u00e9s accessibles dans la classe \u00ab\u00a0MediaPlayer\u00a0\u00bb sont \u00e9galement accessibles en utilisant le \u00ab\u00a0widget\u00a0\u00bb VideoView. Il est important de comprendre que l&rsquo;utilisation des m\u00e9thodes de \u00ab\u00a0VideoView\u00a0\u00bb ne&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/android-lecture-de-fichiers-media\/\">Continue reading <span class=\"screen-reader-text\">Lecture multim\u00e9dia<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-453","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/453","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/comments?post=453"}],"version-history":[{"count":16,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/453\/revisions"}],"predecessor-version":[{"id":748,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/453\/revisions\/748"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}