SecurityException: autorisation refusée (autorisation INTERNET manquante?)

92

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)

StErMi
la source
est-il possible que le nom d'hôte ait changé (à cause de ce message d'erreur): Aucune adresse associée au nom d'hôte
Opiatefuchs
avez-vous essayé avec différentes versions de l'appareil? ou obtenir sur chaque version?
Pankaj Kumar
1
plz add <uses-permission android: name = "android.permission.INTERNET" /> <uses-permission android: name = "android.permission.ACCESS_NETWORK_STATE" /> Balise extérieure <Application> Veuillez reconstruire votre projet et l'exécuter. ça a marché pour moi
Azahar
Au fait, la commande compte, stackoverflow.com/questions/25135595/…
Nabin
@SteErMi avez-vous résolu ce problème, je suis confronté à la même situation
Ravind Maurya

Réponses:

118

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.INTERNETn'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. Une INTERNETautorisation 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 besoin android.permission.ACCESS_NETWORK_STATEdans 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:

Ceci introduit [...] un nouveau modèle d'autorisations, dans lequel les utilisateurs peuvent désormais gérer directement les autorisations d'application 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 INTERNETni les ACCESS_NETWORK_STATEautorisations, 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 targetSdksur au moins 23car 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 tenir targetSdkau maximum, 22car cela garantit que même le nouvel Android utilisera l'ancien système d'autorisation lorsque votre application est installée.

Marcin Orlowski
la source
Cela signifie clairement qu'il n'est pas autorisé à faire du réseautage. Soit il n'est pas demandé dans le manifeste, soit il n'est pas accordé par la plate-forme (ce qui peut être fait sur des appareils enracinés).
Marcin Orlowski
2
A voté cette réponse pour annuler le vote défavorable de quelqu'un d'autre. Au début, je pensais que vous n'aviez en effet pas lu toute la question et que vous vouliez juste être rapide (au fait, votre réponse était vraiment trop courte au début ;-)), mais je pense que la remarque sur les utilisateurs (sur les appareils enracinés) être en mesure de contrecarrer vos demandes d'autorisation était une bonne chose.
baske le
Mmmm donc si cela vient d'un utilisateur rooté qui supprime les autorisations, j'ai 2 questions: 1) comment puis-je savoir si je n'ai pas cette autorisation? 2) Comment puis-je le demander à nouveau? (encore, je ne sais pas si nous parlons de ce genre de problème)
StErMi
Vous ne pouvez pas le demander à nouveau, car cette autorisation n'est pas accordée au moment de l'exécution. Voir la réponse modifiée pour une "solution" possible
Marcin Orlowski
1
Idem ici: j'étais sur le point de rétrograder mais la deuxième partie de la réponse semble être la partie qui mérite d'être lue :) vous devriez supprimer les premières lignes des réponses car StErMi a clairement montré qu'il avait défini l'autorisation INTERNET.
Thierry
43

Assurez-vous que l'endroit où vous ajoutez

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

est correct.

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 :)

Valeria
la source
33

Android Studio 1.3b1 (pas sûr des autres versions) a automatiquement rempli mon autorisation Internet ANDROID.PERMISSION.INTERNET. Le changer pour android.permission.INTERNETrésoudre le problème.

À M
la source
Cela devrait maintenant être corrigé dans Android Studio 1.4 RC 1 (actuellement dans le canal Canary).
Tom
30

Ajoutez au fichier manifeste la ligne:

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

Il l'a corrigé pour moi.

Dashtank
la source
20

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.

Sami
la source
16

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

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

Au-dessus de l'onglet de l'application et cela fonctionnera.

Boldijar Paul
la source
C'est la réponse simple et correcte. Et devrait être celui au dessus!
Kostanos
13

Écrivez votre autorisation avant la balise 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">
arango_86
la source
C'était en fait la seule chose qui m'a aidé: (Pas du tout intuitif.
Ivan Perez
4

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.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Tobore Igbe
la source
2

Tout comme Tom l'a mentionné. Lorsque vous commencez avec des majuscules, la Asaisie semi-automatique le complétera comme.

ANDROID.PERMISSION.INTERNET

Lorsque vous commencez à taper avec, la saisie asemi-automatique la complète comme

android.permission.INTERNET

Le second est le bon.

Shakti
la source
2

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.INTERNETet"

a2en
la source
0

Eh bien, c'est un type de bogue très déroutant. Il peut y avoir plusieurs raisons:

  1. Vous ne mentionnez pas les autorisations au bon endroit. Comme juste au-dessus de l'application.
  2. Vous n'utilisez pas de minuscules.
  3. Dans certains cas, vous devez également ajouter une autorisation d'état du réseau.
  4. Dans mon cas, il y a des lignes vides dans les lignes du manifeste. Comme il pourrait y avoir une ligne vide entre l'étiquette d'autorisation et la ligne d'application. Retirez-les et vous avez terminé. J'espère que cela aidera
Shami
la source
-7

supprimez ceci dans votre fichier manifeste

 xmlns:tools="http://schemas.android.com/tools"
jiangyongyuan
la source
Il n'y a pas de code de ce type dans le fichier manifeste (AndroidManifest.xml) dans la question.
Pang