cette erreur est vraiment vraiment très étrange et je ne sais pas comment la reproduire ni la corriger car j'ai fait beaucoup de recherches mais rien n’était utile.
Voici le stacktrace:
Stack Trace
_________________________________
0 Java.lang.RuntimeException: An error occured while executing doInBackground()
1 at Android.os.AsyncTask$3.done(AsyncTask.Java:299)
2 at Java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.Java:273)
3 at Java.util.concurrent.FutureTask.setException(FutureTask.Java:124)
4 at Java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.Java:307)
5 at Java.util.concurrent.FutureTask.run(FutureTask.Java:137)
6 at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1076)
7 at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:569)
8 at Java.lang.Thread.run(Thread.Java:856)
9 Caused by: Java.lang.SecurityException: Permission denied (missing INTERNET permission?)
10 at Java.net.InetAddress.lookupHostByName(InetAddress.Java:430)
11 at Java.net.InetAddress.getAllByNameImpl(InetAddress.Java:236)
12 at Java.net.InetAddress.getAllByName(InetAddress.Java:214)
13 at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:70)
14 at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:50)
15 at libcore.net.http.HttpConnection$Address.connect(HttpConnection.Java:340)
16 at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.Java:87)
17 at libcore.net.http.HttpConnection.connect(HttpConnection.Java:128)
18 at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.Java:316)
19 at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.Java:461)
20 at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.Java:433)
21 at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.Java:290)
22 at libcore.net.http.HttpEngine.sendRequest(HttpEngine.Java:240)
23 at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.Java:292)
24 at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.Java:185)
25 at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.Java:271)
26 at com.designfuture.music.api.MusixMatchApi.sendRequestJSON(MusixMatchApi.Java:1143)
27 at com.designfuture.music.api.MusixMatchApi.handleRequestJSON(MusixMatchApi.Java:982)
28 at com.designfuture.music.api.MusixMatchApi.getConfig(MusixMatchApi.Java:211)
29 at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.Java:28)
30 at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.Java:1)
31 at Android.os.AsyncTask$2.call(AsyncTask.Java:287)
32 at Java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.Java:305)
33 ... 4 more
34 Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
35 at libcore.io.Posix.getaddrinfo(Native Method)
36 at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.Java:55)
37 at Java.net.InetAddress.lookupHostByName(InetAddress.Java:405)
38 ... 26 more
39 Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
40 ... 29 more
41 Java.lang.SecurityException: Permission denied (missing INTERNET permission?)
42 at Java.net.InetAddress.lookupHostByName(InetAddress.Java:430)
43 at Java.net.InetAddress.getAllByNameImpl(InetAddress.Java:236)
44 at Java.net.InetAddress.getAllByName(InetAddress.Java:214)
45 at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:70)
46 at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:50)
47 at libcore.net.http.HttpConnection$Address.connect(HttpConnection.Java:340)
48 at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.Java:87)
49 at libcore.net.http.HttpConnection.connect(HttpConnection.Java:128)
50 at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.Java:316)
51 at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.Java:461)
52 at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.Java:433)
53 at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.Java:290)
54 at libcore.net.http.HttpEngine.sendRequest(HttpEngine.Java:240)
55 at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.Java:292)
56 at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.Java:185)
57 at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.Java:271)
58 at com.designfuture.music.api.MusixMatchApi.sendRequestJSON(MusixMatchApi.Java:1143)
59 at com.designfuture.music.api.MusixMatchApi.handleRequestJSON(MusixMatchApi.Java:982)
60 at com.designfuture.music.api.MusixMatchApi.getConfig(MusixMatchApi.Java:211)
61 at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.Java:28)
62 at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.Java:1)
63 at Android.os.AsyncTask$2.call(AsyncTask.Java:287)
64 at Java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.Java:305)
65 at Java.util.concurrent.FutureTask.run(FutureTask.Java:137)
66 at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1076)
67 at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:569)
68 at Java.lang.Thread.run(Thread.Java:856)
69 Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
70 at libcore.io.Posix.getaddrinfo(Native Method)
71 at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.Java:55)
72 at Java.net.InetAddress.lookupHostByName(InetAddress.Java:405)
73 ... 26 more
74 Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
75 ... 29 more
76 libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
77 at libcore.io.Posix.getaddrinfo(Native Method)
78 at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.Java:55)
79 at Java.net.InetAddress.lookupHostByName(InetAddress.Java:405)
80 at Java.net.InetAddress.getAllByNameImpl(InetAddress.Java:236)
81 at Java.net.InetAddress.getAllByName(InetAddress.Java:214)
82 at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:70)
83 at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:50)
84 at libcore.net.http.HttpConnection$Address.connect(HttpConnection.Java:340)
85 at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.Java:87)
86 at libcore.net.http.HttpConnection.connect(HttpConnection.Java:128)
87 at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.Java:316)
88 at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.Java:461)
89 at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.Java:433)
90 at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.Java:290)
91 at libcore.net.http.HttpEngine.sendRequest(HttpEngine.Java:240)
92 at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.Java:292)
93 at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.Java:185)
94 at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.Java:271)
95 at com.designfuture.music.api.MusixMatchApi.sendRequestJSON(MusixMatchApi.Java:1143)
96 at com.designfuture.music.api.MusixMatchApi.handleRequestJSON(MusixMatchApi.Java:982)
97 at com.designfuture.music.api.MusixMatchApi.getConfig(MusixMatchApi.Java:211)
98 at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.Java:28)
99 at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.Java:1)
100 at Android.os.AsyncTask$2.call(AsyncTask.Java:287)
101 at Java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.Java:305)
102 at Java.util.concurrent.FutureTask.run(FutureTask.Java:137)
103 at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1076)
104 at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:569)
105 at Java.lang.Thread.run(Thread.Java:856)
106 Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
107 ... 29 more
108 libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
109 at libcore.io.Posix.getaddrinfo(Native Method)
110 at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.Java:55)
111 at Java.net.InetAddress.lookupHostByName(InetAddress.Java:405)
112 at Java.net.InetAddress.getAllByNameImpl(InetAddress.Java:236)
113 at Java.net.InetAddress.getAllByName(InetAddress.Java:214)
114 at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:70)
115 at libcore.net.http.HttpConnection.<init>(HttpConnection.Java:50)
116 at libcore.net.http.HttpConnection$Address.connect(HttpConnection.Java:340)
117 at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.Java:87)
118 at libcore.net.http.HttpConnection.connect(HttpConnection.Java:128)
119 at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.Java:316)
120 at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.Java:461)
121 at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.Java:433)
122 at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.Java:290)
123 at libcore.net.http.HttpEngine.sendRequest(HttpEngine.Java:240)
124 at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.Java:292)
125 at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.Java:185)
126 at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.Java:271)
127 at com.designfuture.music.api.MusixMatchApi.sendRequestJSON(MusixMatchApi.Java:1143)
128 at com.designfuture.music.api.MusixMatchApi.handleRequestJSON(MusixMatchApi.Java:982)
129 at com.designfuture.music.api.MusixMatchApi.getConfig(MusixMatchApi.Java:211)
130 at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.Java:28)
131 at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.Java:1)
132 at Android.os.AsyncTask$2.call(AsyncTask.Java:287)
133 at Java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.Java:305)
134 at Java.util.concurrent.FutureTask.run(FutureTask.Java:137)
135 at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1076)
136 at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:569)
137 at Java.lang.Thread.run(Thread.Java:856)
Voici mon AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="my_app_package"
Android:installLocation="auto"
Android:versionCode="my_version_code"
Android:versionName="my_version_name" >
<uses-sdk
Android:minSdkVersion="8"
Android:targetSdkVersion="16" />
<supports-screens
Android:anyDensity="true"
Android:largeScreens="true"
Android:normalScreens="true"
Android:resizeable="true"
Android:smallScreens="true"
Android:xlargeScreens="true" />
<uses-feature Android:glEsVersion="0x00010001" />
<uses-permission Android:name="Android.permission.INTERNET" />
<application
Android:allowTaskReparenting="true"
Android:debuggable="true"
Android:icon="@drawable/mxm_icon"
Android:label="@string/musicbrowserlabel"
Android:theme="@style/Theme.Music" >
<!-- MY ACTIVITIES -->
</application>
</manifest>
S'il vous plaît ne prenez pas la peine de me demander si j'ai la bonne permission Internet dans mon manifeste car cette application est sur le marché depuis 2 ans: P
J'ai aussi remarqué que (de Crittercism) tous les bugs proviennent de la version Android 4.1.x (JB). Je ne sais pas si le périphérique est enraciné ou quoi (je ne peux pas voir cette information pour le moment)
NOTE: J'ai écrit cette réponse en juin 2013, elle est donc un peu obsolète. Certaines choses ont changé dans Android depuis la version 6 (Marshmallow) de la plate-forme depuis lors, rendant le problème dans son ensemble est plus/moins obsolète de nos jours, mais je pense que cet article peut toujours valoir la peine d’être lu comme exemple général d’analyse du problème, donc j’espère que vous pourrez toujours le trouver éducatif.
L'exception que vous recevez (SecurityException: Permission denied (missing INTERNET permission?)
) indique clairement que vous n'êtes pas autorisé à faire de la mise en réseau. C'est un fait assez indiscutable. Mais comment cela peut-il arriver? Cela est généralement dû à l'absence de l'entrée <uses-permission Android:name="Android.permission.INTERNET" />
dans votre fichier AndroidManifest.xml
ou bien, étant donné que l'autorisation Internet est accordée à l'installation et non au moment de l'exécution, le bogue raté dans Android provoque l’installation de votre application, mais sans la permission d’attente prévue.
Mon manifeste est correct, alors comment cela peut-il se produire?
Théoriquement, la présence de uses-permission
dans Manifest répond parfaitement à l'exigence et, du point de vue du développeur, il ne reste plus qu'à faire pour pouvoir créer des réseaux. De plus, étant donné que les autorisations sont affichées à l'utilisateur lors de l'installation, le fait que votre application soit installée sur le périphérique de l'utilisateur signifie qu'il a accordé ce que vous aviez demandé (sinon l'installation est annulée). Par conséquent, si votre code est exécuté, toutes les autorisations demandées sont valables. accordé est valide. Et une fois accordée, l'utilisateur ne peut pas révoquer l'autorisation autrement que de désinstaller complètement l'application, car le cadre standard Android (fourni par AOSP) n'offre aucune telle fonctionnalité pour le moment.
Mais les choses deviennent de plus en plus difficiles si votre application ne fonctionne pas non plus sur les appareils enracinés . Il existe des outils disponibles dans Google Play que vos utilisateurs peuvent installer pour contrôler les autorisations accordées aux applications installées au moment de l'exécution - par exemple: Autorisations refusées et autres. Cela peut également être fait avec CyanogenMod , marque du fournisseur (LG) ou autre ROM personnalisée , présentant divers types de "gestionnaires de la confidentialité" ou des outils similaires.
Donc, si l'application est bloquée d'une manière ou d'une autre, elle est fondamentalement bloquée intentionnellement par l'utilisateur et si c'est le cas, il s'agit vraiment d'un problème d'utilisateur dans ce cas (ou il/elle ne comprend pas ce que certaines options/outils font réellement et quelles en seraient les conséquences) que le vôtre, car le SDK standard (et la plupart des applications sont conçues dans cet esprit) ne se comporte tout simplement pas de cette façon. Donc, je fortement doute que ce problème se produise sur un périphérique "standard", non enraciné avec un stock (ou un fournisseur tel que Samsung, HTC, Sony, etc.) ROM.
Je ne veux pas planter ...
La gestion des autorisations correctement mise en œuvre et le blocage/org doivent prendre en compte le fait que la plupart des applications ne sont peut-être pas prêtes pour la situation dans laquelle l'accès à certaines fonctionnalités est autorisé et inaccessible en même temps, car il s'agit d'une sorte de contradiction lorsqu'une application utilise demander l'accès au moment de l'installation. Le contrôle d’accès effectué correctement doit faire en sorte que tout fonctionne comme avant, tout en limitant la convivialité à l’aide de techniques qui cadrent avec le comportement attendu de la fonction. Par exemple, lorsque certaines autorisations sont accordées (GPS, accès Internet), une telle fonctionnalité peut être rendue disponible du point de vue de l'application/utilisateur (vous pouvez activer le GPS ou essayer de vous connecter), la nouvelle implémentation ne peut fournir aucune donnée réelle - C'est-à-dire que le GPS peut toujours ne renvoyer aucune coordonnée, comme lorsque vous êtes à l'intérieur ou que vous n'avez pas de "repère" satellite. L'accès à Internet peut être accordé comme avant, mais vous ne pouvez pas établir de connexion car il n'y a pas de couverture de données ni de routage. De tels scénarios devraient également être attendus dans des conditions normales d'utilisation et devraient donc déjà être gérés par les applications. Comme cela peut simplement se produire lors d'une utilisation quotidienne normale, toute panne dans une telle situation devrait probablement être liée à des bogues d'application.
Il nous manque trop d’informations sur l’environnement dans lequel ce problème se produit pour diagnostiquer le problème sans deviner, mais comme solution, vous pouvez envisager d’utiliser setDefaultUncaughtExceptionHandler () pour intercepter de telles exceptions inattendues à l’avenir, c.-à-d. affichez simplement les informations détaillées des utilisateurs sur les autorisations dont votre application a besoin au lieu de se bloquer. Veuillez noter que cette utilisation sera probablement en conflit avec des outils tels que Crittercism, ACRA et autres. Soyez donc prudent si vous utilisez l'un de ces outils.
Notes
Sachez que Android.permission.INTERNET
n'est pas la seule autorisation de mise en réseau que vous devrez peut-être déclarer dans manifeste pour tenter de réussir la mise en réseau. L'obtention de l'autorisation INTERNET
permet simplement aux applications d'ouvrir les sockets réseau (ce qui est fondamentalement une exigence fondamentale pour tout transfert de données réseau). Mais si votre pile/bibliothèque réseau souhaite également obtenir des informations sur les réseaux, vous aurez également besoin de Android.permission.ACCESS_NETWORK_STATE
dans votre manifeste (c’est-à-dire requis par HttpUrlConnection client ( voir tutoriel ).
Addendum (2015-07-16)
Veuillez noter que Android 6 (alias Marshmallow) a introduit un tout nouveau mécanisme de gestion des autorisations appelé Autorisations d'exécution. Il donne à l'utilisateur plus de contrôle sur les autorisations accordées (autorise également l'attribution sélective) ou permet de révoquer les autorisations déjà accordées sans besoin de supprimer l'application:
Cela introduit un [...] nouveau modèle d'autorisations, dans lequel les utilisateurs peuvent désormais gérer directement les autorisations des applications au moment de l'exécution. Ce modèle offre aux utilisateurs une visibilité et un contrôle améliorés sur les autorisations, tout en rationalisant les processus d'installation et de mise à jour automatique pour les développeurs d'applications. Les utilisateurs peuvent accorder ou révoquer des autorisations individuellement pour les applications installées.
Toutefois, les modifications n'affectent pas les autorisations INTERNET
ou ACCESS_NETWORK_STATE
, qui sont considérées comme des autorisations "normales". L'utilisateur n'a pas besoin d'accorder explicitement ces autorisations.
Voir description du changement de comportement page pour plus de détails et assurez-vous que votre application se comportera correctement sur les nouveaux systèmes. Cela est particulièrement important lorsque votre projet définit targetSdk
sur au moins 23
, car vous devez gérer un nouveau modèle de permissions ( documentation détaillée ). Si vous n'êtes pas prêt, assurez-vous de garder targetSdk
au plus 22
, car cela garantit que même les nouveaux Android utiliseront l'ancien système de permission lors de l'installation de votre application.
Android Studio 1.3b1 (je ne suis pas sûr des autres versions) a complété automatiquement mon autorisation Internet pour Android.PERMISSION.INTERNET
. Le changer en Android.permission.INTERNET
corrige le problème.
Assurez-vous que l'endroit où vous ajoutez
<uses-permission Android:name="Android.permission.INTERNET"/>
est juste.
Vous devriez l'écrire comme ça dans AndroidManifest.xml:
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.project">
<uses-permission Android:name="Android.permission.INTERNET"/>
Ne fais pas mes erreurs :)
Ajoutez au fichier manifeste la ligne:
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
Cela a résolu le problème pour moi.
J'ai résolu cette erreur, j'ai ajouté des autorisations à l'intérieur du tag Application par erreur. J'ai mis dehors et ça marche bien. J'espère que ça aide pour quelqu'un.
J'ai aussi eu ce problème. C'était bizarre que cela fonctionne sur mon émulateur Lollipop, mais pas sur mon appareil KitKat actuel.
Android Studio va maintenant vous obliger à écrire l'autorisation en majuscule, et c'est le problème.
Ajouter
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
Au-dessus de l'onglet de l'application, cela fonctionnera.
Ecrivez votre permission avant l'étiquette d'application comme indiqué ci-dessous.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.someapp.sample">
<uses-permission Android:name="Android.permission.INTERNET"/>
<application
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppTheme">
Mettez cette permission en dehors de la balise <application>
préférable avant la balise, je l'ai essayée et cela fonctionne pour moi.
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
s'il s'agissait d'une adresse IPv6, examinez ceci: https://code.google.com/p/Android/issues/detail?id=33046
On dirait qu'il y avait un bug dans Android qui a été corrigé dans la version 4.3 (?).
Tout comme Tom mentionné. Lorsque vous commencez avec une majuscule A
, la saisie semi-automatique le complète.
Android.PERMISSION.INTERNET
Lorsque vous commencez à taper avec a
, la saisie semi-automatique le complète en tant que
Android.permission.INTERNET
Le second est le bon.
C'est un type de bug très déroutant. Il pourrait y avoir plusieurs raisons:
Je passe des heures à chercher une solution à ce problème et aucune des solutions proposées n’a fonctionné. Ensuite, j'ai découvert que j'avais accidentellement ajouté un espace lors de la saisie semi-automatique entre Android.permission.INTERNET
et "
.