Frage SecurityException: Berechtigung verweigert (fehlende INTERNET-Berechtigung?)


Dieser Fehler ist wirklich wirklich sehr seltsam und ich weiß nicht, wie ich ihn reproduzieren und beheben kann, weil ich viele Suchen gemacht habe, aber nichts war nützlich.

Hier ist der 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)

Hier ist meine 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>

Bitte fragen Sie mich nicht, ob ich die richtige INTERNET-Erlaubnis in meinem Manifest habe, weil diese App seit 2 Jahren im Markt ist: P

Ich habe auch bemerkt, dass (von Crittercism) alle Bugs von Android 4.1.x Version (JB) stammen. Ich weiß nicht, ob das Gerät verwurzelt ist oder was (ich kann diese Information im Moment nicht sehen)


75
2018-06-28 08:58


Ursprung


Antworten:


HINWEIS: Ich habe diese Antwort im Juni 2013 geschrieben, also ist sie jetzt etwas veraltet. Seit der Version 6 (Marshmallow) der Plattform haben sich seitdem einige Dinge in Android geändert, wodurch das ganze Problem heutzutage mehr oder weniger obsolet wird. Ich glaube jedoch, dass dieser Beitrag immer noch als allgemeine Problemanalyse lesenswert sein kann, also hoffe ich, dass Sie ihn immer noch lehrreich finden.


Ausnahme, die du bekommst (SecurityException: Permission denied (missing INTERNET permission?)), zeigt deutlich an, dass Sie keine Vernetzung betreiben dürfen. Das ist ziemlich unbestreitbar. Aber wie kann das passieren? In der Regel liegt es entweder an fehlenden <uses-permission android:name="android.permission.INTERNET" /> Eintrag in Ihrem AndroidManifest.xml Datei oder, wie Internet-Erlaubnis bei der Installation nicht zur Laufzeit gewährt wird, durch lang anhaltenden, verpassten Fehler im Android-Framework, der Ihre App erfolgreich installiert, aber ohne erwartete Erlaubnis gewährt.

Mein Manifest ist richtig, also wie kann das passieren?

Theoretisch, Anwesenheit von uses-permission in Manifest erfüllt die Anforderung perfekt und vom Standpunkt des Entwicklers ist alles, was getan werden muss, um in der Lage zu sein, Networking zu betreiben. Da die Berechtigungen dem Benutzer während der Installation angezeigt werden, bedeutet die Tatsache, dass Ihre App auf dem Gerät des Benutzers installiert wurde, dass Sie die angeforderten Berechtigungen erhalten (andernfalls wird die Installation abgebrochen), vorausgesetzt, dass Ihr Code ausgeführt wird gewährt ist gültig. Und einmal gewährt, kann der Benutzer die Erlaubnis nicht auf andere Weise widerrufen, als die App vollständig zu deinstallieren, da das Standard-Android-Framework (von AOSP) im Moment keine solche Funktion bietet.

Aber die Dinge werden schwieriger, wenn es Ihnen auch nichts ausmacht, wenn Ihre App läuft verwurzelt Geräte auch. In Google Play stehen Tools zur Verfügung, die Ihre Nutzer installieren können, um die für installierte Apps erteilten Berechtigungen zu steuern zur Laufzeit - beispielsweise: Berechtigungen verweigert und andere. Dies kann auch mit durchgeführt werden CyanogenMod, Herstellermarke (d. h. LG) oder anderes benutzerdefiniertes ROMmit verschiedenen Arten von "Privacy Managern" oder ähnlichen Tools.

Wenn also die App blockiert ist, wird sie grundsätzlich vom Benutzer blockiert und wenn ja, dann ist es in diesem Fall ein größeres Problem für den Benutzer (oder er / sie versteht nicht, was bestimmte Optionen / Tools wirklich tun und was die Konsequenzen wären) als Ihr, weil das Standard-SDK (und die meisten Apps werden mit diesem SDK geschrieben) sich einfach nicht so verhält. Also ich stark bezweifle, dass dieses Problem auf "Standard", nicht gerootet Gerät mit Lager (oder Hersteller wie Samsung, HTC, Sony usw.) ROM auftritt.

Ich will nicht abstürzen ...

Richtig implementiertes Berechtigungsmanagement und / oder Organisationsblockierung müssen mit der Tatsache umgehen, dass die meisten Apps möglicherweise nicht für Situationen bereit sind, in denen der Zugriff auf bestimmte Funktionen gleichzeitig gewährt wird und nicht gleichzeitig zugänglich ist Zugriff bei der Installation anfordern. Die Zugriffskontrolle, die richtig durchgeführt wird, sollte alle Dinge wie bisher funktionieren lassen und die Benutzerfreundlichkeit weiterhin einschränken, indem Techniken im Bereich des erwarteten Verhaltens des Features verwendet werden. Wenn beispielsweise eine bestimmte Berechtigung erteilt wird (z. B. GPS, Internetzugang), kann diese Funktion aus der App / Benutzerperspektive zur Verfügung gestellt werden (dh Sie können GPS einschalten oder versuchen, eine Verbindung herzustellen), die geänderte Implementierung kann keine echten Daten liefern - Dh GPS kann immer keine Koordinaten zurückgeben, wie wenn Sie in Innenräumen sind oder keinen Satelliten "reparieren". Der Internetzugriff kann wie zuvor gewährt werden, Sie können jedoch keine erfolgreiche Verbindung herstellen, da keine Datenabdeckung oder kein Routing vorhanden ist. Solche Szenarien sollten auch bei normaler Nutzung erwartet werden, daher sollte es bereits von den Apps gehandhabt werden. Da dies im normalen Alltagsbetrieb einfach passieren kann, sollte jeder Absturz in einer solchen Situation höchstwahrscheinlich auf Anwendungsfehler zurückzuführen sein.

Uns fehlen zu viele Informationen über die Umgebung, in der dieses Problem auftritt, um Probleme zu diagnostizieren, aber als eine Art Lösung, die Sie vielleicht in Erwägung ziehen setDefaultUncaughtExceptionHandler () um solche unerwarteten Ausnahmen in Zukunft zu erfassen und d. h. einfach detaillierte Benutzerinformationen anzuzeigen, welche Erlaubnis Ihre App benötigt, anstatt nur abzustürzen. Bitte beachten Sie, dass die Verwendung dieses Tools höchstwahrscheinlich mit Tools wie Crittercism, ACRA und anderen kollidiert. Seien Sie also vorsichtig, wenn Sie eines dieser Tools verwenden.

Anmerkungen

Bitte beachten Sie das android.permission.INTERNET ist nicht die einzige netzwerkbezogene Berechtigung, die Sie möglicherweise im Manifest deklarieren müssen, um erfolgreich ein Netzwerk zu erstellen. Haben INTERNET Die erteilte Erlaubnis erlaubt es Anwendungen einfach, Netzwerk-Sockets zu öffnen (was grundsätzlich eine Grundvoraussetzung für die Übertragung von Netzwerkdaten ist). Aber falls Ihr Netzwerk-Stack / Ihre Bibliothek auch Informationen über Netzwerke erhalten soll, dann werden Sie das auch brauchen android.permission.ACCESS_NETWORK_STATE in Ihrem Manifest (das ist erforderlich von HttpUrlConnection Klient (Siehe Anleitung).


Nachtrag (2015-07-16)

Bitte beachten Sie, dass Android 6 (alias Marshmallow) einen völlig neuen Mechanismus zur Berechtigungsverwaltung eingeführt hat Laufzeitberechtigungen. Es gibt dem Benutzer mehr Kontrolle darüber, welche Berechtigungen gewährt werden (erlaubt auch die selektive Gewährung) oder lässt bereits erteilte Berechtigungen widerrufen, ohne dass die App entfernt werden muss:

Dadurch wird ein neues Berechtigungsmodell eingeführt, über das Benutzer jetzt verfügen können   Verwalten Sie die App-Berechtigungen zur Laufzeit direkt. Dieses Modell gibt Benutzern   verbesserte Sichtbarkeit und Kontrolle über Berechtigungen bei gleichzeitiger Rationalisierung   die Installations- und Auto-Update-Prozesse für App-Entwickler. Benutzer   kann Berechtigungen für installierte Apps einzeln gewähren oder entziehen.

Die Änderungen haben jedoch keine Auswirkungen INTERNET oder ACCESS_NETWORK_STATE Berechtigungen, die als "normale" Berechtigungen gelten. Der Benutzer muss diese Berechtigung nicht explizit erteilen.

Sehen Verhalten ändert die Beschreibung Seite für Details und stellen Sie sicher, dass Ihre App auch auf neueren Systemen korrekt funktioniert. Es ist besonders wichtig, wenn Ihr Projekt eingestellt ist targetSdk bis mindestens 23 wie du dann Muss neues Berechtigungsmodell unterstützen (ausführliche Dokumentation). Wenn Sie nicht bereit sind, stellen Sie sicher, dass Sie behalten targetSdk höchstens 22 Dadurch wird sichergestellt, dass auch neue Android-Geräte das alte Berechtigungssystem verwenden, wenn Ihre App installiert ist.


107
2018-06-28 09:01



Android Studio 1.3b1 (bin mir über andere Versionen nicht sicher) hat meine Internet-Erlaubnis automatisch verifiziert ANDROID.PERMISSION.INTERNET. Ändern zu android.permission.INTERNET Das Problem wurde behoben.


33
2017-07-16 22:37



Fügen Sie die Zeile der Manifestdatei hinzu:

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

Es hat es für mich repariert.


26
2018-06-17 18:49



Achten Sie darauf, dass Sie den Ort hinzufügen

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

ist richtig.

Sie sollten es so in AndroidManifest.xml schreiben:

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

Mach nicht meine Fehler :)


26
2018-02-02 18:42



Ich habe diesen Fehler behoben. Ich habe irrtümlich Berechtigungen im Anwendungs-Tag hinzugefügt. Ich habe draußen geputtet und es funktioniert gut. Hoffe es hilft für jemanden.


20
2018-05-10 19:39



Ich hatte auch dieses Problem. Es war seltsam, dass es auf meinem Lollipop-Emulator funktioniert hat, aber nicht auf meinem eigentlichen Kitkat-Gerät.

Android Studio wird Sie nun zwingen, die Großschreibung der Berechtigung zu schreiben, und das ist das Problem.

Hinzufügen

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

Über der Anwendung Registerkarte und es wird funktionieren.


14
2017-07-07 13:45



Setzen Sie diese Erlaubnis außerhalb der <application> Etikett vor dem Tag, ich habe es versucht und es funktioniert für mich.

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

5
2017-12-19 00:50