{"id":699,"date":"2022-09-26T15:48:03","date_gmt":"2022-09-26T15:48:03","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=699"},"modified":"2023-09-25T14:29:31","modified_gmt":"2023-09-25T14:29:31","slug":"android-services-et-environnements","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/android-services-et-environnements\/","title":{"rendered":"Services et environnements"},"content":{"rendered":"<h2>Les services syst\u00e8me<\/h2>\n<p>Les appareils mobiles Android offrent aux applications beaucoup de fonctionnalit\u00e9 tr\u00e8s sp\u00e9cialis\u00e9e. Nous pouvons penser aux syst\u00e8mes de localisation (GPS), Bluetooth, NFC, etc. L&rsquo;utilisation de ces fonctionnalit\u00e9s peut varier, mais en g\u00e9n\u00e9ral, on utilise la m\u00e9thode de contexte \u00ab\u00a0getSystemService\u00a0\u00bb afin d&rsquo;avoir acc\u00e8s aux diff\u00e9rents gestionnaires de service. Cette m\u00e9thode est accessible \u00e0 partir de n&rsquo;importe quelle activit\u00e9 puisque la classe \u00ab\u00a0Activity\u00a0\u00bb h\u00e9rite de la classe \u00ab\u00a0Context\u00a0\u00bb. Voici les services accessibles \u00e0 partir de la m\u00e9thode \u00ab\u00a0getSystemService\u00a0\u00bb:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Service de fen\u00eatre (\u00ab\u00a0WINDOW_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets de g\u00e9rer soit m\u00eame les fen\u00eatres de son application.<\/li>\n<\/ul>\n<\/li>\n<li>Service de \u00ab\u00a0layout inflater\u00a0\u00bb (\u00ab\u00a0LAYOUT_INFLATER_SERVICE\u00a0\u00bb)\n<ul>\n<li>Retourne un \u00ab\u00a0LayoutInfalter\u00a0\u00bb qui peut \u00eatre utilis\u00e9 pour transformer un \u00ab\u00a0layout\u00a0\u00bb en objet \u00ab\u00a0View\u00a0\u00bb.<\/li>\n<\/ul>\n<\/li>\n<li>Service d&rsquo;activit\u00e9 (\u00ab\u00a0ACTIVITY_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets la gestion d&rsquo;une activit\u00e9 au niveau syst\u00e8me<\/li>\n<\/ul>\n<\/li>\n<li>Gestion d&rsquo;arri\u00e8re-plan (\u00ab\u00a0WALLPAPER_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets la gestion (par exemple, modification) de l&rsquo;arri\u00e8re-plan de la page d&rsquo;accueil et de la page de verrouillage de l&rsquo;appareil.<\/li>\n<li>N\u00e9cessite la permission: \u00ab\u00a0Manifest.permission.BIND_WALLPAPER\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n<li>Service d&rsquo;\u00e9nergie (\u00ab\u00a0POWER_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets d&rsquo;avoir acc\u00e8s aux informations relatives \u00e0 la gestion \u00e9nerg\u00e9tique de l&rsquo;appareil.<\/li>\n<li>Certaines fonctionnalit\u00e9s n\u00e9cessitent des permissions sp\u00e9ciales:\n<ul>\n<li>Le Wake_Lock n\u00e9cessite \u00ab\u00a0Manifest.permission.WAKE_LOCK\u00a0\u00bb;<\/li>\n<li>Le red\u00e9marrage de l&rsquo;appareil (reboot) n\u00e9cessite \u00ab\u00a0Manifest.permission.REBOOT\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Service d&rsquo;alarme(\u00ab\u00a0ALARM_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets de cr\u00e9er des lancements planifi\u00e9s de Intent;<\/li>\n<li>Permets \u00e9galement certaines gestions horaires de l&rsquo;appareil;<\/li>\n<li>Certaines fonctionnalit\u00e9s n\u00e9cessitent des permissions sp\u00e9ciales:\n<ul>\n<li>Le \u00ab\u00a0setTime\u00a0\u00bb qui permet de modifier l&rsquo;heure de l&rsquo;appareil n\u00e9cessite \u00ab\u00a0Manifest.permission.SET_TIME\u00a0\u00bb;<\/li>\n<li>Le \u00ab\u00a0setTimeZone\u00a0\u00bb qui permet de modifier le fuseau horaire de l&rsquo;appareil n\u00e9cessite \u00ab\u00a0Manifest.permission.SET_TIME_ZONE\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Service de notification (\u00ab\u00a0NOTIFICATION_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets d&rsquo;informer l&rsquo;utilisateur d&rsquo;action qui se d\u00e9roule en arri\u00e8re-plan.<\/li>\n<\/ul>\n<\/li>\n<li>Service de d\u00e9sactivation du verrouillage de l&rsquo;appareil (\u00ab\u00a0KEYGUARD_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets de d\u00e9sactiver, temporairement et pour l&rsquo;application en cours seulement, le verrouillage de l&rsquo;appareil.<\/li>\n<li>N\u00e9cessite la permission \u00ab\u00a0Manifest.permission.DISABLE_KEYGUARD\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n<li>Service de localisation (\u00ab\u00a0LOCATION_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets d&rsquo;obtenir des informations \u00e0 propos du positionnement de l&rsquo;appareil.<\/li>\n<li>N\u00e9cessite une des permissions suivantes dans le fichier Manifest:\n<ul>\n<li>\u00ab\u00a0Manifest.permission.ACCESS_COARSE_LOCATION\u00a0\u00bb : Permets l&rsquo;obtention d&rsquo;une approximation de la position<\/li>\n<li>\u00ab\u00a0Manifest.permission.ACCESS_FINE_LOCATION\u00a0\u00bb : Permets d&rsquo;obtenir le positionnement pr\u00e9cis de l&rsquo;appareil<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Service de recherche de l&rsquo;appareil (\u00ab\u00a0SEARCH_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets d&rsquo;utiliser la fonctionnalit\u00e9 de recherche de l&rsquo;appareil<\/li>\n<li>Rarement utilis\u00e9 puisqu&rsquo;il y a une m\u00e9thode plus facile dans activit\u00e9s (voir \u00ab\u00a0startSearch\u00a0\u00bb) pour acc\u00e9der aux fonctionnalit\u00e9s de recherche et un \u00ab\u00a0Intent\u00a0\u00bb de type \u00ab\u00a0ACTION_SEARCH\u00a0\u00bb peut \u00e9galement \u00eatre utilis\u00e9;<\/li>\n<\/ul>\n<\/li>\n<li>Gestionnaire de vibration (\u00ab\u00a0VIBRATOR_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets d&rsquo;utiliser la fonctionnalit\u00e9 de vibration de l&rsquo;appareil.<\/li>\n<li>N\u00e9cessite la permission \u00ab\u00a0Manifest.permission.VIBRATE\u00a0\u00bb;<\/li>\n<\/ul>\n<\/li>\n<li>Gestionnaires de r\u00e9seau: Il existe plusieurs gestionnaires qui servent \u00e0 l&rsquo;utilisation ou au diagnostic r\u00e9seau.\n<ul>\n<li>\u00ab\u00a0CONNECTIVITY_SERVICE\u00a0\u00bb: Valider la connexion r\u00e9seau;<\/li>\n<li>\u00ab\u00a0IPSEC_SERVICE\u00a0\u00bb: Utiliser la fonctionnalit\u00e9 IPsec r\u00e9seau;<\/li>\n<li>\u00ab\u00a0WIFI_SERVICE\u00a0\u00bb: Gestionnaire pour le WiFi;<\/li>\n<li>\u00ab\u00a0WIFI_AWARE_SERVICE\u00a0\u00bb: Permets d&rsquo;utiliser et de localiser les appareils WiFi Aware;<\/li>\n<li>\u00ab\u00a0WIFI_P2P_SERVICE\u00a0\u00bb: Permets l&rsquo;utilisation de la fonctionnalit\u00e9 de WiFi directe;<\/li>\n<li>\u00ab\u00a0NETWORK_STATS_SERVICE\u00a0\u00bb: Permets d&rsquo;obtenir de l&rsquo;information sur l&rsquo;utilisation du r\u00e9seau.<\/li>\n<li>\u00c0 noter que plusieurs de ces fonctionnalit\u00e9s n\u00e9cessitent des permissions pour pouvoir \u00eatre utilis\u00e9es. Voir la documentation pour plus de d\u00e9tails.<\/li>\n<\/ul>\n<\/li>\n<li>Gestionnaire de m\u00e9thodes d&rsquo;entr\u00e9e (\u00ab\u00a0INPUT_METHOD_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets de g\u00e9rer les m\u00e9thodes d&rsquo;entr\u00e9es (types de clavier, reconnaissance vocale, etc.)<\/li>\n<li>Plusieurs fonctionnalit\u00e9s de ce gestionnaire n\u00e9cessitent des permissions sp\u00e9ciales.<\/li>\n<\/ul>\n<\/li>\n<li>Service de modes d&rsquo;affichage (\u00ab\u00a0UI_MODE_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets d&rsquo;activer et de d\u00e9sactiver des modes d&rsquo;affichage comme le mode nuit ou le mode voiture.<\/li>\n<\/ul>\n<\/li>\n<li>Service de t\u00e9l\u00e9chargement (\u00ab\u00a0DOWNLOAD_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets de lancer des t\u00e9l\u00e9chargements HTTP(S) en arri\u00e8re-plan<\/li>\n<li>N\u00e9cessite la permission \u00ab\u00a0Manifest.permission.INTERNET\u00a0\u00bb<\/li>\n<\/ul>\n<\/li>\n<li>Gestionnaire de batterie (\u00ab\u00a0BATTERY_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets d&rsquo;avoir de l&rsquo;information \u00e0 propos de la batterie de l&rsquo;appareil<\/li>\n<\/ul>\n<\/li>\n<li>Planificateur de t\u00e2che (\u00ab\u00a0JOB_SCHEDULER_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets de planifier des t\u00e2ches qui s&rsquo;ex\u00e9cuteront dans l&rsquo;application en cours<\/li>\n<\/ul>\n<\/li>\n<li>Gestionnaire mat\u00e9riel (\u00ab\u00a0HARDWARE_PROPERTIES_SERVICE\u00a0\u00bb)\n<ul>\n<li>Permets d&rsquo;avoir acc\u00e8s aux informations sur le mat\u00e9riel de l&rsquo;appareil.<\/li>\n<li>\u00c0 noter que ce gestionnaire peut seulement \u00eatre utilis\u00e9 par les applications syst\u00e8me<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Pour plus d&rsquo;informations, voir la documentation de la m\u00e9thode \u00ab\u00a0getSystemService\u00a0\u00bb <a href=\"https:\/\/developer.android.com\/reference\/android\/content\/Context#getSystemService(java.lang.String)\">ici.<\/a><\/p>\n<h3>\u00c0 propos des permissions<\/h3>\n<p>Pour ajouter une permission dans le Manifest, on doit utiliser:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nt\">&lt;uses-permission<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\"android.permission.NOM_DE_LA_PERMISSION\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n<\/pre>\n<\/div>\n<p>directement \u00e0 la racine de la balise \u00ab\u00a0&lt;manifest&gt;\u00a0\u00bb du fichier \u00ab\u00a0AndroidManifest.xml\u00a0\u00bb.<\/p>\n<h2>Exemple<\/h2>\n<p>Voici un exemple o\u00f9 vous pouvez voir l&rsquo;utilisation de 3 types de service: vibration, information sur la batterie et la d\u00e9sactivation de la veille de l&rsquo;appareil. Pour cet exemple, vous aurez seulement besoin des fichiers de base d&rsquo;un projet Android vide (MainActivity.java, activity_main.xml, etc.). Voici les fichiers qui devront \u00eatre modifi\u00e9s: Le fichier \u00ab\u00a0ActivityMain.java\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">androidx.appcompat.app.AppCompatActivity<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">android.os.BatteryManager<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">android.os.Build<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">android.os.Bundle<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">android.os.HardwarePropertiesManager<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">android.os.PowerManager<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">android.os.Vibrator<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">android.view.View<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">android.widget.Button<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">android.widget.Toast<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MainActivity<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">AppCompatActivity<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <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_main<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">initialiserWakeLock<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">boutonVibrationClique<\/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=\"n\">Vibrator<\/span> <span class=\"n\">lVibreur<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">Vibrator<\/span><span class=\"p\">)<\/span><span class=\"n\">getSystemService<\/span><span class=\"p\">(<\/span><span class=\"n\">VIBRATOR_SERVICE<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lVibreur<\/span><span class=\"p\">.<\/span><span class=\"na\">vibrate<\/span><span class=\"p\">(<\/span><span class=\"mi\">1000<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">boutonChargementClique<\/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=\"n\">BatteryManager<\/span> <span class=\"n\">lbatterie<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">BatteryManager<\/span><span class=\"p\">)<\/span><span class=\"n\">getSystemService<\/span><span class=\"p\">(<\/span><span class=\"n\">BATTERY_SERVICE<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">Toast<\/span> <span class=\"n\">lToast<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">String<\/span> <span class=\"n\">lToastTexte<\/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\">23<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">lbatterie<\/span><span class=\"p\">.<\/span><span class=\"na\">isCharging<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"n\">lToastTexte<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getString<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">string<\/span><span class=\"p\">.<\/span><span class=\"na\">chargement_oui<\/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\">lToastTexte<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getString<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">string<\/span><span class=\"p\">.<\/span><span class=\"na\">chargement_non<\/span><span class=\"p\">);<\/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=\"n\">lToastTexte<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getString<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">string<\/span><span class=\"p\">.<\/span><span class=\"na\">chargement_ind\u00e9fini<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n        <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> <span class=\"n\">lToastTexte<\/span> <span class=\"p\">,<\/span> <span class=\"n\">Toast<\/span><span class=\"p\">.<\/span><span class=\"na\">LENGTH_LONG<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"n\">PowerManager<\/span><span class=\"p\">.<\/span><span class=\"na\">WakeLock<\/span> <span class=\"n\">wakeLock<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">initialiserWakeLock<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">PowerManager<\/span> <span class=\"n\">lPowerManager<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">PowerManager<\/span><span class=\"p\">)<\/span><span class=\"n\">getSystemService<\/span><span class=\"p\">(<\/span><span class=\"n\">POWER_SERVICE<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">wakeLock<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lPowerManager<\/span><span class=\"p\">.<\/span><span class=\"na\">newWakeLock<\/span><span class=\"p\">(<\/span><span class=\"n\">PowerManager<\/span><span class=\"p\">.<\/span><span class=\"na\">FULL_WAKE_LOCK<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"na\">getClass<\/span><span class=\"p\">().<\/span><span class=\"na\">getName<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">boutonVeilleClique<\/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=\"n\">Button<\/span> <span class=\"n\">lBouton<\/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\">bouton_veille<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">wakeLock<\/span><span class=\"p\">.<\/span><span class=\"na\">isHeld<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">wakeLock<\/span><span class=\"p\">.<\/span><span class=\"na\">release<\/span><span class=\"p\">();<\/span>\r\n            <span class=\"n\">lBouton<\/span><span class=\"p\">.<\/span><span class=\"na\">setText<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">string<\/span><span class=\"p\">.<\/span><span class=\"na\">bouton_veille_activer_texte<\/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\">wakeLock<\/span><span class=\"p\">.<\/span><span class=\"na\">acquire<\/span><span class=\"p\">();<\/span>\r\n            <span class=\"n\">lBouton<\/span><span class=\"p\">.<\/span><span class=\"na\">setText<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">string<\/span><span class=\"p\">.<\/span><span class=\"na\">bouton_veille_deactiver_texte<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Le fichier \u00ab\u00a0activity_main.xml\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;<\/span>\r\n<span class=\"nt\">&lt;LinearLayout<\/span> <span class=\"na\">xmlns:android=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res\/android\"<\/span>\r\n    <span class=\"na\">xmlns:app=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res-auto\"<\/span>\r\n    <span class=\"na\">xmlns:tools=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/tools\"<\/span>\r\n    <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">tools:context=<\/span><span class=\"s\">\".MainActivity\"<\/span>\r\n    <span class=\"na\">android:orientation=<\/span><span class=\"s\">\"vertical\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\r\n\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/button_vibration\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:onClick=<\/span><span class=\"s\">\"boutonVibrationClique\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"@string\/bouton_vibration_texte\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/bouton_chargement\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:onClick=<\/span><span class=\"s\">\"boutonChargementClique\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"@string\/bouton_chargement_texte\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;Button<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/bouton_veille\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n        <span class=\"na\">android:onClick=<\/span><span class=\"s\">\"boutonVeilleClique\"<\/span>\r\n        <span class=\"na\">android:text=<\/span><span class=\"s\">\"@string\/bouton_veille_activer_texte\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n<span class=\"nt\">&lt;\/LinearLayout&gt;<\/span>\r\n<\/pre>\n<\/div>\n<p>Le fichier \u00ab\u00a0AndroidManifest.xml\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;<\/span>\r\n<span class=\"nt\">&lt;manifest<\/span> <span class=\"na\">xmlns:android=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res\/android\"<\/span>\r\n    <span class=\"na\">package=<\/span><span class=\"s\">\"me.louismarchand.exempleservices\"<\/span><span class=\"nt\">&gt;<\/span>\r\n    <span class=\"nt\">&lt;uses-permission<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\"android.permission.VIBRATE\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;uses-permission<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\"android.permission.WAKE_LOCK\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;application<\/span>\r\n        <span class=\"na\">android:allowBackup=<\/span><span class=\"s\">\"true\"<\/span>\r\n        <span class=\"na\">android:icon=<\/span><span class=\"s\">\"@mipmap\/ic_launcher\"<\/span>\r\n        <span class=\"na\">android:label=<\/span><span class=\"s\">\"@string\/app_name\"<\/span>\r\n        <span class=\"na\">android:roundIcon=<\/span><span class=\"s\">\"@mipmap\/ic_launcher_round\"<\/span>\r\n        <span class=\"na\">android:supportsRtl=<\/span><span class=\"s\">\"true\"<\/span>\r\n        <span class=\"na\">android:theme=<\/span><span class=\"s\">\"@style\/AppTheme\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        <span class=\"nt\">&lt;activity<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\".MainActivity\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;intent-filter&gt;<\/span>\r\n                <span class=\"nt\">&lt;action<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\"android.intent.action.MAIN\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n                <span class=\"nt\">&lt;category<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\"android.intent.category.LAUNCHER\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n            <span class=\"nt\">&lt;\/intent-filter&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/activity&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/application&gt;<\/span>\r\n<span class=\"nt\">&lt;\/manifest&gt;<\/span>\r\n<\/pre>\n<\/div>\n<p>Le fichier \u00ab\u00a0strings.xml\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nt\">&lt;resources&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"app_name\"<\/span><span class=\"nt\">&gt;<\/span>Exemple Services<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"bouton_vibration_texte\"<\/span><span class=\"nt\">&gt;<\/span>Vibration<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"bouton_chargement_texte\"<\/span><span class=\"nt\">&gt;<\/span>Batterie en chargement<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"bouton_temperature_texte\"<\/span><span class=\"nt\">&gt;<\/span>Temp\u00e9rature du processeur<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"chargement_oui\"<\/span><span class=\"nt\">&gt;<\/span>La batterie est en chargement<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"chargement_non\"<\/span><span class=\"nt\">&gt;<\/span>La batterie n\\'est pas en chargement<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"chargement_ind\u00e9fini\"<\/span><span class=\"nt\">&gt;<\/span>La gestion de la batterie n\\'est pas support\u00e9e<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"bouton_veille_activer_texte\"<\/span><span class=\"nt\">&gt;<\/span>La veille est activ\u00e9<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"bouton_veille_deactiver_texte\"<\/span><span class=\"nt\">&gt;<\/span>La veille est d\u00e9sactiv\u00e9<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n<span class=\"nt\">&lt;\/resources&gt;<\/span>\r\n<\/pre>\n<\/div>\n<h2>Activer les autorisation \u00e0 partir du code<\/h2>\n<p>Dans les derni\u00e8res version d&rsquo;Android, ajouter la permission dans le fichier \u00ab\u00a0AndroidManifest.xml\u00a0\u00bb n&rsquo;est plus suffisant pour permettre \u00e0 l&rsquo;application d&rsquo;utiliser certains services. C&rsquo;est le cas pour les permissions de:<\/p>\n<ul>\n<li>Informations d&rsquo;entrainement (Senseur cardiaque, information sur les activit\u00e9s, etc.),<\/li>\n<li>Calendrier,<\/li>\n<li>Contacts,<\/li>\n<li>Utilisation du service t\u00e9l\u00e9phonique,<\/li>\n<li>SMS,<\/li>\n<li>Service de localisation (GPS)<\/li>\n<li>Utilisation des fichiers externes de l&rsquo;application,<\/li>\n<li>Utilisation du microphone et de la cam\u00e9ra,<\/li>\n<li>Historique syst\u00e8me.<\/li>\n<\/ul>\n<p>Il est possible de laisser l&rsquo;utilisateur activer manuellement l&rsquo;autorisation dans les param\u00e8tres de l&rsquo;application, mais il va de soi que cette mani\u00e8re de faire est quelque peu probl\u00e9matique puisque plusieurs utilisateurs d&rsquo;appareils ne savent pas comment activer manuellement une autorisation dans le syst\u00e8me. Ainsi, il y a \u00e9galement moyen de demander l&rsquo;autorisation de l&rsquo;utilisateur, directement \u00e0 partir du code Java. Pour ce faire, il faut utiliser le code:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">Build<\/span><span class=\"o\">.<\/span><span class=\"na\">VERSION<\/span><span class=\"o\">.<\/span><span class=\"na\">SDK_INT<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"mi\">23<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">requestPermissions<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">String<\/span><span class=\"o\">[]{<\/span><span class=\"n\">Manifest<\/span><span class=\"o\">.<\/span><span class=\"na\">permission<\/span><span class=\"o\">.<\/span><span class=\"na\">LA_PERMISSION<\/span><span class=\"o\">},<\/span> <span class=\"mi\">1<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Il est \u00e0 noter que ce syst\u00e8me d&rsquo;autorisation existe seulement depuis Android M (API 23). Donc, pour les syst\u00e8mes avant Android M, seulement la permission dans le fichier \u00ab\u00a0AndroidManifest.xml\u00a0\u00bb \u00e9tait n\u00e9cessaire. Notez \u00e9galement qu&rsquo;il est possible ici de demander plusieurs autorisations en m\u00eame temps. Sachez \u00e9galement que si vous voulez utiliser la fonctionnalit\u00e9 que vous demandez l&rsquo;autorisation directement lorsque l&rsquo;utilisateur l&rsquo;accepte, vous ne devez pas ex\u00e9cuter le code du service directement apr\u00e8s le code d&rsquo;autorisation (ci-dessus). Il faut utiliser l&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onRequestPermissionsResult\u00a0\u00bb. Il suffit de faire le red\u00e9finir la m\u00e9thode dans l&rsquo;activit\u00e9 qui a effectu\u00e9 la demande d&rsquo;autorisation:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nd\">@Override<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onRequestPermissionsResult<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aCode<\/span><span class=\"o\">,<\/span>\r\n                                       <span class=\"n\">String<\/span> <span class=\"n\">aPermission<\/span><span class=\"o\">[],<\/span>\r\n                                       <span class=\"kt\">int<\/span><span class=\"o\">[]<\/span> <span class=\"n\">aAccepte<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">super<\/span><span class=\"o\">.<\/span><span class=\"na\">onRequestPermissionsResult<\/span><span class=\"o\">(<\/span><span class=\"n\">aCode<\/span><span class=\"o\">,<\/span> <span class=\"n\">aPermission<\/span><span class=\"o\">,<\/span>\r\n            <span class=\"n\">aAccepte<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"c1\">\/\/ Ex\u00e9cuter le service<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Il est d&rsquo;ailleurs \u00e0 noter que le \u00ab\u00a01\u00a0\u00bb utiliser comme second argument de la m\u00e9thode \u00ab\u00a0<span class=\"n\">requestPermissions<\/span>\u00a0\u00bb plus haut sert \u00e0 identifier pr\u00e9cis\u00e9ment la demande d&rsquo;autorisation dans l&rsquo;\u00e9v\u00e9nement \u00ab\u00a0<span class=\"na\">onRequestPermissionsResult<\/span>\u00a0\u00bb (3\u00e8 argument).<\/p>\n<p>Finalement, puisque l&rsquo;utilisateur peut refuser de donner l&rsquo;autorisation, il est important d&rsquo;ex\u00e9cuter le service \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un \u00ab\u00a0if\u00a0\u00bb v\u00e9rifiant que l&rsquo;application poss\u00e8de l&rsquo;autorisation d&rsquo;utiliser le service. Voici le code permettant de valider cet autorisation:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">Build<\/span><span class=\"o\">.<\/span><span class=\"na\">VERSION<\/span><span class=\"o\">.<\/span><span class=\"na\">SDK_INT<\/span> <span class=\"o\">&lt;<\/span> <span class=\"mi\">23<\/span> <span class=\"o\">||<\/span>\r\n        <span class=\"n\">checkSelfPermission<\/span><span class=\"o\">(<\/span><span class=\"n\">Manifest<\/span><span class=\"o\">.<\/span><span class=\"na\">permission<\/span><span class=\"o\">.<\/span><span class=\"na\">LA_PERMISSION<\/span><span class=\"o\">)<\/span> <span class=\"o\">==<\/span>\r\n        <span class=\"n\">PackageManager<\/span><span class=\"o\">.<\/span><span class=\"na\">PERMISSION_GRANTED<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"c1\">\/\/ Le code du service<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Par exemple, voici un code qui affiche le nom du premier contact de l&rsquo;appareil:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">afficherPremierContact<\/span><span class=\"o\">(){<\/span>\r\n    <span class=\"n\">ContentResolver<\/span> <span class=\"n\">lContentResolver<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getContentResolver<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"n\">Cursor<\/span> <span class=\"n\">lCurseur<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lContentResolver<\/span><span class=\"o\">.<\/span><span class=\"na\">query<\/span><span class=\"o\">(<\/span>\r\n            <span class=\"n\">ContactsContract<\/span><span class=\"o\">.<\/span><span class=\"na\">Contacts<\/span><span class=\"o\">.<\/span><span class=\"na\">CONTENT_URI<\/span><span class=\"o\">,<\/span>\r\n            <span class=\"kc\">null<\/span><span class=\"o\">,<\/span> <span class=\"kc\">null<\/span><span class=\"o\">,<\/span> <span class=\"kc\">null<\/span><span class=\"o\">,<\/span> <span class=\"kc\">null<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">lCurseur<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">){<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">lCurseur<\/span><span class=\"o\">.<\/span><span class=\"na\">getCount<\/span><span class=\"o\">()<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">0<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"n\">lCurseur<\/span><span class=\"o\">.<\/span><span class=\"na\">moveToNext<\/span><span class=\"o\">();<\/span>\r\n            <span class=\"n\">Log<\/span><span class=\"o\">.<\/span><span class=\"na\">i<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Service Exemple\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"Le premier contact: \"<\/span> <span class=\"o\">+<\/span>\r\n                    <span class=\"n\">lCurseur<\/span><span class=\"o\">.<\/span><span class=\"na\">getString<\/span><span class=\"o\">(<\/span><span class=\"n\">lCurseur<\/span><span class=\"o\">.<\/span><span class=\"na\">getColumnIndex<\/span><span class=\"o\">(<\/span>\r\n                            <span class=\"n\">ContactsContract<\/span><span class=\"o\">.<\/span><span class=\"na\">Contacts<\/span><span class=\"o\">.<\/span><span class=\"na\">DISPLAY_NAME<\/span><span class=\"o\">)));<\/span>\r\n        <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"n\">Log<\/span><span class=\"o\">.<\/span><span class=\"na\">i<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Service Exemple\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"L'appareil n'a aucun contacts.\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">Log<\/span><span class=\"o\">.<\/span><span class=\"na\">e<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Service Exemple\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"Une erreur s'est produite\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Pour pouvoir utiliser ce code, il faut inscrire la permission \u00ab\u00a0READ_CONTACTS\u00a0\u00bb dans le \u00ab\u00a0AndroidManifest.xml\u00a0\u00bb. Comme ceci:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nt\">&lt;uses-permission<\/span> <span class=\"na\">android:name =<\/span> <span class=\"s\">\"android.permission.READ_CONTACTS\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n<\/pre>\n<\/div>\n<p>Par contre, si vous utilisez directement ce code, m\u00eame avec la permission bien indiqu\u00e9e dans le \u00ab\u00a0AndroidManifest.xml\u00a0\u00bb, vous obtiendrez une exception de permission. En effet, pour pouvoir utiliser ce service, l&rsquo;utilisateur devra donner son autorisation. Il peut le faire manuellement dans les param\u00e8tres syst\u00e8me de l&rsquo;application:<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-408\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/autorisation1.png\" alt=\"\" width=\"167\" height=\"300\" srcset=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/autorisation1.png 269w, https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/autorisation1-167x300.png 167w\" sizes=\"auto, (max-width: 167px) 100vw, 167px\" \/> -&gt; <img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-409\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/autorisation2.png\" alt=\"\" width=\"167\" height=\"300\" srcset=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/autorisation2.png 267w, https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/autorisation2-167x300.png 167w\" sizes=\"auto, (max-width: 167px) 100vw, 167px\" \/><\/p>\n<p>Afin de faire en sorte que le code Java demande l&rsquo;autorisation (sans que l&rsquo;utilisateur ait \u00e0 donner l&rsquo;autorisation directement dans les param\u00e8tres), on peut faire le code suivant:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">Build<\/span><span class=\"o\">.<\/span><span class=\"na\">VERSION<\/span><span class=\"o\">.<\/span><span class=\"na\">SDK_INT<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"mi\">23<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">requestPermissions<\/span><span class=\"o\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">String<\/span><span class=\"o\">[]{<\/span><span class=\"n\">Manifest<\/span><span class=\"o\">.<\/span><span class=\"na\">permission<\/span><span class=\"o\">.<\/span><span class=\"na\">READ_CONTACTS<\/span><span class=\"o\">},<\/span> <span class=\"mi\">1<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Ce code peut, par exemple, \u00eatre utilis\u00e9 dans le OnCreate, ou sur un bouton indiquant de demander l&rsquo;autorisation. Si je voulais afficher le premier contact \u00e0 l&rsquo;instant o\u00f9 l&rsquo;utilisateur a donn\u00e9 son autorisation, je pourrais faire la m\u00e9thode:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nd\">@Override<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onRequestPermissionsResult<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aCode<\/span><span class=\"o\">,<\/span>\r\n                                       <span class=\"n\">String<\/span> <span class=\"n\">aPermission<\/span><span class=\"o\">[],<\/span>\r\n                                       <span class=\"kt\">int<\/span><span class=\"o\">[]<\/span> <span class=\"n\">aAccepte<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">super<\/span><span class=\"o\">.<\/span><span class=\"na\">onRequestPermissionsResult<\/span><span class=\"o\">(<\/span><span class=\"n\">aCode<\/span><span class=\"o\">,<\/span> <span class=\"n\">aPermission<\/span><span class=\"o\">,<\/span>\r\n            <span class=\"n\">aAccepte<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">afficherPremierContact<\/span><span class=\"o\">();<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Pour termin\u00e9, on doit modifier la m\u00e9thode \u00ab\u00a0afficherPremierContact\u00a0\u00bb afin de s&rsquo;assurer que l&rsquo;application ne ferme pas lorsque l&rsquo;utilisateur refuse l&rsquo;autorisation d&rsquo;utiliser le service de contacts:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">afficherPremierContact<\/span><span class=\"o\">(){<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">Build<\/span><span class=\"o\">.<\/span><span class=\"na\">VERSION<\/span><span class=\"o\">.<\/span><span class=\"na\">SDK_INT<\/span> <span class=\"o\">&lt;<\/span> <span class=\"mi\">23<\/span> <span class=\"o\">||<\/span>\r\n            <span class=\"n\">checkSelfPermission<\/span><span class=\"o\">(<\/span><span class=\"n\">Manifest<\/span><span class=\"o\">.<\/span><span class=\"na\">permission<\/span><span class=\"o\">.<\/span><span class=\"na\">READ_CONTACTS<\/span><span class=\"o\">)<\/span> <span class=\"o\">==<\/span>\r\n            <span class=\"n\">PackageManager<\/span><span class=\"o\">.<\/span><span class=\"na\">PERMISSION_GRANTED<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">ContentResolver<\/span> <span class=\"n\">lContentResolver<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getContentResolver<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"n\">Cursor<\/span> <span class=\"n\">lCurseur<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lContentResolver<\/span><span class=\"o\">.<\/span><span class=\"na\">query<\/span><span class=\"o\">(<\/span>\r\n                <span class=\"n\">ContactsContract<\/span><span class=\"o\">.<\/span><span class=\"na\">Contacts<\/span><span class=\"o\">.<\/span><span class=\"na\">CONTENT_URI<\/span><span class=\"o\">,<\/span>\r\n                <span class=\"kc\">null<\/span><span class=\"o\">,<\/span> <span class=\"kc\">null<\/span><span class=\"o\">,<\/span> <span class=\"kc\">null<\/span><span class=\"o\">,<\/span> <span class=\"kc\">null<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">lCurseur<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">){<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">lCurseur<\/span><span class=\"o\">.<\/span><span class=\"na\">getCount<\/span><span class=\"o\">()<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">0<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n                <span class=\"n\">lCurseur<\/span><span class=\"o\">.<\/span><span class=\"na\">moveToNext<\/span><span class=\"o\">();<\/span>\r\n                <span class=\"n\">Log<\/span><span class=\"o\">.<\/span><span class=\"na\">i<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Service Exemple\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"Le premier contact: \"<\/span> <span class=\"o\">+<\/span>\r\n                        <span class=\"n\">lCurseur<\/span><span class=\"o\">.<\/span><span class=\"na\">getString<\/span><span class=\"o\">(<\/span><span class=\"n\">lCurseur<\/span><span class=\"o\">.<\/span><span class=\"na\">getColumnIndex<\/span><span class=\"o\">(<\/span>\r\n                                <span class=\"n\">ContactsContract<\/span><span class=\"o\">.<\/span><span class=\"na\">Contacts<\/span><span class=\"o\">.<\/span><span class=\"na\">DISPLAY_NAME<\/span><span class=\"o\">)));<\/span>\r\n            <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"o\">{<\/span>\r\n                <span class=\"n\">Log<\/span><span class=\"o\">.<\/span><span class=\"na\">i<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Service Exemple\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"L'appareil n'a aucun contacts.\"<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"n\">Log<\/span><span class=\"o\">.<\/span><span class=\"na\">e<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Service Exemple\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"Un erreur s'est produit\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<h2>Syst\u00e8mes de fichiers<\/h2>\n<p>Android vous permet d&rsquo;avoir acc\u00e8s \u00e0 certaines informations concernant les syst\u00e8mes de fichiers de l&rsquo;appareil Android. Lorsque je parle de syst\u00e8mes de fichiers, j&rsquo;inclus l&#8217;emplacement des r\u00e9pertoires sp\u00e9ciaux (documents de l&rsquo;utilisateur, r\u00e9pertoire de l&rsquo;application, etc.) ou bien l&rsquo;information sur l&rsquo;utilisation d&rsquo;une carte SD dans l&rsquo;appareil. Pour avoir acc\u00e8s \u00e0 ces informations, vous pouvez utiliser certaines m\u00e9thodes de la classe \u00ab\u00a0Context\u00a0\u00bb (accessible \u00e0 partir des activit\u00e9s) et certaines m\u00e9thodes de la classe \u00ab\u00a0Environment\u00a0\u00bb. La documentation de la classe \u00ab\u00a0Environment\u00a0\u00bb est <a href=\"https:\/\/developer.android.com\/reference\/android\/os\/Environment\">ici<\/a>. Les m\u00e9thodes de contexte permettant d&rsquo;atteindre des r\u00e9pertoires syst\u00e8me les plus utiles sont:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>getFilesDir()\n<ul>\n<li>Permets d&rsquo;avoir acc\u00e8s au r\u00e9pertoire de donn\u00e9es interne de l&rsquo;application\n<ul>\n<li>Les fichiers sont d\u00e9truits si l&rsquo;application est d\u00e9sinstall\u00e9e.<\/li>\n<\/ul>\n<\/li>\n<li>Il n&rsquo;est pas n\u00e9cessaire de demander de permission pour utiliser ce r\u00e9pertoire.<\/li>\n<li>L&rsquo;utilisateur n&rsquo;a (g\u00e9n\u00e9ralement) pas acc\u00e8s \u00e0 ce r\u00e9pertoire directement.<\/li>\n<\/ul>\n<\/li>\n<li>getCacheDir()\n<ul>\n<li>Permets de stocker de l&rsquo;information temporaire<\/li>\n<li>Il est de la responsabilit\u00e9 de l&rsquo;application de supprimer les fichiers temporaires lorsque ceux-ci ne sont plus utiles.\n<ul>\n<li>Les fichiers sont d\u00e9truits si l&rsquo;application est d\u00e9sinstall\u00e9e.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>getExternalFilesDir(String type)\n<ul>\n<li>Permets d&rsquo;avoir acc\u00e8s aux r\u00e9pertoires de donn\u00e9es de l&rsquo;utilisateur (contenant les documents, t\u00e9l\u00e9chargements, etc.)\n<ul>\n<li>Les fichiers sont d\u00e9truits si l&rsquo;application est d\u00e9sinstall\u00e9e.<\/li>\n<\/ul>\n<\/li>\n<li>L&rsquo;utilisateur a acc\u00e8s \u00e0 ces fichiers.<\/li>\n<li>Le \u00ab\u00a0type\u00a0\u00bb repr\u00e9sente quel r\u00e9pertoire vous d\u00e9sirez ouvrir. Il faut utiliser les constantes \u00ab\u00a0Fields\u00a0\u00bb de la classe \u00ab\u00a0Environment\u00a0\u00bb.\n<ul>\n<li>Par exemple: \u00ab\u00a0DIRECTORY_DOCUMENTS\u00a0\u00bb, \u00ab\u00a0DIRECTORY_DOWNLOADS\u00a0\u00bb, etc.<\/li>\n<li>\u00c9galement, pour avoir acc\u00e8s \u00e0 la racine, envoyer \u00ab\u00a0null\u00a0\u00bb au champ \u00ab\u00a0type\u00a0\u00bb.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Il est \u00e0 noter que depuis l&rsquo;API 29, il n&rsquo;est plus possible d&rsquo;avoir directement acc\u00e8s aux donn\u00e9es partag\u00e9s de l&rsquo;utilisateur (par exemple: \u00ab\u00a0\/sdcard\/\u00a0\u00bb). Il est toujours possible d&rsquo;y avoir acc\u00e8s, mais il faut utiliser le syst\u00e8me de d&rsquo;Acc\u00e8s aux r\u00e9pertoires de l&rsquo;utilisateur (voir <a href=\"https:\/\/developer.android.com\/training\/data-storage\/shared\/documents-files#grant-access-directory\">documentation<\/a>)<\/p>\n<p>Voici un exemple d&rsquo;utilisation permettant d&rsquo;avoir acc\u00e8s \u00e0 un r\u00e9pertoire partag\u00e9 et de stocker la permission de mani\u00e8re permanente:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MainActivity<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">AppCompatActivity<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">String<\/span> <span class=\"n\">resultPath<\/span><span class=\"p\">;<\/span>\r\n\r\n    <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_main<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">validerAccesRepertoire<\/span><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\">validerAccesRepertoire<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">android<\/span><span class=\"p\">.<\/span><span class=\"na\">os<\/span><span class=\"p\">.<\/span><span class=\"na\">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=\"n\">android<\/span><span class=\"p\">.<\/span><span class=\"na\">os<\/span><span class=\"p\">.<\/span><span class=\"na\">Build<\/span><span class=\"p\">.<\/span><span class=\"na\">VERSION_CODES<\/span><span class=\"p\">.<\/span><span class=\"na\">KITKAT<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">UriPermission<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lPermissions<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getContentResolver<\/span><span class=\"p\">().<\/span><span class=\"na\">getPersistedUriPermissions<\/span><span class=\"p\">();<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">lPermissions<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"n\">lPermissions<\/span><span class=\"p\">.<\/span><span class=\"na\">size<\/span><span class=\"p\">()<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"n\">resultPath<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lPermissions<\/span><span class=\"p\">.<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">).<\/span><span class=\"na\">getUri<\/span><span class=\"p\">().<\/span><span class=\"na\">getPath<\/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=\"n\">resultPath<\/span><span class=\"p\">,<\/span> <span class=\"n\">Toast<\/span><span class=\"p\">.<\/span><span class=\"na\">LENGTH_LONG<\/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> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"n\">demanderAccesRepertoire<\/span><span class=\"p\">();<\/span>\r\n            <span class=\"p\">}<\/span>\r\n        <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">demanderAccesRepertoire<\/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=\"n\">Intent<\/span><span class=\"p\">.<\/span><span class=\"na\">ACTION_OPEN_DOCUMENT_TREE<\/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=\"n\">DocumentsContract<\/span><span class=\"p\">.<\/span><span class=\"na\">EXTRA_INITIAL_URI<\/span><span class=\"p\">,<\/span> <span class=\"s\">&quot;\/sdcard\/Documents&quot;<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">ActivityResultLauncher<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Intent<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lIntentResult<\/span> <span class=\"o\">=<\/span>  <span class=\"n\">registerForActivityResult<\/span><span class=\"p\">(<\/span>\r\n                <span class=\"k\">new<\/span> <span class=\"n\">ActivityResultContracts<\/span><span class=\"p\">.<\/span><span class=\"na\">StartActivityForResult<\/span><span class=\"p\">(),<\/span>\r\n                <span class=\"k\">new<\/span> <span class=\"n\">demanderAccesRepertoireResultat<\/span><span class=\"p\">());<\/span>\r\n        <span class=\"n\">lIntentResult<\/span><span class=\"p\">.<\/span><span class=\"na\">launch<\/span><span class=\"p\">(<\/span><span class=\"n\">lIntent<\/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\">demanderAccesRepertoireResultat<\/span> <span class=\"kd\">implements<\/span>\r\n            <span class=\"n\">ActivityResultCallback<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">ActivityResult<\/span><span class=\"o\">&gt;<\/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\">onActivityResult<\/span><span class=\"p\">(<\/span><span class=\"n\">ActivityResult<\/span> <span class=\"n\">result<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">String<\/span> <span class=\"n\">lTexte<\/span> <span class=\"o\">=<\/span> <span class=\"s\">&quot;Erreur!!!&quot;<\/span><span class=\"p\">;<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">result<\/span><span class=\"p\">.<\/span><span class=\"na\">getResultCode<\/span><span class=\"p\">()<\/span> <span class=\"o\">==<\/span> <span class=\"n\">Activity<\/span><span class=\"p\">.<\/span><span class=\"na\">RESULT_OK<\/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=\"n\">result<\/span><span class=\"p\">.<\/span><span class=\"na\">getData<\/span><span class=\"p\">();<\/span>\r\n\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\">19<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n                    <span class=\"n\">getContentResolver<\/span><span class=\"p\">().<\/span><span class=\"na\">takePersistableUriPermission<\/span><span class=\"p\">(<\/span>\r\n                            <span class=\"n\">lIntent<\/span><span class=\"p\">.<\/span><span class=\"na\">getData<\/span><span class=\"p\">(),<\/span>\r\n                            <span class=\"n\">Intent<\/span><span class=\"p\">.<\/span><span class=\"na\">FLAG_GRANT_READ_URI_PERMISSION<\/span><span class=\"p\">);<\/span>\r\n                    <span class=\"n\">getContentResolver<\/span><span class=\"p\">().<\/span><span class=\"na\">takePersistableUriPermission<\/span><span class=\"p\">(<\/span>\r\n                            <span class=\"n\">lIntent<\/span><span class=\"p\">.<\/span><span class=\"na\">getData<\/span><span class=\"p\">(),<\/span>\r\n                            <span class=\"n\">Intent<\/span><span class=\"p\">.<\/span><span class=\"na\">FLAG_GRANT_WRITE_URI_PERMISSION<\/span><span class=\"p\">);<\/span>\r\n                <span class=\"p\">}<\/span>\r\n                <span class=\"n\">resultPath<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lIntent<\/span><span class=\"p\">.<\/span><span class=\"na\">getData<\/span><span class=\"p\">().<\/span><span class=\"na\">getPath<\/span><span class=\"p\">();<\/span>\r\n                <span class=\"n\">lTexte<\/span> <span class=\"o\">=<\/span> <span class=\"s\">&quot;Succes: &quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">resultPath<\/span><span class=\"p\">;<\/span>\r\n            <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">result<\/span><span class=\"p\">.<\/span><span class=\"na\">getResultCode<\/span><span class=\"p\">()<\/span> <span class=\"o\">==<\/span> <span class=\"n\">Activity<\/span><span class=\"p\">.<\/span><span class=\"na\">RESULT_CANCELED<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"n\">lTexte<\/span> <span class=\"o\">=<\/span> <span class=\"s\">&quot;Annuler!&quot;<\/span><span class=\"p\">;<\/span>\r\n                <span class=\"n\">resultPath<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n            <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=\"n\">getApplicationContext<\/span><span class=\"p\">(),<\/span>\r\n                    <span class=\"n\">lTexte<\/span><span class=\"p\">,<\/span> <span class=\"n\">Toast<\/span><span class=\"p\">.<\/span><span class=\"na\">LENGTH_LONG<\/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<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>\u00c9galement, il est \u00e0 noter que depuis L&rsquo;API 30 (Android 11), il est possible d&rsquo;avoir acc\u00e8s aux r\u00e9pertoires contenant tous les points de montage externe (\u00e9mul\u00e9 ou r\u00e9el) en utilisant la m\u00e9thode \u00ab\u00a0Environment.getStorageDirectory()\u00a0\u00bb.<\/p>\n<p>Finalement, prendre note que si vous d\u00e9sirez lire et \u00e9crire des fichiers dans le r\u00e9pertoire externe de l&rsquo;application (par exemple, avec getExternalFilesDir), vous devrez utiliser les permissions:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Manifest.permission.WRITE_EXTERNAL_STORAGE\n<ul>\n<li>Permettre d&rsquo;\u00e9crire dans des fichiers et de cr\u00e9er de nouveaux fichiers<\/li>\n<\/ul>\n<\/li>\n<li>Manifest.permission.READ_EXTERNAL_STORAGE\n<ul>\n<li>Permettre de lire le contenu des fichiers<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Exemple<\/h3>\n<p>Voici un exemple qui affiche divers r\u00e9pertoires Android \u00e0 l&rsquo;\u00e9cran. Pour cet exemple, vous aurez seulement besoin des fichiers de base d\u2019un projet Android vide (MainActivity.java, activity_main.xml, etc.). Voici les fichiers qui devront \u00eatre modifi\u00e9s: Fichier \u00ab\u00a0MainActivity.java\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kn\">package<\/span> <span class=\"nn\">me.louismarchand.exempleenvironment<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">androidx.appcompat.app.AppCompatActivity<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">android.os.Build<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">android.os.Bundle<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">android.os.Environment<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">android.widget.TextView<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.io.File<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MainActivity<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">AppCompatActivity<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <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_main<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">initialiseVues<\/span><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\">initialiseVues<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"n\">afficheFilePath<\/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\">texte_vue_data<\/span><span class=\"p\">,<\/span> <span class=\"n\">getFilesDir<\/span><span class=\"p\">());<\/span>\r\n        <span class=\"n\">afficheFilePath<\/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\">texte_vue_cache<\/span><span class=\"p\">,<\/span> <span class=\"n\">getCacheDir<\/span><span class=\"p\">());<\/span>\r\n        <span class=\"n\">afficheFilePath<\/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\">texte_vue_utilisateur<\/span><span class=\"p\">,<\/span> <span class=\"n\">getExternalFilesDir<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">afficheFilePath<\/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\">texte_vue_telechargement<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"n\">getExternalFilesDir<\/span><span class=\"p\">(<\/span><span class=\"n\">Environment<\/span><span class=\"p\">.<\/span><span class=\"na\">DIRECTORY_DOWNLOADS<\/span><span class=\"p\">));<\/span>\r\n\r\n    <span class=\"p\">}<\/span>\r\n\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">afficheFilePath<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aId<\/span><span class=\"p\">,<\/span> <span class=\"n\">File<\/span> <span class=\"n\">aFichier<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">TextView<\/span> <span class=\"n\">ltexteVue<\/span> <span class=\"o\">=<\/span> <span class=\"n\">findViewById<\/span><span class=\"p\">(<\/span><span class=\"n\">aId<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">ltexteVue<\/span><span class=\"p\">.<\/span><span class=\"na\">setText<\/span><span class=\"p\">(<\/span><span class=\"n\">aFichier<\/span><span class=\"p\">.<\/span><span class=\"na\">getAbsolutePath<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Le fichier \u00ab\u00a0activity_main.xml\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;<\/span>\r\n<span class=\"nt\">&lt;LinearLayout<\/span> <span class=\"na\">xmlns:android=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res\/android\"<\/span>\r\n    <span class=\"na\">xmlns:app=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res-auto\"<\/span>\r\n    <span class=\"na\">xmlns:tools=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/tools\"<\/span>\r\n    <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">tools:context=<\/span><span class=\"s\">\".MainActivity\"<\/span>\r\n    <span class=\"na\">android:orientation=<\/span><span class=\"s\">\"vertical\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;LinearLayout<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:orientation=<\/span><span class=\"s\">\"horizontal\"<\/span>\r\n        <span class=\"na\">android:gravity=<\/span><span class=\"s\">\"center\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\r\n        <span class=\"nt\">&lt;TextView<\/span>\r\n            <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/texte_vue_data_label\"<\/span>\r\n            <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n            <span class=\"na\">android:gravity=<\/span><span class=\"s\">\"right|center_vertical\"<\/span>\r\n            <span class=\"na\">android:text=<\/span><span class=\"s\">\"@string\/texte_vue_data_texte\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n        <span class=\"nt\">&lt;TextView<\/span>\r\n            <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/texte_vue_data\"<\/span>\r\n            <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n            <span class=\"na\">android:gravity=<\/span><span class=\"s\">\"left|center_vertical\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/LinearLayout&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;LinearLayout<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:orientation=<\/span><span class=\"s\">\"horizontal\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\r\n        <span class=\"nt\">&lt;TextView<\/span>\r\n            <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/texte_vue_cache_label\"<\/span>\r\n            <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n            <span class=\"na\">android:gravity=<\/span><span class=\"s\">\"right|center_vertical\"<\/span>\r\n            <span class=\"na\">android:text=<\/span><span class=\"s\">\"@string\/texte_vue_cache_texte\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n        <span class=\"nt\">&lt;TextView<\/span>\r\n            <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/texte_vue_cache\"<\/span>\r\n            <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n            <span class=\"na\">android:gravity=<\/span><span class=\"s\">\"left|center_vertical\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/LinearLayout&gt;<\/span>\r\n\r\n\r\n    <span class=\"nt\">&lt;LinearLayout<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:orientation=<\/span><span class=\"s\">\"horizontal\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\r\n        <span class=\"nt\">&lt;TextView<\/span>\r\n            <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/texte_vue_utilisateur_label\"<\/span>\r\n            <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n            <span class=\"na\">android:gravity=<\/span><span class=\"s\">\"right|center_vertical\"<\/span>\r\n            <span class=\"na\">android:text=<\/span><span class=\"s\">\"@string\/texte_vue_utilisateur_texte\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n        <span class=\"nt\">&lt;TextView<\/span>\r\n            <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/texte_vue_utilisateur\"<\/span>\r\n            <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n            <span class=\"na\">android:gravity=<\/span><span class=\"s\">\"left|center_vertical\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/LinearLayout&gt;<\/span>\r\n\r\n\r\n    <span class=\"nt\">&lt;LinearLayout<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n        <span class=\"na\">android:orientation=<\/span><span class=\"s\">\"horizontal\"<\/span>\r\n        <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\r\n        <span class=\"nt\">&lt;TextView<\/span>\r\n            <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/texte_vue_telechargement_label\"<\/span>\r\n            <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n            <span class=\"na\">android:gravity=<\/span><span class=\"s\">\"right|center_vertical\"<\/span>\r\n            <span class=\"na\">android:text=<\/span><span class=\"s\">\"@string\/texte_vue_telechargement_texte\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n        <span class=\"nt\">&lt;TextView<\/span>\r\n            <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/texte_vue_telechargement\"<\/span>\r\n            <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n            <span class=\"na\">android:layout_weight=<\/span><span class=\"s\">\"1\"<\/span>\r\n            <span class=\"na\">android:gravity=<\/span><span class=\"s\">\"left|center_vertical\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/LinearLayout&gt;<\/span>\r\n\r\n<span class=\"nt\">&lt;\/LinearLayout&gt;<\/span>\r\n<\/pre>\n<\/div>\n<p>Le fichier \u00ab\u00a0strings.xml\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nt\">&lt;resources&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"app_name\"<\/span><span class=\"nt\">&gt;<\/span>Exemple Environment<span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"texte_vue_data_texte\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        R\u00e9pertoire de donn\u00e9es interne de l\\'application:\\u0020\r\n    <span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"texte_vue_cache_texte\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        R\u00e9pertoire de fichier temporaire de l\\'application:\\u0020\r\n    <span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"texte_vue_utilisateur_texte\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        R\u00e9pertoire racine des fichiers de l\\'utilisateur:\\u0020\r\n    <span class=\"nt\">&lt;\/string&gt;<\/span>\r\n    <span class=\"nt\">&lt;string<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"texte_vue_telechargement_texte\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        R\u00e9pertoire des t\u00e9l\u00e9chargement de l\\'utilisateur:\\u0020\r\n    <span class=\"nt\">&lt;\/string&gt;<\/span>\r\n\r\n<span class=\"nt\">&lt;\/resources&gt;<\/span>\r\n<\/pre>\n<\/div>\n<h3>Autre exemple<\/h3>\n<p>Cet exemple cr\u00e9era un fichier texte \u00e0 la racine de la m\u00e9moire interne (sdcard) de l&rsquo;appareil \u00e0 l&rsquo;ouverture du programme.<\/p>\n<p>Voici le code java de l&rsquo;Activit\u00e9:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MainActivity<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">AppCompatActivity<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">AUTORISATION_ECRITURE<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">123<\/span><span class=\"p\">;<\/span>\r\n\r\n    <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\">requestCode<\/span><span class=\"p\">,<\/span> <span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">permissions<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span><span class=\"o\">[]<\/span> <span class=\"n\">grantResults<\/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\">requestCode<\/span><span class=\"p\">,<\/span> <span class=\"n\">permissions<\/span><span class=\"p\">,<\/span> <span class=\"n\">grantResults<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">requestCode<\/span> <span class=\"o\">==<\/span> <span class=\"n\">AUTORISATION_ECRITURE<\/span> <span class=\"o\">&amp;&amp;<\/span>\r\n                <span class=\"n\">grantResults<\/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=\"n\">creerFichier<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <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_main<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">demandePermission<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">creerFichier<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"n\">File<\/span> <span class=\"n\">lFile<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">File<\/span><span class=\"p\">(<\/span><span class=\"n\">getExternalFilesDir<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">),<\/span> <span class=\"s\">\"test.txt\"<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">FileWriter<\/span> <span class=\"n\">lWriter<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">lWriter<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">FileWriter<\/span><span class=\"p\">(<\/span><span class=\"n\">lFile<\/span><span class=\"p\">.<\/span><span class=\"na\">getAbsolutePath<\/span><span class=\"p\">());<\/span>\r\n            <span class=\"n\">lWriter<\/span><span class=\"p\">.<\/span><span class=\"na\">write<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Allo!!!\"<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"n\">lWriter<\/span><span class=\"p\">.<\/span><span class=\"na\">close<\/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=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"na\">printStackTrace<\/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\">demandePermission<\/span><span class=\"p\">()<\/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\">23<\/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>\r\n                            <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\">WRITE_EXTERNAL_STORAGE<\/span><span class=\"p\">},<\/span>\r\n                    <span class=\"n\">AUTORISATION_ECRITURE<\/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\">creerFichier<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Voici le fichier \u00ab\u00a0AndroidManifest.xml\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;<\/span>\r\n<span class=\"nt\">&lt;manifest<\/span> <span class=\"na\">xmlns:android=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res\/android\"<\/span>\r\n    <span class=\"na\">package=<\/span><span class=\"s\">\"me.louismarchand.testfichiers\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;uses-permission<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\"android.permission.WRITE_EXTERNAL_STORAGE\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;application<\/span>\r\n        <span class=\"na\">android:allowBackup=<\/span><span class=\"s\">\"true\"<\/span>\r\n        <span class=\"na\">android:icon=<\/span><span class=\"s\">\"@mipmap\/ic_launcher\"<\/span>\r\n        <span class=\"na\">android:label=<\/span><span class=\"s\">\"@string\/app_name\"<\/span>\r\n        <span class=\"na\">android:roundIcon=<\/span><span class=\"s\">\"@mipmap\/ic_launcher_round\"<\/span>\r\n        <span class=\"na\">android:supportsRtl=<\/span><span class=\"s\">\"true\"<\/span>\r\n        <span class=\"na\">android:theme=<\/span><span class=\"s\">\"@style\/Theme.TestFichiers\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        <span class=\"nt\">&lt;activity<\/span>\r\n            <span class=\"na\">android:name=<\/span><span class=\"s\">\".MainActivity\"<\/span>\r\n            <span class=\"na\">android:exported=<\/span><span class=\"s\">\"true\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;intent-filter&gt;<\/span>\r\n                <span class=\"nt\">&lt;action<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\"android.intent.action.MAIN\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n                <span class=\"nt\">&lt;category<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\"android.intent.category.LAUNCHER\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n            <span class=\"nt\">&lt;\/intent-filter&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/activity&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/application&gt;<\/span>\r\n\r\n<span class=\"nt\">&lt;\/manifest&gt;<\/span>\r\n<\/pre>\n<\/div>\n<h3>Encore un autre<\/h3>\n<p>Cet exemple effectuera une lecture d&rsquo;un fichier texte \u00e0 la racine de la m\u00e9moire interne (sdcard) de l&rsquo;appareil \u00e0 l&rsquo;ouverture du programme.<\/p>\n<p>Le code Java de l&rsquo;activit\u00e9:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MainActivity<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">AppCompatActivity<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">AUTORISATION_LECTURE<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">124<\/span><span class=\"p\">;<\/span>\r\n\r\n    <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\">requestCode<\/span><span class=\"p\">,<\/span> <span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">permissions<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span><span class=\"o\">[]<\/span> <span class=\"n\">grantResults<\/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\">requestCode<\/span><span class=\"p\">,<\/span> <span class=\"n\">permissions<\/span><span class=\"p\">,<\/span> <span class=\"n\">grantResults<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">requestCode<\/span> <span class=\"o\">==<\/span> <span class=\"n\">AUTORISATION_LECTURE<\/span> <span class=\"o\">&amp;&amp;<\/span>\r\n                <span class=\"n\">grantResults<\/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=\"n\">lireFichier<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <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_main<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">demandePermission<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">lireFichier<\/span><span class=\"p\">(){<\/span>\r\n        <span class=\"n\">File<\/span> <span class=\"n\">lFile<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">File<\/span><span class=\"p\">(<\/span><span class=\"n\">getExternalFilesDir<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">),<\/span> <span class=\"s\">&quot;test.txt&quot;<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">BufferedReader<\/span> <span class=\"n\">lReader<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">TextView<\/span> <span class=\"n\">lTexteVue<\/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\">texte_vue<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">lReader<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">BufferedReader<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">FileReader<\/span><span class=\"p\">(<\/span><span class=\"n\">lFile<\/span><span class=\"p\">.<\/span><span class=\"na\">getAbsolutePath<\/span><span class=\"p\">()));<\/span>\r\n            <span class=\"n\">lTexteVue<\/span><span class=\"p\">.<\/span><span class=\"na\">setText<\/span><span class=\"p\">(<\/span><span class=\"n\">lReader<\/span><span class=\"p\">.<\/span><span class=\"na\">readLine<\/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=\"n\">e<\/span><span class=\"p\">.<\/span><span class=\"na\">printStackTrace<\/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\">demandePermission<\/span><span class=\"p\">()<\/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\">23<\/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>\r\n                            <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>\r\n                    <span class=\"n\">AUTORISATION_LECTURE<\/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\">lireFichier<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Le \u00ab\u00a0AndroidManifest.xml\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;<\/span>\r\n<span class=\"nt\">&lt;manifest<\/span> <span class=\"na\">xmlns:android=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res\/android\"<\/span>\r\n    <span class=\"na\">package=<\/span><span class=\"s\">\"me.louismarchand.testfichiers\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;uses-permission<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\"android.permission.READ_EXTERNAL_STORAGE\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;application<\/span>\r\n        <span class=\"na\">android:allowBackup=<\/span><span class=\"s\">\"true\"<\/span>\r\n        <span class=\"na\">android:icon=<\/span><span class=\"s\">\"@mipmap\/ic_launcher\"<\/span>\r\n        <span class=\"na\">android:label=<\/span><span class=\"s\">\"@string\/app_name\"<\/span>\r\n        <span class=\"na\">android:roundIcon=<\/span><span class=\"s\">\"@mipmap\/ic_launcher_round\"<\/span>\r\n        <span class=\"na\">android:supportsRtl=<\/span><span class=\"s\">\"true\"<\/span>\r\n        <span class=\"na\">android:theme=<\/span><span class=\"s\">\"@style\/Theme.TestFichiers\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        <span class=\"nt\">&lt;activity<\/span>\r\n            <span class=\"na\">android:name=<\/span><span class=\"s\">\".MainActivity\"<\/span>\r\n            <span class=\"na\">android:exported=<\/span><span class=\"s\">\"true\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;intent-filter&gt;<\/span>\r\n                <span class=\"nt\">&lt;action<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\"android.intent.action.MAIN\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n                <span class=\"nt\">&lt;category<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\"android.intent.category.LAUNCHER\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n            <span class=\"nt\">&lt;\/intent-filter&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/activity&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/application&gt;<\/span>\r\n\r\n<span class=\"nt\">&lt;\/manifest&gt;<\/span>\r\n<\/pre>\n<\/div>\n<p>Le fichier de layout:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;<\/span>\r\n<span class=\"nt\">&lt;androidx.constraintlayout.widget.ConstraintLayout<\/span> <span class=\"na\">xmlns:android=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res\/android\"<\/span>\r\n    <span class=\"na\">xmlns:app=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/apk\/res-auto\"<\/span>\r\n    <span class=\"na\">xmlns:tools=<\/span><span class=\"s\">\"http:\/\/schemas.android.com\/tools\"<\/span>\r\n    <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"match_parent\"<\/span>\r\n    <span class=\"na\">tools:context=<\/span><span class=\"s\">\".MainActivity\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;TextView<\/span>\r\n        <span class=\"na\">android:id=<\/span><span class=\"s\">\"@+id\/texte_vue\"<\/span>\r\n        <span class=\"na\">android:layout_width=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">android:layout_height=<\/span><span class=\"s\">\"wrap_content\"<\/span>\r\n        <span class=\"na\">app:layout_constraintBottom_toBottomOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintLeft_toLeftOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintRight_toRightOf=<\/span><span class=\"s\">\"parent\"<\/span>\r\n        <span class=\"na\">app:layout_constraintTop_toTopOf=<\/span><span class=\"s\">\"parent\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n\r\n<span class=\"nt\">&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;<\/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 <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> Sauf 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 services syst\u00e8me Les appareils mobiles Android offrent aux applications beaucoup de fonctionnalit\u00e9 tr\u00e8s sp\u00e9cialis\u00e9e. Nous pouvons penser aux syst\u00e8mes de localisation (GPS), Bluetooth, NFC, etc. L&rsquo;utilisation de ces fonctionnalit\u00e9s peut varier, mais en g\u00e9n\u00e9ral, on utilise la m\u00e9thode de contexte \u00ab\u00a0getSystemService\u00a0\u00bb afin d&rsquo;avoir acc\u00e8s aux diff\u00e9rents gestionnaires de service. Cette m\u00e9thode est accessible \u00e0&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/android-services-et-environnements\/\">Continue reading <span class=\"screen-reader-text\">Services et environnements<\/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-699","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/699","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=699"}],"version-history":[{"count":13,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/699\/revisions"}],"predecessor-version":[{"id":807,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/699\/revisions\/807"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}