cette erreur est vraiment vraiment vraiment étrange et je ne sais pas comment la reproduire et comment 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>
Veuillez ne pas me demander si j'ai la bonne autorisation INTERNET dans mon manifeste car cette application est sur le marché depuis 2 ans: P
J'ai également remarqué que (de Crittercism) tous les bugs proviennent de la version Android 4.1.x (JB). Je ne sais pas si l'appareil est enraciné ou quoi (je ne peux pas voir ces informations pour le moment)
Réponses:
REMARQUE: j'ai écrit cette réponse en juin 2013, elle est donc un peu datée de nos jours. Beaucoup de choses ont changé dans la plate-forme Android depuis la version 6 (Marshmallow), rendant l'ensemble du problème plus / moins obsolète de nos jours. Cependant, je pense que cet article peut encore valoir la peine d'être lu comme exemple d'approche générale d'analyse de problème.
L'exception que vous obtenez (
SecurityException: Permission denied (missing INTERNET permission?)
) indique clairement que vous n'êtes pas autorisé à faire du réseautage. C'est un fait assez incontestable. Mais comment cela peut-il arriver? Cela est généralement dû à une<uses-permission android:name="android.permission.INTERNET" />
entrée manquante dans votreAndroidManifest.xml
fichier ou, comme l'autorisation Internet est accordée lors de l'installation et non au moment de l'exécution, par un bogue manqué de longue date dans le cadre Android qui provoque l'installation réussie de votre application, mais sans autorisation attendue.Mon manifeste est correct, alors comment cela peut-il arriver?
Théoriquement, présence de
uses-permission
dans Manifest répond parfaitement à l'exigence et du point de vue du développeur, c'est tout ce qu'il faut faire pour pouvoir faire du réseautage. De plus, comme les autorisations sont affichées à l'utilisateur lors de l'installation, le fait que votre application se soit terminée sur le périphérique de l'utilisateur signifie qu'il a accordé ce que vous avez demandé (sinon l'installation est annulée), donc en supposant que si votre code est exécuté, toutes les autorisations demandées sont 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 Android standard (d'AOSP) n'offre pas une telle fonctionnalité pour le moment.Mais les choses deviennent plus délicates si cela ne vous dérange pas non plus que votre application fonctionne sur des 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: Permissions refusées et autres. Cela peut également être fait avec CyanogenMod , la marque du fournisseur (c'est-à-dire LG) ou une autre ROM personnalisée , comportant divers types de «gestionnaires de confidentialité» ou des outils similaires.
Donc, si l'application est bloquée dans un sens ou dans l'autre, elle est fondamentalement bloquée intentionnellement par l'utilisateur et si c'est le cas, c'est vraiment plus un problème utilisateur dans ce cas (ou il ne comprend pas ce que font réellement certaines options / outils et quelles en seraient les conséquences) que le vôtre, car le SDK standard (et la plupart des applications sont écrites avec ce SDK à l'esprit) ne se comporte tout simplement pas de cette façon. Je doute donc fortement que ce problème se produise sur un appareil "standard" non rooté avec une ROM stock (ou un fournisseur comme Samsung, HTC, Sony, etc.).
Je ne veux pas m'écraser ...
La gestion des autorisations et / ou le blocage organisationnel correctement mis en œuvre doivent tenir compte du fait que la plupart des applications peuvent ne pas être prêtes pour la situation où l'accès à certaines fonctionnalités est à la fois accordé et non accessible en même temps, car il s'agit d'une sorte de contradiction lorsque l'application utilise un manifeste pour demander l'accès au moment de l'installation. Le contrôle d'accès correctement effectué doit faire en sorte que tout fonctionne comme avant, tout en limitant la convivialité à l'aide de techniques dans le cadre du comportement attendu de la fonctionnalité. Par exemple, lorsque certaines autorisations sont accordées (par exemple, GPS, accès Internet), une telle fonctionnalité peut être rendue disponible du point de vue de l'application / de l'utilisateur (c'est-à-dire que vous pouvez activer le GPS ou essayer de vous connecter), l'implémentation modifiée 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» de satellite. L'accès à Internet peut être accordé comme auparavant, mais vous ne pouvez pas établir de connexion réussie car il n'y a pas de couverture ou de routage de données. De tels scénarios doivent également être attendus dans le cadre d'une utilisation normale, ils doivent 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.
Nous manquons de trop d'informations sur l'environnement sur lequel ce problème se produit pour diagnostiquer le problème sans deviner, mais comme type de solution, vous pouvez envisager d'utiliser setDefaultUncaughtExceptionHandler () pour intercepter ces exceptions inattendues à l'avenir et c'est-à-dire simplement afficher des informations détaillées sur l'utilisateur sur quelle autorisation votre application a besoin au lieu de simplement planter. Veuillez noter que son utilisation sera probablement en conflit avec des outils tels que Crittercism, ACRA et autres, alors soyez prudent si vous utilisez l'un de ces outils.
Remarques
Veuillez noter que ce
android.permission.INTERNET
n'est pas la seule autorisation liée au réseau que vous devrez peut-être déclarer dans le manifeste pour tenter de réussir la mise en réseau. UneINTERNET
autorisation accordée permet simplement aux applications d'ouvrir des sockets réseau (ce qui est fondamentalement une exigence fondamentale pour effectuer tout transfert de données réseau). Mais dans le cas où votre pile / bibliothèque réseau souhaiterait également obtenir des informations sur les réseaux, vous en aurez également besoinandroid.permission.ACCESS_NETWORK_STATE
dans votre manifeste (ce qui est requis par le client HttpUrlConnection ( voir tutoriel ).Addendum (2015-07-16)
Veuillez noter qu'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'octroi sélectif) ou permet de révoquer les autorisations déjà accordées sans avoir besoin de supprimer l'application:
Toutefois, les modifications n'affectent
INTERNET
ni lesACCESS_NETWORK_STATE
autorisations, qui sont considérées comme des autorisations «normales». L'utilisateur n'a pas besoin d'accorder explicitement ces autorisations.Consultez la page de description des changements de comportement pour plus de détails et assurez-vous que votre application se comportera correctement sur les systèmes plus récents également. C'est particulièrement important lorsque votre projet est défini
targetSdk
sur au moins23
car alors vous devez prendre en charge un nouveau modèle d'autorisations ( documentation détaillée ). Si vous n'êtes pas prêt, assurez-vous de vous en tenirtargetSdk
au maximum,22
car cela garantit que même le nouvel Android utilisera l'ancien système d'autorisation lorsque votre application est installée.la source
Assurez-vous que l'endroit où vous ajoutez
est correct.
Vous devriez l'écrire comme ça dans AndroidManifest.xml:
Ne fais pas mes erreurs :)
la source
Android Studio 1.3b1 (pas sûr des autres versions) a automatiquement rempli mon autorisation Internet
ANDROID.PERMISSION.INTERNET
. Le changer pourandroid.permission.INTERNET
résoudre le problème.la source
Ajoutez au fichier manifeste la ligne:
Il l'a corrigé pour moi.
la source
J'ai résolu cette erreur, j'ajoutais des autorisations dans la balise Application par erreur. J'ai mis dehors et ça marche bien. J'espère que cela aide quelqu'un.
la source
J'ai aussi eu ce problème. c'était étrange que cela fonctionne sur mon émulateur de sucette, mais pas sur mon appareil kitkat réel.
Android Studio va maintenant vous forcer à écrire l'autorisation en majuscules, et c'est le problème.
Ajouter
Au-dessus de l'onglet de l'application et cela fonctionnera.
la source
Écrivez votre autorisation avant la balise d'application comme indiqué ci-dessous.
la source
Mettez ces autorisations en dehors de la
<application>
balise de préférence avant la balise, je l'ai essayé et cela fonctionne pour moi.la source
s'il s'agissait d'une adresse IPv6, jetez un œil à ceci: https://code.google.com/p/android/issues/detail?id=33046
On dirait qu'il y avait un bogue dans Android qui a été corrigé dans 4.3 (?).
la source
Tout comme Tom l'a mentionné. Lorsque vous commencez avec des majuscules, la
A
saisie semi-automatique le complétera comme.Lorsque vous commencez à taper avec, la saisie
a
semi-automatique la complète commeLe second est le bon.
la source
Je passe des heures à chercher une solution à ce problème et aucune des solutions contenues dans les réponses n'a fonctionné. Ensuite, j'ai découvert que j'avais accidentellement ajouté un espace pendant la saisie semi-automatique entre
android.permission.INTERNET
et"
la source
Eh bien, c'est un type de bogue très déroutant. Il peut y avoir plusieurs raisons:
la source
supprimez ceci dans votre fichier manifeste
la source