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

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

Здесь 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)

Здесь мой 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>

Пожалуйста, не беспокойтесь, спрашивая меня, есть ли у меня правильное разрешение INTERNET в моем манифесте, потому что это приложение находится на рынке с 2 лет: P

Я также заметил, что (от Crittercism) все ошибки исходят из версии Android 4.1.x(JB). Я не знаю, связано ли устройство или что (я не могу видеть эту информацию на данный момент)

Ответ 1

ПРИМЕЧАНИЕ: я написал этот ответ в июне 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 (см. Руководство).


Приложение (2015-07-16)

Обратите внимание, что в Android 6 (он же Marshmallow) появился совершенно новый механизм управления разрешениями, который называется Runtime Permissions. Это дает пользователю больше контроля над тем, какие разрешения предоставляются (также позволяет выборочное предоставление) или позволяет отозвать уже предоставленные разрешения без необходимости удаления приложения:

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

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

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

Ответ 2

Android Studio 1.3b1 (не уверен в других версиях) автоматически запустил мое интернет-разрешение на ANDROID.PERMISSION.INTERNET. Изменение этого параметра на ANDROID.PERMISSION.INTERNET устранило проблему.

Ответ 3

Убедитесь, что место, где вы добавляете

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

Не делай моих ошибок:)

Ответ 4

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

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

Он исправил это для меня.

Ответ 5

Я решил эту ошибку, я добавлял разрешения в тег приложения по ошибке. Я выставлял снаружи, и все работает нормально. Надеюсь, это поможет кому-то.

Ответ 6

У меня также была эта проблема. было странно, что он работал на моем эмуляторе Lollipop, но не на моем фактическом устройстве kitkat.

Android Studio теперь заставит вас написать верхний регистр разрешения, и эта проблема.

Добавить

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

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

Ответ 7

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

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

Ответ 8

Поместите это разрешение за пределы тега <application>, желательно перед тегом, я попробовал его, и он работает для меня.

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

Ответ 10

Точно так же, как сказал Том. Когда вы начнете с капитала A, тогда автозаполнение завершит его как.

ANDROID.PERMISSION.INTERNET

Когда вы начинаете вводить текст с помощью A, автозаполнение завершает его как

ANDROID.PERMISSION.INTERNET

Второй правильный.

Ответ 11

Ну, это очень запутанная ошибка. Могло быть много причин:

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

Ответ 12

Я часами искал решение этой проблемы, и ни одно из решений в ответах не сработало. Затем я узнал, что случайно добавил пробел во время автозаполнения между android.permission.INTERNET и "

Ответ 13

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

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