SecurityException: Permission denied (отсутствует разрешение INTERNET?)

94

эта ошибка действительно очень странная, и я не знаю, как ее воспроизвести и как исправить, потому что я много искал, но ничего не помогло.

Вот трассировка стека:

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). Я не знаю, рутировано ли устройство или что (пока я не вижу эту информацию)

StErMi
источник
Возможно ли, что имя хоста изменилось (из-за этого сообщения об ошибке): Нет адреса, связанного с именем хоста
Opiatefuchs
вы пробовали с разными версиями устройства? или попадание на каждую версию?
Панкадж Кумар
1
пожалуйста, добавьте <uses-permission android: name = "android.permission.INTERNET" /> <uses-permission android: name = "android.permission.ACCESS_NETWORK_STATE" /> За пределами тега <Application> Перестройте проект и запустите. это сработало для меня
Azahar
Кстати, порядок имеет значение, stackoverflow.com/questions/25135595/…
Набин,
@SteErMi, вы решили эту проблему, у меня такая же ситуация,
Равинд Маурья,

Ответы:

119

ПРИМЕЧАНИЕ. Я написал этот ответ в июне 2013 года, поэтому сейчас он немного устарел. Начиная с версии 6 (Marshmallow) в платформе Android многое изменилось, что в настоящее время делает проблему более / менее устаревшей. Однако я считаю, что этот пост все же стоит прочитать как пример общего подхода к анализу проблемы.


Возникающее исключение ( SecurityException: Permission denied (missing INTERNET permission?)) четко указывает на то, что вам не разрешено работать в сети. Это довольно неоспоримый факт. Но как это могло случиться? Обычно это происходит из-за отсутствия <uses-permission android:name="android.permission.INTERNET" />записи в вашемAndroidManifest.xml файле, либо, поскольку разрешение на доступ в Интернет предоставляется при установке, а не во время выполнения, из-за давней пропущенной ошибки в платформе Android, которая приводит к успешной установке вашего приложения, но без ожидаемого предоставления разрешения.

Мой манифест правильный, как это может произойти?

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

Но все становится сложнее, если вы также не возражаете, чтобы ваше приложение работало и на устройствах с root- доступом. В Google Play доступны инструменты, которые пользователи могут установить для управления разрешениями, предоставляемыми установленным приложениям во время выполнения, например: Permissions Denied и другие. Это также можно сделать с помощью 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) представил совершенно новый механизм управления разрешениями, называемый разрешениями времени выполнения . Это дает пользователю больше контроля над предоставленными разрешениями (также позволяет выборочное предоставление) или позволяет отозвать уже предоставленные разрешения без необходимости удаления приложения:

Это [...] представляет новую модель разрешений, в которой пользователи теперь могут напрямую управлять разрешениями приложений во время выполнения. Эта модель дает пользователям улучшенную видимость и контроль над разрешениями, оптимизируя процессы установки и автоматического обновления для разработчиков приложений. Пользователи могут предоставлять или отзывать разрешения индивидуально для установленных приложений.

Однако эти изменения не влияют INTERNETили ACCESS_NETWORK_STATEразрешений, которые считаются «Normal» разрешением. Пользователю не нужно явно предоставлять эти разрешения.

См. Подробности на странице описания изменений поведения и убедитесь, что ваше приложение будет корректно работать и в новых системах. Это особенно важно, если в вашем проекте задано targetSdkкак минимум такое же значение, 23как и тогда, когда вы должны поддерживать новую модель разрешений ( подробная документация ). Если вы не готовы, убедитесь, что вы придерживаетесь targetSdkне больше, 22поскольку это гарантирует, что даже новый Android будет использовать старую систему разрешений при установке вашего приложения.

Марцин Орловски
источник
Это явно означает, что ему не разрешено работать в сети. Он либо не запрашивается в манифесте, либо не предоставляется платформой (что может быть сделано, например, на устройствах с root-доступом).
Марцин Орловски
2
Проголосовал за этот ответ, чтобы отменить голос против кого-то другого. Сначала я подумал, что вы действительно не прочитали весь вопрос и просто хотели побыстрее (кстати, ваш ответ сначала был слишком коротким ;-)), но я думаю, что замечание о пользователях (на устройствах с root-доступом) возможность отклонить ваши запросы на разрешение была хорошей.
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 (в настоящее время на канале Canary).
Tom
31

Добавьте в файл манифеста строку:

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

Над вкладкой приложения и будет работать.

Болдижар Пол
источник
Это простой и правильный ответ. И должен быть тот, кто наверху!
Костанос
14

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

<?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
источник
На самом деле это было единственное, что мне помогло :( Совсем не интуитивно понятно.
Иван Перес
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и"

a0x2
источник
0

Что ж, это очень сбивающая с толку ошибка. Причин могло быть много:

  1. Вы не упоминаете разрешения в нужном месте. Как прямо над приложением.
  2. Вы не используете маленькие буквы.
  3. В некоторых случаях вам также необходимо добавить разрешение состояния сети.
  4. В одном из моих случаев в строках манифеста есть пустые строки. Например, между тегом разрешения и строкой приложения может быть пустая строка. Удалите их, и все готово. Надеюсь, это поможет
Шами
источник
-7

удалите это в своем файле манифеста

 xmlns:tools="http://schemas.android.com/tools"
Jiangyongyuan
источник
В файле манифеста (AndroidManifest.xml) такого кода нет.
Панг