113 votes

SecurityException : Permission refusée (permission INTERNET manquante ?)

Cette erreur est vraiment très étrange et je ne sais pas comment la reproduire et comment la réparer car j'ai fait beaucoup de recherches mais rien n'a été utile.

Voici la trace de la pile :

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 vous embêtez pas à me demander si j'ai la bonne permission INTERNET dans mon manifeste parce que cette application est sur le marché depuis 2 ans :P

J'ai également remarqué que (d'après Crittercism) tous les bugs proviennent de la version Android 4.1.x (JB). Je ne sais pas si les appareils sont rootés ou autre (je ne peux pas voir cette information pour le moment).

131voto

Marcin Orlowski Points 24633

NOTE : j'ai écrit cette réponse en juin 2013, elle date donc un peu aujourd'hui. Beaucoup de choses ont changé dans la plateforme Android depuis la version 6 (Marshmallow, sortie fin 2015), rendant l'ensemble du problème plus/moins obsolète. Cependant, je pense que ce post 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 indiscutable. Mais comment cela peut-il arriver ? En général, c'est soit parce que vous avez manqué <uses-permission android:name="android.permission.INTERNET" /> dans votre AndroidManifest.xml ou, comme l'autorisation d'accès à Internet est accordée lors de l'installation et non au moment de l'exécution, par un bug oublié depuis longtemps dans le cadre d'Android qui fait que votre application est installée avec succès, mais sans l'autorisation attendue.

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, c'est tout ce qu'il faut faire pour pouvoir faire du réseautage. De plus, comme les autorisations sont montrées à l'utilisateur pendant l'installation, le fait que votre application ait fini par être installée sur l'appareil de l'utilisateur signifie qu'il a accordé ce que vous avez demandé (sinon l'installation est annulée), donc l'hypothèse selon laquelle si votre code est exécuté, toutes les autorisations demandées sont accordées est valable. Et une fois que l'autorisation est accordée, l'utilisateur ne peut pas la révoquer autrement qu'en désinstallant complètement l'application, car le framework Android standard (de l'AOSP) n'offre pas une telle fonctionnalité pour le moment.

Mais les choses deviennent plus délicates si vous ne voulez pas que votre application fonctionne aussi sur enraciné également des appareils. 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 (par exemple, LG) ou autre ROM personnalisée qui proposent divers types de "gestionnaires de la vie privée" ou d'outils similaires.

Donc, si l'application est bloquée d'une manière ou d'une autre, elle est bloquée intentionnellement par l'utilisateur et si c'est le cas, c'est plus le problème de l'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, parce que le SDK standard (et la plupart des applications sont écrites avec ce SDK à l'esprit) ne se comporte tout simplement pas de cette manière. Ainsi, je fortement Ce problème se produit sur un appareil "standard", non rooté, avec une ROM stock (ou d'un fournisseur comme Samsung, HTC, Sony, etc.).

Je ne veux pas m'écraser...

Une gestion des autorisations et/ou un blocage des accès correctement mis en œuvre doivent tenir compte du fait que la plupart des applications ne sont pas prêtes à faire face à une situation où l'accès à certaines fonctionnalités est à la fois accordé et non accessible, car il s'agit d'une sorte de contradiction lorsque l'application utilise le manifeste pour demander l'accès au moment de l'installation. Un contrôle d'accès bien fait doit faire en sorte que tout fonctionne comme avant, tout en limitant l'utilisabilité à l'aide de techniques dans le cadre du comportement attendu de la fonctionnalité. Par exemple, lorsqu'une certaine permission est accordée (par exemple, GPS, accès Internet), cette fonctionnalité peut être rendue disponible du point de vue de l'application/de l'utilisateur (par exemple, vous pouvez activer le GPS ou essayer de vous connecter), l'implémentation modifiée ne peut fournir aucune donnée réelle - par exemple, le GPS peut toujours ne pas renvoyer de coordonnées, comme lorsque vous êtes à l'intérieur ou que vous n'avez pas de "repère" satellite. L'accès à l'Internet peut être accordé comme avant, mais vous ne pouvez pas établir une connexion réussie car il n'y a pas de couverture de données ou de routage. De tels scénarios sont également prévisibles dans le cadre d'une utilisation normale et devraient donc être gérés par les applications. Comme cela peut tout simplement se produire dans le cadre d'une utilisation quotidienne normale, toute panne dans une telle situation devrait très probablement être liée à des bogues de l'application.

Nous manquons d'informations sur l'environnement dans lequel se produit ce problème pour le diagnostiquer sans y penser, mais comme solution, vous pouvez envisager d'utiliser setDefaultUncaughtExceptionHandler() pour attraper de telles exceptions inattendues à l'avenir et, par exemple, montrer simplement à l'utilisateur des informations détaillées sur les autorisations dont votre application a besoin au lieu de se planter. Veuillez noter que l'utilisation de cette fonctionnalité entrera très probablement en conflit avec des outils tels que Crittercism, ACRA et autres, donc soyez prudent si vous utilisez l'un d'entre eux.

Notes

Veuillez noter que android.permission.INTERNET n'est pas la seule autorisation liée à la mise en réseau que vous pouvez être amené à déclarer dans le manifeste pour tenter de réussir une mise en réseau. Avoir INTERNET L'autorisation accordée permet simplement aux applications d'ouvrir des sockets réseau (ce qui est une condition fondamentale pour effectuer tout transfert de données réseau). Mais au cas où votre pile/bibliothèque réseau souhaiterait également obtenir des informations sur les réseaux, vous aurez également besoin des éléments suivants android.permission.ACCESS_NETWORK_STATE dans votre Manifeste (ce qui est par exemple requis par Connexion HttpUrlConnection client ( voir le tutoriel ).


Addendum (2015-07-16)

Veuillez noter qu'Android 6 (alias Marshmallow) a introduit un tout nouveau mécanisme de gestion des autorisations appelé Permissions d'exécution . Il permet à l'utilisateur de mieux contrôler les autorisations accordées (il permet également un octroi sélectif) ou de révoquer les autorisations déjà accordées sans avoir à supprimer l'application :

Cette [...] introduction d'un nouveau modèle de permissions, où les utilisateurs peuvent désormais gérer directement les autorisations des applications au moment de l'exécution. Ce modèle donne aux utilisateurs une meilleure visibilité et un meilleur contrôle des 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 les autorisations individuellement pour les applications installées.

Cependant, les changements n'affectent pas INTERNET o 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 des changements de comportement pour plus de détails et s'assurer que votre application se comportera correctement sur les systèmes plus récents également. C'est particulièrement important lorsque votre projet a mis en place targetSdk au moins 23 comme alors vous doit supportent le nouveau modèle de permissions ( documentation détaillée ). Si vous n'êtes pas prêt, assurez-vous de garder targetSdk au maximum 22 car cela garantit que même les nouveaux Android utiliseront l'ancien système de permission lorsque votre application sera installée.

63voto

Valeria Points 636

Assurez-vous que l'endroit où vous ajoutez

<uses-permission android:name="android.permission.INTERNET"/>

a raison.

Vous devez l'écrire comme cela dans AndroidManifest.xml :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.project"> 
<uses-permission android:name="android.permission.INTERNET"/>

Ne faites pas mes erreurs :)

34voto

Tom Points 2993

Android Studio 1.3b1 (pas sûr pour les autres versions) a autocomplété ma permission internet en ANDROID.PERMISSION.INTERNET . Le changer en android.permission.INTERNET a réglé le problème.

32voto

Dashtank Points 319

Ajouter au fichier manifeste la ligne :

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Ça l'a réparé pour moi.

21voto

arango_86 Points 1

Inscrivez votre autorisation avant l'étiquette de l'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">

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X