SecurityException: Odmowa uprawnień (brak uprawnień do INTERNETU?)

94

ten błąd jest naprawdę bardzo dziwny i nie wiem, jak go odtworzyć i jak to naprawić, ponieważ przeprowadziłem wiele wyszukiwań, ale nic nie było przydatne.

Oto ślad stosu:

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)

Oto mój plik 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>

Nie kłopocz się pytaniem mnie, czy w moim manifeście mam prawidłowe pozwolenie INTERNETOWE, ponieważ ta aplikacja jest na rynku od 2 lat: P

Zauważyłem również, że (z Crittercism) wszystkie błędy pochodzą z wersji Androida 4.1.x (JB). Nie wiem, czy urządzenie jest zrootowane, czy co (na razie nie widzę tych informacji)

StErMi
źródło
czy to możliwe, że nazwa hosta uległa zmianie (z powodu tego komunikatu o błędzie): Brak adresu skojarzonego z nazwą hosta
Opiatefuchs
czy próbowałeś z różnymi wersjami urządzenia? lub dostaniesz się na każdą wersję?
Pankaj Kumar
1
plz dodaj <używa-pozwolenia android: name = "android.permission.INTERNET" /> <używa-pozwolenia android: name = "android.permission.ACCESS_NETWORK_STATE" /> Poza tagiem <Aplikacja> Przebuduj swój projekt i uruchom. to zadziałało dla mnie
Azahar
Nawiasem mówiąc, kolejność ma znaczenie, stackoverflow.com/questions/25135595/…
Nabin
@SteErMi czy rozwiązałeś ten problem, mam taką samą sytuację
Ravind Maurya

Odpowiedzi:

119

UWAGA: napisałem tę odpowiedź w czerwcu 2013 roku, więc obecnie jest nieco przestarzała. Wiele rzeczy zmieniło się na platformie Android od wersji 6 (Marshmallow), sprawiając, że cały problem jest obecnie mniej / bardziej przestarzały. Uważam jednak, że nadal warto przeczytać ten post jako przykład ogólnego podejścia do analizy problemu.


Wyjątek, który otrzymujesz ( SecurityException: Permission denied (missing INTERNET permission?)), wyraźnie wskazuje, że nie możesz korzystać z sieci. To całkiem niepodważalny fakt. Ale jak to się może stać? Zwykle jest to spowodowane brakującym <uses-permission android:name="android.permission.INTERNET" />wpisem w TwoimAndroidManifest.xml pliku lub, ponieważ zezwolenie na Internet jest udzielane podczas instalacji, a nie w czasie wykonywania, przez długi, brakujący błąd w strukturze Androida, który powoduje pomyślne zainstalowanie aplikacji, ale bez oczekiwanego pozwolenia.

Mój Manifest jest poprawny, więc jak to się może stać?

Teoretycznie obecność uses-permission w Manifest doskonale spełnia wymagania iz punktu widzenia programisty to wszystko, co trzeba zrobić, aby móc tworzyć sieci. Ponadto, ponieważ uprawnienia są wyświetlane użytkownikowi podczas instalacji, fakt, że Twoja aplikacja została zainstalowana na urządzeniu użytkownika, oznacza, że ​​przyznał on to, o co prosiłeś (w przeciwnym razie instalacja zostanie anulowana), więc załóżmy, że jeśli twój kod zostanie wykonany, wszystkie żądane uprawnienia są przyznane jest ważne. Po przyznaniu, użytkownik nie może cofnąć pozwolenia w inny sposób niż całkowite odinstalowanie aplikacji, ponieważ standardowa platforma Android (od AOSP) nie oferuje obecnie takiej funkcji.

Ale sprawy stają się trudniejsze, jeśli nie masz nic przeciwko, aby aplikacja działała również na zrootowanych urządzeniach. W Google Play są dostępne narzędzia, które użytkownicy mogą zainstalować, aby kontrolować uprawnienia przyznane zainstalowanym aplikacjom w czasie wykonywania - na przykład: Odmowa uprawnień i inne. Można to również zrobić za pomocą CyanogenMod , marki producenta (np. LG) lub innej niestandardowej pamięci ROM , zawierającej różnego rodzaju „menedżerów prywatności” lub podobne narzędzia.

Więc jeśli aplikacja jest zablokowana w dowolny sposób, jest zasadniczo blokowana celowo przez użytkownika, a jeśli tak, w tym przypadku jest to naprawdę większy problem użytkownika (lub nie rozumie, co naprawdę robią niektóre opcje / narzędzia i jakie byłyby konsekwencje) niż twój, ponieważ standardowy SDK (i większość aplikacji jest napisanych z myślą o tym SDK) po prostu nie zachowuje się w ten sposób. Więc mocno wątpię, że ten problem występuje na "standardowym", nierootowanym urządzeniu z zapasowym (lub dostawcą takim jak Samsung, HTC, Sony itp.) ROM.

Nie chcę się rozbić ...

Prawidłowo zaimplementowane zarządzanie uprawnieniami i / lub blokowanie organizacji muszą uwzględniać fakt, że większość aplikacji może nie być gotowa na sytuację, w której dostęp do niektórych funkcji jest zarówno przyznany, jak i niedostępny w tym samym czasie, ponieważ jest to rodzaj sprzeczności, gdy aplikacja używa manifestu do poproś o dostęp w czasie instalacji. Właściwa kontrola dostępu powinna sprawić, że wszystko będzie działać jak poprzednio, a jednocześnie ograniczać użyteczność przy użyciu technik w zakresie oczekiwanego zachowania funkcji. Na przykład, gdy przyznane zostanie określone pozwolenie (np. GPS, dostęp do Internetu) taka funkcja może zostać udostępniona z perspektywy aplikacji / użytkownika (tj. Można włączyć GPS. Lub spróbować się połączyć), zmieniona implementacja nie może dostarczyć żadnych rzeczywistych danych - tzn. GPS zawsze może nie zwrócić żadnych współrzędnych, na przykład gdy jesteś w pomieszczeniu lub nie masz połączenia satelitarnego. Dostęp do Internetu można przyznać jak poprzednio, ale nie możesz nawiązać udanego połączenia, ponieważ nie ma zasięgu ani routingu danych. Takich scenariuszy należy się spodziewać również przy normalnym użytkowaniu, dlatego powinny być już obsługiwane przez aplikacje. Ponieważ może się to po prostu zdarzyć podczas normalnego codziennego użytkowania, każda awaria w takiej sytuacji powinna być najprawdopodobniej związana z błędami aplikacji.

Brakuje nam zbyt wielu informacji o środowisku, w którym występuje ten problem, aby zdiagnozować problem bez zgadywania, ale jako rodzaj rozwiązania możesz rozważyć użycie setDefaultUncaughtExceptionHandler () do wychwytywania takich nieoczekiwanych wyjątków w przyszłości, czyli po prostu pokazać użytkownikowi szczegółowe informacje o uprawnieniach Twoja aplikacja potrzebuje zamiast po prostu awarii. Pamiętaj, że używanie tego najprawdopodobniej będzie kolidować z narzędziami takimi jak Crittercism, ACRA i innymi, więc zachowaj ostrożność, jeśli używasz któregokolwiek z nich.

Uwagi

Należy pamiętać, że android.permission.INTERNETnie jest to jedyne uprawnienie związane z siecią, które może być konieczne do zadeklarowania w manifeście w celu pomyślnego nawiązania połączenia. Mając INTERNETuprawnienia przyznanego po prostu umożliwia aplikacjom gniazd otwartej sieci (co jest w zasadzie podstawowym wymogiem, aby zrobić każdą transmisję danych). Ale w przypadku, gdy twój stos / biblioteka sieciowa chciałby również uzyskać informacje o sieciach, będziesz również potrzebował android.permission.ACCESS_NETWORK_STATEswojego Manifestu (który jest wymagany przez klienta HttpUrlConnection ( patrz tutorial ).


Dodatek (16.07.2015)

Należy pamiętać, że Android 6 (znany również jako Marshmallow) wprowadził zupełnie nowy mechanizm zarządzania uprawnieniami o nazwie Uprawnienia wykonawcze . Daje użytkownikowi większą kontrolę nad tym, jakie uprawnienia są przyznawane (umożliwia także selektywne przyznawanie) lub pozwala cofnąć już przyznane uprawnienia bez konieczności usuwania aplikacji:

To [...] wprowadza nowy model uprawnień, w którym użytkownicy mogą teraz bezpośrednio zarządzać uprawnieniami aplikacji w czasie wykonywania. Model ten zapewnia użytkownikom lepszą widoczność i kontrolę nad uprawnieniami, jednocześnie usprawniając proces instalacji i automatycznej aktualizacji dla twórców aplikacji. Użytkownicy mogą nadawać lub cofać uprawnienia indywidualnie dla zainstalowanych aplikacji.

Jednak zmiany nie mają wpływu na uprawnienia INTERNETani ACCESS_NETWORK_STATEuprawnienia, które są uważane za uprawnienia „normalne”. Użytkownik nie musi jawnie udzielać tych uprawnień.

Szczegółowe informacje można znaleźć na stronie opisu zmian zachowania i upewnić się, że aplikacja będzie działać poprawnie również w nowszych systemach. Jest to szczególnie ważne, gdy projekt jest ustawiony targetSdkna co najmniej 23tak, jak wtedy musisz obsługiwać nowy model uprawnień ( szczegółowa dokumentacja ). Jeśli nie jesteś gotowy, upewnij się, że trzymasz targetSdksię co najwyżej, 22ponieważ zapewnia to, że nawet nowy Android użyje starego systemu uprawnień po zainstalowaniu aplikacji.

Marcin Orłowski
źródło
To wyraźnie oznacza, że ​​nie wolno mu nawiązywać kontaktów. Albo nie jest wymagane w Manifest, albo nie jest przyznawane przez platformę (co można zrobić np. Na zrootowanych urządzeniach).
Marcin Orłowski
2
Głosował za tą odpowiedzią, aby cofnąć głos przeciw komuś innemu. Na początku myślałem, że rzeczywiście nie przeczytałeś całego pytania i po prostu chciałeś być szybki (tak przy okazji, twoja odpowiedź na początku była za krótka ;-)), ale myślę, że uwaga o użytkownikach (na zrootowanych urządzeniach) możliwość udaremnienia twoich próśb o pozwolenie była dobra.
baske
Mmmm, więc jeśli to jest od zrootowanego użytkownika, który usuwa uprawnienia, mam 2 pytania: 1) skąd mam wiedzieć, czy nie mam tego uprawnienia? 2) Jak mogę ponownie o to zapytać? (nadal nie wiem, czy mówimy o tego rodzaju problemach)
StErMi
Nie możesz poprosić o to ponownie, ponieważ to uprawnienie nie jest przyznawane w czasie wykonywania. Zobacz zredagowaną odpowiedź na możliwe "rozwiązanie"
Marcin Orłowski
1
To samo tutaj: miałem zamiar obniżyć wersję, ale druga część odpowiedzi wydaje się być częścią, którą warto przeczytać :) powinieneś usunąć pierwsze linijki odpowiedzi, ponieważ StErMi wyraźnie pokazał, że ustawił uprawnienia INTERNETU.
Thierry
43

Upewnij się, że miejsce, w którym dodajesz

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

jest w porządku.

Powinieneś napisać to tak w AndroidManifest.xml:

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

Nie rób moich błędów :)

Valeria
źródło
33

Android Studio 1.3b1 (nie jestem pewien co do innych wersji) automatycznie uzupełnił moje uprawnienia internetowe do ANDROID.PERMISSION.INTERNET. Zmiana w celu android.permission.INTERNETrozwiązania problemu.

Tomek
źródło
Powinno to teraz zostać naprawione w Android Studio 1.4 RC 1 (obecnie na kanale Canary).
Tom
31

Dodaj do pliku manifestu wiersz:

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

Naprawiło to dla mnie.

Dashtank
źródło
20

Rozwiązałem ten błąd, przez pomyłkę dodawałem uprawnienia w tagu aplikacji. Postawiłem na zewnątrz i działa dobrze. Mam nadzieję, że to pomoże komuś.

Sami
źródło
16

Ja też miałem ten problem. to było dziwne, że działał na moim emulatorze Lollipopa, ale nie na moim rzeczywistym urządzeniu KitKat.

Android Studio zmusi Cię teraz do wpisania wielkich liter uprawnień i to jest problem.

Dodaj

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

Powyżej zakładki aplikacji i będzie działać.

Boldijar Paul
źródło
To jest prosta i poprawna odpowiedź. I powinien być tym na szczycie!
Kostanos
14

Napisz swoją zgodę przed tagiem aplikacji, jak podano poniżej.

<?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
źródło
To była właściwie jedyna rzecz, która mi pomogła :( Zupełnie nie intuicyjne.
Ivan Perez
4

Umieść te uprawnienia poza <application>tagiem, najlepiej przed tagiem, wypróbowałem i działa dla mnie.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Tobore Igbe
źródło
2

Tak jak wspomniał Tom. Kiedy zaczniesz od kapitału, Aautouzupełnianie zakończy je jako.

ANDROID.PERMISSION.INTERNET

Kiedy zaczniesz pisać, aautouzupełnianie zakończy je jako

android.permission.INTERNET

Drugi jest właściwy.

Shakti
źródło
2

Spędzam godziny szukając rozwiązania tego problemu i żadne z odpowiedzi nie zadziałało. Potem dowiedziałem się, że przypadkowo dodałem spację podczas autouzupełniania między android.permission.INTERNETa"

a0x2
źródło
0

Cóż, to bardzo zagmatwany rodzaj błędu. Powodów może być wiele:

  1. Nie wspominasz o uprawnieniach we właściwym miejscu. Jak powyżej aplikacji.
  2. Nie używasz małych liter.
  3. W niektórych przypadkach musisz także dodać uprawnienie Stan sieci.
  4. W moim przypadku jest kilka pustych wierszy w wierszach manifestu. Jakby mogła być pusta linia między znacznikiem uprawnień a wierszem aplikacji. Usuń je i gotowe. Mam nadzieję, że to pomoże
Shami
źródło
-7

usuń to z pliku manifestu

 xmlns:tools="http://schemas.android.com/tools"
jiangyongyuan
źródło
W pliku manifestu (AndroidManifest.xml) w pytaniu nie ma takiego kodu.
Pang