{"id":447,"date":"2021-10-22T18:56:06","date_gmt":"2021-10-22T18:56:06","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=447"},"modified":"2023-11-01T19:12:12","modified_gmt":"2023-11-01T19:12:12","slug":"android-acceder-aux-ressources-media","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/android-acceder-aux-ressources-media\/","title":{"rendered":"Acc\u00e9der aux ressources m\u00e9dia"},"content":{"rendered":"<h2>Les \u00ab\u00a0contents providers\u00a0\u00bb<\/h2>\n<p>Le syst\u00e8me Android fournit un syst\u00e8me permettant le partage d&rsquo;information entre diff\u00e9rentes applications. Cette fonctionnalit\u00e9 permet, par exemple, \u00e0 plusieurs applications d&rsquo;effectuer du travail diff\u00e9rent en utilisant les m\u00eames donn\u00e9es. Android fournit cette fonctionnalit\u00e9 via le service de \u00ab\u00a0content provider\u00a0\u00bb. On peut acc\u00e9der au \u00ab\u00a0content provider\u00a0\u00bb \u00e0 partir de n&rsquo;importe quel contexte Android (donc de n&rsquo;importe quelle Activit\u00e9) en utilisant la fonction \u00ab\u00a0getContentResolver()\u00a0\u00bb.<\/p>\n<p>Les \u00ab\u00a0contents providers\u00a0\u00bb s&rsquo;utilisent un peu comme une base de donn\u00e9es. On peut acc\u00e9der aux donn\u00e9es (query), ajouter des donn\u00e9es (insert), supprimer des donn\u00e9es (delete) ou modifier des donn\u00e9es (update). Voici des exemples:<\/p>\n<div class=\"highlight\">\n<pre>    <span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">mProjection<\/span> <span class=\"o\">=<\/span>\r\n        <span class=\"p\">{<\/span>\r\n            <span class=\"n\">UserDictionary<\/span><span class=\"p\">.<\/span><span class=\"na\">Words<\/span><span class=\"p\">.<\/span><span class=\"na\">_ID<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"n\">UserDictionary<\/span><span class=\"p\">.<\/span><span class=\"na\">Words<\/span><span class=\"p\">.<\/span><span class=\"na\">WORD<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"n\">UserDictionary<\/span><span class=\"p\">.<\/span><span class=\"na\">Words<\/span><span class=\"p\">.<\/span><span class=\"na\">LOCALE<\/span>\r\n        <span class=\"p\">};<\/span>\r\n\r\n    <span class=\"n\">String<\/span> <span class=\"n\">selectionClause<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"n\">String<\/span> <span class=\"n\">sortOrder<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">selectionArgs<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s\">\"\"<\/span><span class=\"p\">};<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">test<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">Cursor<\/span> <span class=\"n\">cursor<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getContentResolver<\/span><span class=\"p\">().<\/span><span class=\"na\">query<\/span><span class=\"p\">(<\/span><span class=\"n\">UserDictionary<\/span><span class=\"p\">.<\/span><span class=\"na\">Words<\/span><span class=\"p\">.<\/span><span class=\"na\">CONTENT_URI<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">projection<\/span><span class=\"p\">,<\/span> <span class=\"n\">selectionClause<\/span><span class=\"p\">,<\/span> <span class=\"n\">selectionArgs<\/span><span class=\"p\">,<\/span> <span class=\"n\">sortOrder<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"kt\">boolean<\/span> <span class=\"n\">contientProchain<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cursor<\/span><span class=\"p\">.<\/span><span class=\"na\">moveToFirst<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"k\">while<\/span><span class=\"p\">(<\/span><span class=\"n\">contientProchain<\/span><span class=\"p\">){<\/span>\r\n            <span class=\"c1\">\/\/ Aller chercher les \u00e9l\u00e9ments avec cursor.get...<\/span>\r\n            <span class=\"n\">contientProchain<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cursor<\/span><span class=\"p\">.<\/span><span class=\"na\">moveToNext<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre>        <span class=\"n\">ContentValues<\/span> <span class=\"n\">nouvellesValeurs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ContentValues<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">nouvellesValeurs<\/span><span class=\"p\">.<\/span><span class=\"na\">put<\/span><span class=\"p\">(<\/span><span class=\"s\">\"cle1\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">valeur1<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">nouvellesValeurs<\/span><span class=\"p\">.<\/span><span class=\"na\">put<\/span><span class=\"p\">(<\/span><span class=\"s\">\"cle2\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">valeur2<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">nouvellesValeurs<\/span><span class=\"p\">.<\/span><span class=\"na\">put<\/span><span class=\"p\">(<\/span><span class=\"n\">UserDictionary<\/span><span class=\"p\">.<\/span><span class=\"na\">Words<\/span><span class=\"p\">.<\/span><span class=\"na\">APP_ID<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"exemple.prog\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">nouvellesValeurs<\/span><span class=\"p\">.<\/span><span class=\"na\">put<\/span><span class=\"p\">(<\/span><span class=\"n\">UserDictionary<\/span><span class=\"p\">.<\/span><span class=\"na\">Words<\/span><span class=\"p\">.<\/span><span class=\"na\">LOCALE<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"fr_CA\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">nouvellesValeurs<\/span><span class=\"p\">.<\/span><span class=\"na\">put<\/span><span class=\"p\">(<\/span><span class=\"n\">UserDictionary<\/span><span class=\"p\">.<\/span><span class=\"na\">Words<\/span><span class=\"p\">.<\/span><span class=\"na\">WORD<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"mot\"<\/span><span class=\"p\">);<\/span>\r\n        \r\n        <span class=\"n\">Uri<\/span> <span class=\"n\">uri<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getContentResolver<\/span><span class=\"p\">().<\/span><span class=\"na\">insert<\/span><span class=\"p\">(<\/span>\r\n            <span class=\"n\">UserDictionary<\/span><span class=\"p\">.<\/span><span class=\"na\">Words<\/span><span class=\"p\">.<\/span><span class=\"na\">CONTENT_URI<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"n\">nouvellesValeurs<\/span>\r\n        <span class=\"p\">);<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre>        <span class=\"n\">ContentValues<\/span> <span class=\"n\">updateValeurs<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ContentValues<\/span><span class=\"p\">();<\/span>\r\n\r\n        <span class=\"n\">String<\/span> <span class=\"n\">selectionClause<\/span> <span class=\"o\">=<\/span> <span class=\"n\">UserDictionary<\/span><span class=\"p\">.<\/span><span class=\"na\">Words<\/span><span class=\"p\">.<\/span><span class=\"na\">LOCALE<\/span> <span class=\"o\">+<\/span>  <span class=\"s\">\" LIKE ?\"<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">selectionArgs<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s\">\"fr_%\"<\/span><span class=\"p\">};<\/span>\r\n        \r\n        <span class=\"n\">updateValeurs<\/span><span class=\"p\">.<\/span><span class=\"na\">putNull<\/span><span class=\"p\">(<\/span><span class=\"n\">UserDictionary<\/span><span class=\"p\">.<\/span><span class=\"na\">Words<\/span><span class=\"p\">.<\/span><span class=\"na\">LOCALE<\/span><span class=\"p\">);<\/span>\r\n        \r\n        <span class=\"kt\">int<\/span> <span class=\"n\">nombreEnregistrements<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getContentResolver<\/span><span class=\"p\">().<\/span><span class=\"na\">update<\/span><span class=\"p\">(<\/span>\r\n                <span class=\"n\">UserDictionary<\/span><span class=\"p\">.<\/span><span class=\"na\">Words<\/span><span class=\"p\">.<\/span><span class=\"na\">CONTENT_URI<\/span><span class=\"p\">,<\/span> <span class=\"n\">updateValeurs<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"n\">selectionClause<\/span><span class=\"p\">,<\/span> <span class=\"n\">selectionArgs<\/span><span class=\"p\">);<\/span>\r\n<\/pre>\n<\/div>\n<div class=\"highlight\">\n<pre>        <span class=\"n\">String<\/span> <span class=\"n\">selectionClause<\/span> <span class=\"o\">=<\/span> <span class=\"n\">UserDictionary<\/span><span class=\"p\">.<\/span><span class=\"na\">Words<\/span><span class=\"p\">.<\/span><span class=\"na\">APP_ID<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\" LIKE ?\"<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">selectionArgs<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s\">\"prog\"<\/span><span class=\"p\">};<\/span>\r\n        \r\n        <span class=\"kt\">int<\/span> <span class=\"n\">nombreEnregistrements<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getContentResolver<\/span><span class=\"p\">().<\/span><span class=\"na\">delete<\/span><span class=\"p\">(<\/span>\r\n            <span class=\"n\">UserDictionary<\/span><span class=\"p\">.<\/span><span class=\"na\">Words<\/span><span class=\"p\">.<\/span><span class=\"na\">CONTENT_URI<\/span><span class=\"p\">,<\/span> <span class=\"n\">selectionClause<\/span><span class=\"p\">,<\/span> <span class=\"n\">selectionArgs<\/span><span class=\"p\">);<\/span>\r\n<\/pre>\n<\/div>\n<p>L&rsquo;utilisation de ces fonctionnalit\u00e9s ne font pas partit du cours. Si vous voulez en savoir plus, je vous recommande d&rsquo;aller lire la documentation officielle: <a href=\"https:\/\/developer.android.com\/guide\/topics\/providers\/content-providers\">https:\/\/developer.android.com\/guide\/topics\/providers\/content-providers<\/a><\/p>\n<h2>Le MediaStore<\/h2>\n<p>Android utilise la m\u00e9canique de \u00ab\u00a0content provider\u00a0\u00bb afin de partager certaines informations syst\u00e8me. C&rsquo;est le cas de la liste des informations des fichiers m\u00e9dias contenus dans le syst\u00e8me. Les informations qui nous permettront d&rsquo;utiliser le \u00ab\u00a0content provider\u00a0\u00bb afin d&rsquo;acc\u00e9der aux informations de fichiers m\u00e9dia se trouvent dans le MediaStore.<\/p>\n<p>Le MediaStore permet d&rsquo;acc\u00e9der aux fichiers contenus dans les r\u00e9pertoires de m\u00e9dia de l&rsquo;appareil Android. Voici les types de fichiers qui peuvent \u00eatre acc\u00e9d\u00e9s par le MediaStore:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Les fichiers audio (avec MediaStore.Audio)<\/li>\n<li>Les fichiers vid\u00e9o (avec MediaStore.Video)<\/li>\n<li>Les fichiers images (avec MediaStore.Images)<\/li>\n<li>Les fichiers t\u00e9l\u00e9charg\u00e9s (avec MediaStore.Downloads)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>En plus des URI de fichiers permettant d&rsquo;acc\u00e9der aux fichiers (voir section sur les URI ci-apr\u00e8s), le \u00ab\u00a0content provider\u00a0\u00bb et le MediaStore permettent d&rsquo;acc\u00e9der \u00e0 des informations sur les m\u00e9dias comme l&rsquo;aper\u00e7u d&rsquo;un vid\u00e9o (thumbnail), le nom de l&rsquo;artiste, le nom de l&rsquo;album, le titre d&rsquo;un fichier audio ou bien les informations EXIF d&rsquo;une image (description, ISO, exposition, etc.)<\/p>\n<h2>\u00c0 propos des URI de m\u00e9dia<\/h2>\n<p>Afin d&rsquo;\u00e9viter des probl\u00e9matiques de s\u00e9curit\u00e9 et de respect de la vie priv\u00e9e, l&rsquo;acc\u00e8s direct aux fichiers du syst\u00e8me est r\u00e9serv\u00e9 aux applications ayant fait les demandes d&rsquo;autorisations n\u00e9cessaires. Pour cr\u00e9er un lecteur de fichiers m\u00e9dias, il n&rsquo;est pas n\u00e9cessaire de faire la demande d&rsquo;acc\u00e8s aux fichiers du syst\u00e8me. Par contre, il est important d&rsquo;\u00e9viter qu&rsquo;une application malveillante puisse avoir acc\u00e8s aux noms de fichier qui pourrait contenir des informations confidentielles.<\/p>\n<p>Android permet donc l&rsquo;acc\u00e8s \u00e0 plusieurs ressources dans le syst\u00e8me, dont les fichiers m\u00e9dias, en utilisant un syst\u00e8me d&rsquo;adressage prot\u00e9geant contre une fuite d&rsquo;information de m\u00e9tadonn\u00e9es. Ce type d&rsquo;adressage se nomme URI. Un URI est donc une cha\u00eene de caract\u00e8res qui repr\u00e9sente, de mani\u00e8re unique, une ressource du syst\u00e8me et ne contenant aucune information potentiellement sensible de l&rsquo;utilisateur.<\/p>\n<h2>Acc\u00e9der aux informations du MediaStore<\/h2>\n<p>En premier lieu, l&rsquo;acc\u00e8s aux informations de m\u00e9dias n\u00e9cessite les permissions \u00ab\u00a0READ_MEDIA_IMAGES\u00a0\u00bb, \u00ab\u00a0READ_MEDIA_VIDEO\u00a0\u00bb et \u00ab\u00a0READ_MEDIA_AUDIO\u00a0\u00bb afin d&rsquo;acc\u00e9der respectivement aux types de m\u00e9dias images, vid\u00e9os et audios.<\/p>\n<p>En plus de ces permissions, jusqu&rsquo;\u00e0 la version 32 de l&rsquo;API d&rsquo;Android, il est n\u00e9cessaire de demander la permission \u00ab\u00a0READ_EXTERNAL_STORAGE\u00a0\u00bb afin d&rsquo;acc\u00e9der aux informations sur un m\u00e9dia. Voici un exemple \u00e0 inclure dans le fichier Manifest du projet Android:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"nt\">&lt;uses-permission<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">&quot;android.permission.READ_MEDIA_IMAGES&quot;<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n<span class=\"nt\">&lt;uses-permission<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">&quot;android.permission.READ_MEDIA_VIDEO&quot;<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n<span class=\"nt\">&lt;uses-permission<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">&quot;android.permission.READ_MEDIA_AUDIO&quot;<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n<span class=\"nt\">&lt;uses-permission<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">&quot;android.permission.READ_EXTERNAL_STORAGE&quot;<\/span>\r\n    <span class=\"na\">android:maxSdkVersion=<\/span><span class=\"s\">&quot;32&quot;<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n<\/pre>\n<\/div>\n<p>\u00c9galement, il est n\u00e9cessaire de faire un \u00ab\u00a0requestPermission\u00a0\u00bb afin de demander l&rsquo;autorisation \u00e0 l&rsquo;utilisateur d&rsquo;utiliser les fichiers m\u00e9dia. \u00c9galement, il y a eu certaines modifications \u00e0 l&rsquo;API 33 concernant les fichiers multim\u00e9dia. Voici un exemple g\u00e9rant tous les types de m\u00e9dia. Cet exemple est \u00e0 adapter selon le type de m\u00e9dia n\u00e9cessaire dans le programme.<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">Build<\/span><span class=\"p\">.<\/span><span class=\"na\">VERSION<\/span><span class=\"p\">.<\/span><span class=\"na\">SDK_INT<\/span> <span class=\"o\">&lt;<\/span> <span class=\"mi\">23<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"c1\">\/\/ Les permissions sont directement g\u00e9r\u00e9e dans le AndroidManifest.xml<\/span>\r\n    <span class=\"c1\">\/\/ Lancer le processus d&#39;acc\u00e8s aux fichiers m\u00e9dia.<\/span>\r\n<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">Build<\/span><span class=\"p\">.<\/span><span class=\"na\">VERSION<\/span><span class=\"p\">.<\/span><span class=\"na\">SDK_INT<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"mi\">32<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">requestPermissions<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">String<\/span><span class=\"o\">[]<\/span><span class=\"p\">{<\/span><span class=\"n\">android<\/span><span class=\"p\">.<\/span><span class=\"na\">Manifest<\/span><span class=\"p\">.<\/span><span class=\"na\">permission<\/span><span class=\"p\">.<\/span><span class=\"na\">READ_EXTERNAL_STORAGE<\/span><span class=\"p\">},<\/span> <span class=\"mi\">1<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">requestPermissions<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">String<\/span><span class=\"o\">[]<\/span><span class=\"p\">{<\/span><span class=\"n\">Manifest<\/span><span class=\"p\">.<\/span><span class=\"na\">permission<\/span><span class=\"p\">.<\/span><span class=\"na\">READ_MEDIA_IMAGES<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"n\">Manifest<\/span><span class=\"p\">.<\/span><span class=\"na\">permission<\/span><span class=\"p\">.<\/span><span class=\"na\">READ_MEDIA_AUDIO<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"n\">Manifest<\/span><span class=\"p\">.<\/span><span class=\"na\">permission<\/span><span class=\"p\">.<\/span><span class=\"na\">READ_MEDIA_VIDEO<\/span><span class=\"p\">},<\/span> <span class=\"mi\">2<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>L&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onRequestPermissionsResult\u00a0\u00bb pourrait ressembler \u00e0 ceci (encore une fois, \u00e0 adapter selon le type de m\u00e9dia utilisable dans l&rsquo;application):<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"nd\">@Override<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onRequestPermissionsResult<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aCode<\/span><span class=\"p\">,<\/span>\r\n                                       <span class=\"n\">String<\/span> <span class=\"n\">aPermission<\/span><span class=\"o\">[]<\/span><span class=\"p\">,<\/span>\r\n                                       <span class=\"kt\">int<\/span><span class=\"o\">[]<\/span> <span class=\"n\">aAccepte<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">super<\/span><span class=\"p\">.<\/span><span class=\"na\">onRequestPermissionsResult<\/span><span class=\"p\">(<\/span><span class=\"n\">aCode<\/span><span class=\"p\">,<\/span> <span class=\"n\">aPermission<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"n\">aAccepte<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aCode<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">1<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"n\">aAccepte<\/span><span class=\"o\">[<\/span><span class=\"mi\">0<\/span><span class=\"o\">]<\/span> <span class=\"o\">==<\/span> <span class=\"n\">PackageManager<\/span><span class=\"p\">.<\/span><span class=\"na\">PERMISSION_GRANTED<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"c1\">\/\/ Les permissions d&#39;acc\u00e8s aux fichiers m\u00e9dia sont accept\u00e9es<\/span>\r\n        <span class=\"c1\">\/\/ Lancer le processus d&#39;acc\u00e8s aux fichiers m\u00e9dia.<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aCode<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aAccepte<\/span><span class=\"o\">[<\/span><span class=\"mi\">0<\/span><span class=\"o\">]<\/span> <span class=\"o\">==<\/span> <span class=\"n\">PackageManager<\/span><span class=\"p\">.<\/span><span class=\"na\">PERMISSION_GRANTED<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"c1\">\/\/ La permission d&#39;acc\u00e8s aux fichiers image est accept\u00e9e<\/span>\r\n            <span class=\"c1\">\/\/ Lancer le processus d&#39;acc\u00e8s aux fichiers image.<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"c1\">\/\/ La permission d&#39;acc\u00e8s aux fichiers image est refus\u00e9e par l&#39;utilisateur<\/span>\r\n        <span class=\"p\">}<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aAccepte<\/span><span class=\"o\">[<\/span><span class=\"mi\">1<\/span><span class=\"o\">]<\/span> <span class=\"o\">==<\/span> <span class=\"n\">PackageManager<\/span><span class=\"p\">.<\/span><span class=\"na\">PERMISSION_GRANTED<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"c1\">\/\/ La permission d&#39;acc\u00e8s aux fichiers audio est accept\u00e9e<\/span>\r\n            <span class=\"c1\">\/\/ Lancer le processus d&#39;acc\u00e8s aux fichiers audio.<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"c1\">\/\/ La permission d&#39;acc\u00e8s aux fichiers audio est refus\u00e9e par l&#39;utilisateur<\/span>\r\n        <span class=\"p\">}<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aAccepte<\/span><span class=\"o\">[<\/span><span class=\"mi\">2<\/span><span class=\"o\">]<\/span> <span class=\"o\">==<\/span> <span class=\"n\">PackageManager<\/span><span class=\"p\">.<\/span><span class=\"na\">PERMISSION_GRANTED<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"c1\">\/\/ La permission d&#39;acc\u00e8s aux fichiers vid\u00e9o est accept\u00e9e<\/span>\r\n            <span class=\"c1\">\/\/ Lancer le processus d&#39;acc\u00e8s aux fichiers video.<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"c1\">\/\/ La permission d&#39;acc\u00e8s aux fichiers video est refus\u00e9e par l&#39;utilisateur<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"c1\">\/\/ Les permissions ne sont pas accept\u00e9es par l&#39;utilisateur.<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Maintenant, puisque l&rsquo;acc\u00e8s aux informations sur les m\u00e9dias se fait avec le \u00ab\u00a0ContentResolver\u00a0\u00bb, voici un petit rappel des arguments n\u00e9cessaires \u00e0 la fonction \u00ab\u00a0getContentResolver().query()\u00a0\u00bb.<\/p>\n<pre class=\"lang-java\" dir=\"ltr\" translate=\"no\"><span class=\"pln\">query(Uri,projection,selection,selectionArgs,sortOrder)\r\n<\/span><\/pre>\n<p>Le MediaStore nous permet d&rsquo;obtenir les URI qui repr\u00e9sentent les bases de donn\u00e9es de m\u00e9dias et \u00e9galement d&rsquo;obtenir les projections qui repr\u00e9sentent les informations que nous voulons avoir acc\u00e8s (titre, auteurs, album, etc.). Les autres arguments (selection, selectionArgs et sortOrder) permettent de faire des tris et de l&rsquo;ordonnancement des valeurs retourn\u00e9s et s&rsquo;utilisent de la m\u00eame mani\u00e8re que pour n&rsquo;importe quelle utilisation du \u00ab\u00a0content provider\u00a0\u00bb (voir documentation).<\/p>\n<p>L\u2019Uri peut prendre 2 valeurs:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>EXTERNAL_CONTENT_URI: Pour l&rsquo;utilisation du r\u00e9pertoire de l&rsquo;utilisateur (c&rsquo;est g\u00e9n\u00e9ralement ce que l&rsquo;on veut)<\/li>\n<li>INTERNAL_CONTENT_URI: Pour l&rsquo;utilisation du r\u00e9pertoire interne de l&rsquo;application<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>En g\u00e9n\u00e9ral, les lecteurs de m\u00e9dias ont comme mandat de lire les m\u00e9dias de l&rsquo;utilisateur (et non interne \u00e0 l&rsquo;application en cours). Le \u00ab\u00a0EXTERNAL_CONTENT_URI\u00a0\u00bb devrait donc \u00eatre utilis\u00e9.<\/p>\n<p>Pour avoir acc\u00e8s \u00e0 ces 2 constantes, on utilise la classe \u00ab\u00a0Media\u00a0\u00bb dans la sous-classe correspondant au type de m\u00e9dia recherch\u00e9 dans MediaStore. Par exemple, pour les vid\u00e9os, on peut acc\u00e9der \u00e0 la constante \u00ab\u00a0EXTERNAL_CONTENT_URI\u00a0\u00bb comme ceci:<\/p>\n<pre class=\"lang-java\" dir=\"ltr\" translate=\"no\"><span class=\"typ\">MediaStore.Video.Media.EXTERNAL_CONTENT_URI<\/span><\/pre>\n<p>Il est \u00e0 noter qu&rsquo;\u00e0 partir d&rsquo;Android 10 (API 29 ou code Q), la technique pour acc\u00e9der \u00e0 la constante a \u00e9t\u00e9 modifi\u00e9e. Il faut maintenant utiliser la m\u00e9thode du MediaStore \u00ab\u00a0getContentUri\u00a0\u00bb avec la constante \u00ab\u00a0VOLUME_EXTERNAL\u00a0\u00bb pour les m\u00e9dias externes (\u00e9quivalent \u00e0 \u00ab\u00a0EXTERNAL_CONTENT_URI\u00a0\u00bb) et \u00ab\u00a0VOLUME_INTERNAL\u00a0\u00bb pour les m\u00e9dias internes \u00e0 l&rsquo;application (\u00e9quivalent \u00e0 \u00ab\u00a0INTERNAL_CONTENT_URI\u00a0\u00bb). Par exemple, pour les vid\u00e9os, on peut acc\u00e9der \u00e0 la constante \u00ab\u00a0VOLUME_EXTERNAL\u00a0\u00bb de la mani\u00e8re suivante:<\/p>\n<pre class=\"lang-java\" dir=\"ltr\" translate=\"no\"><span class=\"typ\">MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL);<\/span><\/pre>\n<p>La projection correspond \u00e0 un tableau (\u00ab\u00a0Array\u00a0\u00bb) de colonne \u00e0 utiliser. Voici quelques exemples de colonnes pouvant \u00eatre utilis\u00e9s:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>_ID: L&rsquo;identificateur du m\u00e9dia (permet d&rsquo;avoir acc\u00e8s au URI du m\u00e9dia)\n<ul>\n<li>ex: MediaStore.Video.VideoColumns._ID<\/li>\n<\/ul>\n<\/li>\n<li>ARTIST: Le nom de l&rsquo;artiste ayant cr\u00e9\u00e9 le m\u00e9dia:\n<ul>\n<li>ex: MediaStore.Audio.ArtistColumns.ARTIST<\/li>\n<\/ul>\n<\/li>\n<li>TITLE: Le titre du m\u00e9dia:\n<ul>\n<li>ex: MediaStore.Audio.AudioColumns.TITLE<\/li>\n<\/ul>\n<\/li>\n<li>DESCRIPTION: une description du m\u00e9dia:\n<ul>\n<li>ex: MediaStore.Video.VideoColumns.DESCRIPTION<\/li>\n<\/ul>\n<\/li>\n<li>GENRE: Le style musical du fichier audio:\n<ul>\n<li>ex: MediaStore.Audio.AudioColumns.GENRE<\/li>\n<\/ul>\n<\/li>\n<li>etc.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Voici un exemple d&rsquo;une m\u00e9thode qui affiche dans le Logcat une liste de tous les fichiers audio avec l&rsquo;artiste et le titre:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">final<\/span> <span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">MEDIA_COLUMN<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Audio<\/span><span class=\"p\">.<\/span><span class=\"na\">AudioColumns<\/span><span class=\"p\">.<\/span><span class=\"na\">_ID<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Audio<\/span><span class=\"p\">.<\/span><span class=\"na\">ArtistColumns<\/span><span class=\"p\">.<\/span><span class=\"na\">ARTIST<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Audio<\/span><span class=\"p\">.<\/span><span class=\"na\">AudioColumns<\/span><span class=\"p\">.<\/span><span class=\"na\">TITLE<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">showAudio<\/span><span class=\"p\">(){<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">lCount<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"kt\">boolean<\/span> <span class=\"n\">lContientProchain<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">Cursor<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">Uri<\/span> <span class=\"n\">lCollection<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">Build<\/span><span class=\"p\">.<\/span><span class=\"na\">VERSION<\/span><span class=\"p\">.<\/span><span class=\"na\">SDK_INT<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"mi\">29<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lCollection<\/span> <span class=\"o\">=<\/span> <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Audio<\/span><span class=\"p\">.<\/span><span class=\"na\">Media<\/span><span class=\"p\">.<\/span><span class=\"na\">getContentUri<\/span><span class=\"p\">(<\/span>\r\n                <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">VOLUME_EXTERNAL<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lCollection<\/span> <span class=\"o\">=<\/span> <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Audio<\/span><span class=\"p\">.<\/span><span class=\"na\">Media<\/span><span class=\"p\">.<\/span><span class=\"na\">EXTERNAL_CONTENT_URI<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"n\">lCursor<\/span> <span class=\"o\">=<\/span> <span class=\"na\">getContentResolver<\/span><span class=\"p\">().<\/span><span class=\"na\">query<\/span><span class=\"p\">(<\/span>\r\n            <span class=\"n\">lCollection<\/span><span class=\"p\">,<\/span> <span class=\"n\">MEDIA_COLUMN<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span>\r\n    <span class=\"p\">);<\/span>\r\n    <span class=\"n\">lCount<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">lContientProchain<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">.<\/span><span class=\"na\">moveToFirst<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"k\">while<\/span><span class=\"p\">(<\/span><span class=\"n\">lContientProchain<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">Log<\/span><span class=\"p\">.<\/span><span class=\"na\">d<\/span><span class=\"p\">(<\/span><span class=\"s\">&quot;Mon_Application&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&quot;Audio &quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lCount<\/span> <span class=\"o\">+<\/span>\r\n                <span class=\"s\">&quot; | Artiste: &quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">.<\/span><span class=\"na\">getString<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span>\r\n                <span class=\"s\">&quot; | Titre: &quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">.<\/span><span class=\"na\">getString<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span>\r\n                <span class=\"s\">&quot; | Identificateur: &quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">.<\/span><span class=\"na\">getString<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lContientProchain<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">.<\/span><span class=\"na\">moveToNext<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">lCount<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lCount<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Prendre en note que les index de \u00ab\u00a0getString\u00a0\u00bb dans l&rsquo;exemple ci-haut correspond \u00e0 l&rsquo;index de la colonne en question dans le tableau \u00ab\u00a0MEDIA_COLUMN\u00a0\u00bb (soit 0 pour _ID, 1 pour artiste et 2 pour titre).<\/p>\n<h2>Acc\u00e9der au URI d&rsquo;un m\u00e9dia<\/h2>\n<p>Lorsque la lecture d&rsquo;un m\u00e9dia sera n\u00e9cessaire, il sera important d&rsquo;utiliser le URI du m\u00e9dia. Pour acc\u00e9der \u00e0 l&rsquo;URI d&rsquo;un m\u00e9dia \u00e0 partir d&rsquo;un \u00ab\u00a0query\u00a0\u00bb du \u00ab\u00a0ContentResolver\u00a0\u00bb, on utilise la m\u00e9thode \u00ab\u00a0ContentUris.withAppendedId\u00a0\u00bb avec le \u00ab\u00a0_ID\u00a0\u00bb du m\u00e9dia. Voici l&rsquo;exemple pr\u00e9c\u00e9dent qui affiche \u00e9galement le URI du m\u00e9dia:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">final<\/span> <span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">MEDIA_COLUMN<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Audio<\/span><span class=\"p\">.<\/span><span class=\"na\">AudioColumns<\/span><span class=\"p\">.<\/span><span class=\"na\">_ID<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Audio<\/span><span class=\"p\">.<\/span><span class=\"na\">ArtistColumns<\/span><span class=\"p\">.<\/span><span class=\"na\">ARTIST<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Audio<\/span><span class=\"p\">.<\/span><span class=\"na\">AudioColumns<\/span><span class=\"p\">.<\/span><span class=\"na\">TITLE<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">showAudio<\/span><span class=\"p\">(){<\/span>\r\n    <span class=\"kt\">int<\/span> <span class=\"n\">lCount<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"kt\">boolean<\/span> <span class=\"n\">lContientProchain<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">Cursor<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">Uri<\/span> <span class=\"n\">lCollection<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">Build<\/span><span class=\"p\">.<\/span><span class=\"na\">VERSION<\/span><span class=\"p\">.<\/span><span class=\"na\">SDK_INT<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"mi\">29<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lCollection<\/span> <span class=\"o\">=<\/span> <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Audio<\/span><span class=\"p\">.<\/span><span class=\"na\">Media<\/span><span class=\"p\">.<\/span><span class=\"na\">getContentUri<\/span><span class=\"p\">(<\/span>\r\n                <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">VOLUME_EXTERNAL<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lCollection<\/span> <span class=\"o\">=<\/span> <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Audio<\/span><span class=\"p\">.<\/span><span class=\"na\">Media<\/span><span class=\"p\">.<\/span><span class=\"na\">EXTERNAL_CONTENT_URI<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"n\">lCursor<\/span> <span class=\"o\">=<\/span> <span class=\"na\">getContentResolver<\/span><span class=\"p\">().<\/span><span class=\"na\">query<\/span><span class=\"p\">(<\/span>\r\n            <span class=\"n\">lCollection<\/span><span class=\"p\">,<\/span> <span class=\"n\">MEDIA_COLUMN<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span>\r\n    <span class=\"p\">);<\/span>\r\n    <span class=\"n\">lCount<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">lContientProchain<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">.<\/span><span class=\"na\">moveToFirst<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"k\">while<\/span><span class=\"p\">(<\/span><span class=\"n\">lContientProchain<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">Uri<\/span> <span class=\"n\">lMediaURI<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ContentUris<\/span><span class=\"p\">.<\/span><span class=\"na\">withAppendedId<\/span><span class=\"p\">(<\/span>\r\n                <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Video<\/span><span class=\"p\">.<\/span><span class=\"na\">Media<\/span><span class=\"p\">.<\/span><span class=\"na\">EXTERNAL_CONTENT_URI<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"n\">lCursor<\/span><span class=\"p\">.<\/span><span class=\"na\">getInt<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">Log<\/span><span class=\"p\">.<\/span><span class=\"na\">d<\/span><span class=\"p\">(<\/span><span class=\"s\">&quot;Mon_Application&quot;<\/span><span class=\"p\">,<\/span> <span class=\"s\">&quot;Audio &quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lCount<\/span> <span class=\"o\">+<\/span>\r\n                <span class=\"s\">&quot; | Artiste: &quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">.<\/span><span class=\"na\">getString<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span>\r\n                <span class=\"s\">&quot; | Titre: &quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">.<\/span><span class=\"na\">getString<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span>\r\n                <span class=\"s\">&quot; | URI: &quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lMediaURI<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lContientProchain<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">.<\/span><span class=\"na\">moveToNext<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">lCount<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lCount<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<h2>Acc\u00e9der \u00e0 l\u2019image aper\u00e7u d&rsquo;un fichier vid\u00e9o<\/h2>\n<p>Il est important de comprendre que la m\u00e9canique utilis\u00e9e pour acc\u00e9der aux images aper\u00e7ues de m\u00e9dia vid\u00e9o (\u00ab\u00a0Thumbnails\u00a0\u00bb) dans les syst\u00e8mes Android a \u00e9t\u00e9 modifi\u00e9e lors de la sortie de l&rsquo;API 29 (Android 10). Lors des versions pr\u00e9c\u00e9dentes d&rsquo;Android, il fallait cr\u00e9er l&rsquo;aper\u00e7u avec la classe \u00ab\u00a0<span class=\"n\">ThumbnailUtils<\/span>\u00a0\u00bb ainsi qu&rsquo;un nom de fichier. Depuis l&rsquo;API 29, il est devenu n\u00e9cessaire  d&rsquo;utiliser la m\u00e9thode \u00ab\u00a0loadThumbnail\u00a0\u00bb du \u00ab\u00a0ContentResolver\u00a0\u00bb ainsi que l\u2019URI du m\u00e9dia. Voici donc un exemple permettant d&rsquo;afficher un aper\u00e7u de vid\u00e9o dans un \u00ab\u00a0ImageView\u00a0\u00bb, autant les versions pr\u00e9c\u00e9dentes de l&rsquo;API 29 que l&rsquo;API 29 et les suivantes:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">final<\/span> <span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">MEDIA_COLUMN<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Video<\/span><span class=\"p\">.<\/span><span class=\"na\">VideoColumns<\/span><span class=\"p\">.<\/span><span class=\"na\">_ID<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Video<\/span><span class=\"p\">.<\/span><span class=\"na\">VideoColumns<\/span><span class=\"p\">.<\/span><span class=\"na\">DATA<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">chargeApercu<\/span><span class=\"p\">(){<\/span>\r\n    <span class=\"kt\">boolean<\/span> <span class=\"n\">lContientPremier<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">Cursor<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">Uri<\/span> <span class=\"n\">lCollection<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">Build<\/span><span class=\"p\">.<\/span><span class=\"na\">VERSION<\/span><span class=\"p\">.<\/span><span class=\"na\">SDK_INT<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"mi\">29<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lCollection<\/span> <span class=\"o\">=<\/span> <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Video<\/span><span class=\"p\">.<\/span><span class=\"na\">Media<\/span><span class=\"p\">.<\/span><span class=\"na\">getContentUri<\/span><span class=\"p\">(<\/span>\r\n                <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">VOLUME_EXTERNAL<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lCollection<\/span> <span class=\"o\">=<\/span> <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Video<\/span><span class=\"p\">.<\/span><span class=\"na\">Media<\/span><span class=\"p\">.<\/span><span class=\"na\">EXTERNAL_CONTENT_URI<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"n\">lCursor<\/span> <span class=\"o\">=<\/span> <span class=\"na\">getContentResolver<\/span><span class=\"p\">().<\/span><span class=\"na\">query<\/span><span class=\"p\">(<\/span>\r\n            <span class=\"n\">lCollection<\/span><span class=\"p\">,<\/span> <span class=\"n\">MEDIA_COLUMN<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span>\r\n    <span class=\"p\">);<\/span>\r\n    <span class=\"n\">lContientPremier<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">.<\/span><span class=\"na\">moveToFirst<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"n\">lContientPremier<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">Uri<\/span> <span class=\"n\">lMediaURI<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ContentUris<\/span><span class=\"p\">.<\/span><span class=\"na\">withAppendedId<\/span><span class=\"p\">(<\/span>\r\n                <span class=\"n\">MediaStore<\/span><span class=\"p\">.<\/span><span class=\"na\">Video<\/span><span class=\"p\">.<\/span><span class=\"na\">Media<\/span><span class=\"p\">.<\/span><span class=\"na\">EXTERNAL_CONTENT_URI<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"n\">lCursor<\/span><span class=\"p\">.<\/span><span class=\"na\">getInt<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">String<\/span> <span class=\"n\">lNomFichier<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lCursor<\/span><span class=\"p\">.<\/span><span class=\"na\">getString<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">afficherApercu<\/span><span class=\"p\">(<\/span><span class=\"n\">lMediaURI<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNomFichier<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">Toast<\/span> <span class=\"n\">lToast<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Toast<\/span><span class=\"p\">.<\/span><span class=\"na\">makeText<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s\">&quot;L&#39;appareil ne semble contenir aucun vid\u00e9o&quot;<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"n\">Toast<\/span><span class=\"p\">.<\/span><span class=\"na\">LENGTH_SHORT<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lToast<\/span><span class=\"p\">.<\/span><span class=\"na\">show<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">afficherApercu<\/span><span class=\"p\">(<\/span><span class=\"n\">Uri<\/span> <span class=\"n\">aUri<\/span><span class=\"p\">,<\/span> <span class=\"n\">String<\/span> <span class=\"n\">aNomFichier<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">try<\/span><span class=\"p\">{<\/span>\r\n        <span class=\"n\">Bitmap<\/span> <span class=\"n\">bitmap<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">Build<\/span><span class=\"p\">.<\/span><span class=\"na\">VERSION<\/span><span class=\"p\">.<\/span><span class=\"na\">SDK_INT<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"mi\">29<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">bitmap<\/span> <span class=\"o\">=<\/span> <span class=\"na\">getContentResolver<\/span><span class=\"p\">().<\/span><span class=\"na\">loadThumbnail<\/span><span class=\"p\">(<\/span>\r\n                    <span class=\"n\">aUri<\/span><span class=\"p\">,<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Size<\/span><span class=\"p\">(<\/span><span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"mi\">300<\/span><span class=\"p\">),<\/span> <span class=\"kc\">null<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">bitmap<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ThumbnailUtils<\/span><span class=\"p\">.<\/span><span class=\"na\">createVideoThumbnail<\/span><span class=\"p\">(<\/span>\r\n                    <span class=\"n\">aNomFichier<\/span><span class=\"p\">,<\/span>  <span class=\"mi\">0<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"n\">bitmap<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ThumbnailUtils<\/span><span class=\"p\">.<\/span><span class=\"na\">extractThumbnail<\/span><span class=\"p\">(<\/span><span class=\"n\">bitmap<\/span><span class=\"p\">,<\/span> <span class=\"mi\">300<\/span><span class=\"p\">,<\/span> <span class=\"mi\">300<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n        <span class=\"n\">ImageView<\/span> <span class=\"n\">imageVue<\/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\">image_vue<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">imageVue<\/span><span class=\"p\">.<\/span><span class=\"na\">setImageBitmap<\/span><span class=\"p\">(<\/span><span class=\"n\">bitmap<\/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\">exception<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">Toast<\/span> <span class=\"n\">lToast<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Toast<\/span><span class=\"p\">.<\/span><span class=\"na\">makeText<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s\">&quot;Ne peut cr\u00e9er l&#39;aper\u00e7u&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">Toast<\/span><span class=\"p\">.<\/span><span class=\"na\">LENGTH_SHORT<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lToast<\/span><span class=\"p\">.<\/span><span class=\"na\">show<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<h2>Envoyer un Uri d&rsquo;une activit\u00e9 \u00e0 une autre<\/h2>\n<p>Premi\u00e8rement, il est important de constater qu&rsquo;il n&rsquo;existe pas de m\u00e9thode \u00ab\u00a0Intent.putExtra(String name, Uri value)\u00a0\u00bb ni de m\u00e9thode \u00ab\u00a0Intent.getUriExtra(String name)\u00a0\u00bb. Il en r\u00e9sulte donc qu&rsquo;il n&rsquo;est pas possible d&rsquo;envoyer directement un Uri d&rsquo;une activit\u00e9 vers une autre avec le syst\u00e8me d&rsquo;extra de la classe \u00ab\u00a0Intent\u00a0\u00bb. Vous avez donc deux possibilit\u00e9s. Utiliser la m\u00e9thode \u00ab\u00a0Intent.setData(Uri)\u00a0\u00bb avec \u00ab\u00a0Intent.getData()\u00a0\u00bb ou utiliser un String extra. <\/p>\n<p>La premi\u00e8re possibilit\u00e9 (et celle que vous devriez privil\u00e9gier lorsque possible), est d&rsquo;utiliser \u00ab\u00a0Intent.setData(Uri)\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\">lancerSecondeActivite<\/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\">Intent<\/span> <span class=\"n\">lIntent<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Intent<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">,<\/span> <span class=\"n\">SecondeActivite<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">lIntent<\/span><span class=\"p\">.<\/span><span class=\"na\">setData<\/span><span class=\"p\">(<\/span><span class=\"n\">aUri<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">startActivity<\/span><span class=\"p\">(<\/span><span class=\"n\">lIntent<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Pour aller chercher l&rsquo;Uri dans la nouvelle activit\u00e9, on utiliser \u00ab\u00a0Intent.getData()\u00a0\u00bb. Comme ceci:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"nd\">@Override<\/span>\r\n<span class=\"kd\">protected<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onCreate<\/span><span class=\"p\">(<\/span><span class=\"n\">Bundle<\/span> <span class=\"n\">savedInstanceState<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">super<\/span><span class=\"p\">.<\/span><span class=\"na\">onCreate<\/span><span class=\"p\">(<\/span><span class=\"n\">savedInstanceState<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">setContentView<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">layout<\/span><span class=\"p\">.<\/span><span class=\"na\">activity_seconde_activite<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">Intent<\/span> <span class=\"n\">lIntent<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getIntent<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">Uri<\/span> <span class=\"n\">lUri<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lIntent<\/span><span class=\"p\">.<\/span><span class=\"na\">getData<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">Log<\/span><span class=\"p\">.<\/span><span class=\"na\">e<\/span><span class=\"p\">(<\/span><span class=\"s\">&quot;Le Uri: &quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">lUri<\/span><span class=\"p\">.<\/span><span class=\"na\">toString<\/span><span class=\"p\">());<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Cette m\u00e9canique fonctionne bien, pourvu que vous n&rsquo;ayez qu&rsquo;un seul Uri \u00e0 transf\u00e9rer vers la seconde activit\u00e9. Puisque les \u00ab\u00a0setData\u00a0\u00bb ne sont pas nomm\u00e9s (contrairement au \u00ab\u00a0putExtra\u00a0\u00bb), il serait impossible de transmettre plus d&rsquo;un \u00ab\u00a0data\u00a0\u00bb sans \u00e9craser les \u00ab\u00a0datas\u00a0\u00bb pr\u00e9c\u00e9dents.<\/p>\n<p>Ainsi, si vous avez plus qu&rsquo;un Uri \u00e0 transf\u00e9rer vers une nouvelle activit\u00e9, vous pouvez le transf\u00e9rer en String. Un Uri n&rsquo;est rien d&rsquo;autre qu&rsquo;une classe qui encapsule un String. Pour transf\u00e9rer l\u2019Uri en String, vous pouvez simplement utiliser \u00ab\u00a0toString\u00a0\u00bb et pour cr\u00e9er un Uri \u00e0 partir d&rsquo;un String, utiliser \u00ab\u00a0Uri.parse\u00a0\u00bb. Voici un exemple pour l&rsquo;envoi de l\u2019Uri:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">lancerSecondeActivite<\/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\">Intent<\/span> <span class=\"n\">lIntent<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Intent<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">,<\/span> <span class=\"n\">SecondeActivite<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">lIntent<\/span><span class=\"p\">.<\/span><span class=\"na\">putExtra<\/span><span class=\"p\">(<\/span><span class=\"s\">&quot;LeUri&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">aUri<\/span><span class=\"p\">.<\/span><span class=\"na\">toString<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"n\">startActivity<\/span><span class=\"p\">(<\/span><span class=\"n\">lIntent<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Et voici un exemple pour la r\u00e9ception de l&rsquo;Uri:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"nd\">@Override<\/span>\r\n<span class=\"kd\">protected<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onCreate<\/span><span class=\"p\">(<\/span><span class=\"n\">Bundle<\/span> <span class=\"n\">savedInstanceState<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">super<\/span><span class=\"p\">.<\/span><span class=\"na\">onCreate<\/span><span class=\"p\">(<\/span><span class=\"n\">savedInstanceState<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">setContentView<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">layout<\/span><span class=\"p\">.<\/span><span class=\"na\">activity_seconde_activite<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">Intent<\/span> <span class=\"n\">lIntent<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getIntent<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">String<\/span> <span class=\"n\">lUriString<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lIntent<\/span><span class=\"p\">.<\/span><span class=\"na\">getStringExtra<\/span><span class=\"p\">(<\/span><span class=\"s\">&quot;LeUri&quot;<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">Uri<\/span> <span class=\"n\">lUri<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Uri<\/span><span class=\"p\">.<\/span><span class=\"na\">parse<\/span><span class=\"p\">(<\/span><span class=\"n\">lUriString<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">Log<\/span><span class=\"p\">.<\/span><span class=\"na\">e<\/span><span class=\"p\">(<\/span><span class=\"s\">&quot;Le Uri: &quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">lUri<\/span><span class=\"p\">.<\/span><span class=\"na\">toString<\/span><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>Les \u00ab\u00a0contents providers\u00a0\u00bb Le syst\u00e8me Android fournit un syst\u00e8me permettant le partage d&rsquo;information entre diff\u00e9rentes applications. Cette fonctionnalit\u00e9 permet, par exemple, \u00e0 plusieurs applications d&rsquo;effectuer du travail diff\u00e9rent en utilisant les m\u00eames donn\u00e9es. Android fournit cette fonctionnalit\u00e9 via le service de \u00ab\u00a0content provider\u00a0\u00bb. On peut acc\u00e9der au \u00ab\u00a0content provider\u00a0\u00bb \u00e0 partir de n&rsquo;importe quel contexte&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/android-acceder-aux-ressources-media\/\">Continue reading <span class=\"screen-reader-text\">Acc\u00e9der aux ressources m\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-447","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/447","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=447"}],"version-history":[{"count":33,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/447\/revisions"}],"predecessor-version":[{"id":830,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/447\/revisions\/830"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}