SecurityException: дозвіл відмовлено (відсутність дозволу на ІНТЕРНЕТ?)


92

ця помилка насправді справді дивна, і я не знаю, як її відтворити і як виправити, тому що я зробив багато пошуків, але нічого не було корисним.

Ось стек:

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)

Ось мій 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>

Будь ласка, не турбуйтеся, чи я маю правильний дозвіл на ІНТЕРНЕТ у своєму маніфесті, оскільки цей додаток продається з 2 років: P

Я також помітив, що (від Crittercism) всі помилки походять з версії Android 4.1.x (JB). Я не знаю, чи пристрій укорінено чи що (на даний момент я не бачу цієї інформації)


чи можливо, що ім'я хосту змінилося (через це повідомлення про помилку): Жодна адреса не пов'язана з іменем хосту
Opiatefuchs

ви пробували з різними версіями пристрою? або потрапляння на кожну версію?
Pankaj Kumar

1
plz add <uses-dozvoла android: name = "android.permission.INTERNET" /> <koristi-дозвіл android: name = "android.permission.ACCESS_NETWORK_STATE" /> Зовні тег <Application> Будь ласка, відновіть свій проект і запустіть. це спрацювало для мене
Азахар,

До речі, порядок має значення, stackoverflow.com/questions/25135595/…
Набін,

@SteErMi Ви вирішили цю проблему, я стикаюся з такою ж ситуацією
Равінд Маурія

Відповіді:


118

ПРИМІТКА: Цю відповідь я написав у червні 2013 року, тому сьогодні вона трохи застаріла. Багато речей змінилося на платформі Android, починаючи з версії 6 (Marshmallow), роблячи цілу проблему на сьогодні більш / менш застарілою. Однак я вважаю, що цю публікацію все ще варто прочитати як приклад загального аналізу проблем.


Виняток, який ви отримуєте ( SecurityException: Permission denied (missing INTERNET permission?)), чітко вказує на те, що вам заборонено займатися мережею. Це досить незаперечний факт. Але як це може статися? Зазвичай це або через відсутність <uses-permission android:name="android.permission.INTERNET" />запису у вашому AndroidManifest.xmlфайлі, або, оскільки дозвіл в Інтернеті надається під час встановлення не під час запуску, через тривалу, пропущену помилку в рамках Android, що призводить до успішної установки вашого додатка, але без очікуваного надання дозволу.

Мій Маніфест правильний, тож як це може статися?

Теоретично, присутність uses-permissionу Manifest ідеально відповідає вимогам, і з точки зору розробника - все, що потрібно зробити, щоб мати можливість створювати мережі. Більше того, оскільки дозволи відображаються користувачеві під час встановлення, той факт, що ваш додаток закінчився встановленим на пристрої користувача, означає, що він надав те, про що ви просили (інакше встановлення скасовується), тому припущення, що якщо ваш код виконується, усі запитувані дозволи наданий є дійсним. І після надання користувачеві не можна відкликати дозвіл іншим способом, окрім як повністю видалити програму, оскільки стандартний фреймворк Android (від AOSP) на даний момент не пропонує такої функції.

Але все стає складнішим, якщо ви також не проти, щоб ваш додаток також працював на корінних пристроях. У Google Play доступні інструменти, які ваші користувачі можуть встановити, щоб контролювати дозвіл, що надається встановленим програмам під час запуску, наприклад: Дозволи відмовлені та інші. Це також можна зробити за допомогою CyanogenMod , бренду постачальника (тобто LG) або іншого користувацького ПЗУ , що включає різні типи "менеджерів конфіденційності" або подібні інструменти.

Отже, якщо додаток заблоковано в будь-якому випадку, це в основному навмисно заблоковано користувачем, і якщо так, то в цьому випадку це справді більша проблема користувача (або він / вона не розуміє, що насправді роблять певні параметри / інструменти і які можуть бути наслідки) ніж ваш, оскільки стандартний SDK (і більшість програм написані з урахуванням цього SDK) просто не поводиться так. Тому я сильно сумніваюся, що ця проблема виникає на "стандартному" некореневому пристрої зі запасом (або у постачальника, такого як Samsung, HTC, Sony тощо) ПЗУ.

Я не хочу розбиватися ...

Правильно впроваджене управління дозволами та / організаційне блокування повинно мати справу з тим, що більшість програм можуть бути не готовими до ситуації, коли доступ до певних функцій одночасно надається і недоступний, оскільки це своєрідне протиріччя, коли програма використовує маніфест до запитувати доступ під час встановлення. Правильно виконаний контроль доступу повинен змусити всі речі працювати як раніше, і все одно обмежувати зручність використання, використовуючи методи в межах очікуваної поведінки функції. Наприклад, коли надається певний дозвіл (тобто GPS, доступ до Інтернету), така функція може бути доступною з точки зору програми / користувача (тобто ви можете ввімкнути GPS. Або спробувати підключитися), змінена реалізація не може дати реальних даних - тобто GPS завжди може повернути ніякі координати, наприклад, коли ви знаходитесь у приміщенні або не маєте "фіксованого" випуску із супутника. Доступ до Інтернету може бути наданий як і раніше, але ви не можете встановити успішне з'єднання, оскільки немає покриття даних або маршрутизації. Такі сценарії слід очікувати і при звичайному використанні, тому цим повинні займатися вже програми. Оскільки це просто може трапитися під час звичайного щоденного використання, будь-який збій у такій ситуації, швидше за все, повинен бути пов’язаний з помилками додатків.

Нам бракує занадто багато інформації про середовище, в якому виникає ця проблема, щоб діагностувати проблему без відгадування, але як своєрідне рішення ви можете розглянути можливість використання setDefaultUncaughtExceptionHandler () для виявлення таких несподіваних винятків у майбутньому, тобто просто показати користувачеві детальну інформацію про те, який дозвіл потрібен ваш додаток, а не просто збій. Зверніть увагу, що використання цього, швидше за все, суперечитиме таким інструментам, як Crittercism, ACRA та інші, тому будьте обережні, якщо ви використовуєте будь-який із них.

Примітки

Зверніть увагу, що android.permission.INTERNETце не єдиний дозвіл, пов’язаний з мережею, який вам може знадобитися заявити у маніфесті, намагаючись успішно створити мережу. Надання INTERNETдозволу просто дозволяє програмам відкривати мережеві сокети (що в основному є фундаментальною вимогою для будь-якої передачі даних мережі). Але якщо ваш мережевий стек / бібліотека також хотів би отримати інформацію про мережі, то вам також знадобиться android.permission.ACCESS_NETWORK_STATEваш Маніфест (що вимагається клієнтом HttpUrlConnection ( див. Підручник ).


Додаток (16.07.2015)

Зверніть увагу, що Android 6 (він же Marshmallow) представив абсолютно новий механізм управління дозволами, який називається Runtime Permissions . Це дає користувачеві більше контролю над тим, який дозвіл надається (також дозволяє вибіркове надання), або дозволяє скасувати вже надані дозволи без необхідності видалення програми:

Це [...] вводить нову модель дозволів, де користувачі тепер можуть безпосередньо керувати дозволами додатків під час виконання. Ця модель надає користувачам покращену видимість та контроль над дозволами, одночасно впорядковуючи процеси встановлення та автоматичного оновлення для розробників додатків. Користувачі можуть надавати або скасовувати дозволи окремо для встановлених програм.

Однак ці зміни не впливають INTERNETабо ACCESS_NETWORK_STATEдозволів, які вважаються «Normal» дозволом. Користувачеві не потрібно явно надавати цей дозвіл.

Перегляньте сторінку опису змін поведінки, щоб дізнатися більше, і переконайтесь, що ваш додаток буде поводитися правильно і в нових системах. Це особливо важливо, коли для вашого проекту встановлено targetSdkпринаймні так, 23як тоді ви повинні підтримувати нову модель дозволів ( детальна документація ). Якщо ви не готові, переконайтеся, що дотримуєтесь targetSdkмаксимум, 22оскільки це гарантує, що навіть новий Android використовуватиме стару систему дозволів, коли вашу програму буде встановлено.


Це однозначно означає, що йому заборонено займатися мережею. Він або не запитується в Manifest, або не надається платформою (що можна зробити, тобто на корінних пристроях).
Marcin Orlowski

2
Проголосував за цю відповідь, щоб скасувати голос проти когось іншого. Спочатку я думав, що ви справді не прочитали всього питання, а просто хотіли бути швидкими (до речі, ваша відповідь дійсно спочатку була занадто короткою ;-)), але я думаю, що зауваження щодо користувачів (на корінних пристроях) можливість зірвати ваші запити на отримання дозволу була доброю.
baske

Мммм, якщо це від кореневого користувача, який видаляє дозволи, у мене є 2 запитання: 1) як я можу знати, якщо цього дозволу не маю? 2) Як я можу запитати це ще раз? (все-таки я не знаю, чи ми говоримо про подібну проблему)
StErMi

Ви не можете просити про це ще раз, оскільки цей дозвіл не надається під час виконання. Дивіться відредаговану відповідь щодо можливого "рішення"
Марцін Орловський,

1
Те саме: я збирався знизити рейтинг, але друга частина відповіді, здається, є тією частиною, яку варто прочитати :) Вам слід видалити перші рядки відповідей, оскільки StErMi чітко показав, що він встановив дозвіл на ІНТЕРНЕТ.
Тьєррі,

43

Переконайтеся, що місце, де ви додаєте

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

правильно.

Ви повинні написати це так у AndroidManifest.xml:

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

Не робіть мої помилки :)


33

Android Studio 1.3b1 (не впевнений в інших версіях) автоматично заповнив мій дозвіл на Інтернет ANDROID.PERMISSION.INTERNET. Змінивши його на android.permission.INTERNETвиправлену проблему.


Тепер це слід виправити в Android Studio 1.4 RC 1 (наразі на канарському каналі).
Том,

30

Додайте до файла маніфесту рядок:

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

Це виправлено для мене.


20

Я вирішив цю помилку, помилково додав дозволи всередині тегу програми. Я поклав на вулицю, і це чудово працює. Сподіваюся, це комусь допоможе.


16

У мене теж була ця проблема. було дивно, що це працювало на моєму емуляторі льодяника, але не на моєму реальному пристрої kitkat.

Тепер Android Studio змусить вас писати великі регістри дозволів, і в цьому проблема.

Додати

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

Над вкладкою програми вона буде працювати.


Це проста і правильна відповідь. І повинен бути той, хто зверху!
Костанос

13

Напишіть свій дозвіл перед тегом програми, як зазначено нижче.

<?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">

Це насправді єдине, що мені допомогло :( Зовсім не інтуїтивно.
Іван Перес,

4

Помістіть ці дозволи поза <application>тегом, кращим перед тегом, я спробував, і це працює для мене.

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


2

Так само, як згадував Том. Коли ви починаєте з капіталу, Aтоді автозаповнення завершить його як.

ANDROID.PERMISSION.INTERNET

Коли ви починаєте вводити текст, aтоді автозаповнення завершить його як

android.permission.INTERNET

Другий - правильний.


2

Я годинами шукаю рішення цієї проблеми, і жодне з вирішень у відповідях не спрацювало. Потім я дізнався, що випадково додав пробіл під час автозавершення між android.permission.INTERNETі"


0

Ну, це дуже заплутана помилка. Причин може бути багато:

  1. Ви не згадуєте дозволи в потрібному місці. Як прямо над додатком.
  2. Ви не використовуєте маленькі літери.
  3. У деяких випадках вам також потрібно додати дозвіл на стан мережі.
  4. У моєму випадку є кілька порожніх рядків у маніфестних рядках. Можливо, між тегом дозволу та рядком програми може бути порожній рядок. Видаліть їх і все готово. Сподіваюся, це допоможе

-7

видаліть це у своєму файлі маніфесту

 xmlns:tools="http://schemas.android.com/tools"

У запитанні такого коду немає у файлі маніфесту (AndroidManifest.xml).
Панг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.