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"/>
Ответ 9
если это адрес IPv6, посмотрите на это: https://code.google.com/p/android/issues/detail?id=33046
Похоже, была ошибка в Android, которая была исправлена в версии 4.3 (?).
Ответ 10
Точно так же, как сказал Том. Когда вы начнете с капитала A
, тогда автозаполнение завершит его как.
ANDROID.PERMISSION.INTERNET
Когда вы начинаете вводить текст с помощью A
, автозаполнение завершает его как
ANDROID.PERMISSION.INTERNET
Второй правильный.
Ответ 11
Ну, это очень запутанная ошибка. Могло быть много причин:
- Вы не упоминаете разрешения в правильном месте. Как прямо над приложением.
- Вы не используете маленькие буквы.
- В некоторых случаях вам также необходимо добавить разрешение для состояния сети.
- В моем случае есть несколько пустых строк в манифестных строках. Например, может быть пустая строка между тегом разрешения и строкой приложения. Удалите их, и все готово. Надеюсь, это поможет.
Ответ 12
Я часами искал решение этой проблемы, и ни одно из решений в ответах не сработало. Затем я узнал, что случайно добавил пробел во время автозаполнения между android.permission.INTERNET
и "
Ответ 13
удалите это в файле манифеста
xmlns:tools="http://schemas.android.com/tools"