SecurityException: разрешение отклонено (отсутствует разрешение INTERNET?)
эта ошибка действительно действительно странная, и я не знаю, как ее воспроизвести и как ее исправить, потому что я сделал много поисков, но ничего не было полезно.
Вот стек:
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.(HttpConnection.java:70) 14 at libcore.net.http.HttpConnection.(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.(HttpConnection.java:70) 46 at libcore.net.http.HttpConnection.(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.(HttpConnection.java:70) 83 at libcore.net.http.HttpConnection.(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.(HttpConnection.java:70) 115 at libcore.net.http.HttpConnection.(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
- Возврат перенаправления в ответ на запрос XHR
- В чем разница между redirectм 302 и 307?
- Разница между HTTP и HTTPClient в угловом 4?
- Предотrotation повторной отправки формы
- Chrome зависает после передачи определенного количества данных - ожидая доступного сокета
Пожалуйста, не беспокойтесь, спрашивая меня, есть ли у меня правильное разрешение INTERNET в моем манифесте, потому что это приложение находится на рынке с 2 лет: P
Я также заметил, что (от Crittercism) все ошибки исходят из версии Android 4.1.x (JB). Я не знаю, связано ли устройство или что (на данный момент я не вижу эту информацию)
- Могу ли я прочитать hash-часть URL-адреса моего серверного приложения (PHP, Ruby, Python и т. Д.)?
- Http Basic Authentication в Java с использованием HttpClient?
- Какие методы HTTP соответствуют методам CRUD?
- Какую кодировку я должен использовать для базовой проверки подлинности HTTP?
- Можно ли использовать метод BitmapFactory.decodeFile для декодирования изображения из местоположения http?
- Простейшая настройка в Windows для отправки HTTP-запроса, получения и применения регулярного выражения к ответу и записи соответствия (output) для вывода файла
- Spring Boot перенаправляет HTTP на HTTPS
- «ПРЕДУПРЕЖДЕНИЕ: предварительные заголовки отображаются» в отладчике Chrome
ПРИМЕЧАНИЕ. Я написал этот ответ в июне 2013 года, поэтому теперь он устарел. С тех пор некоторые вещи изменились в Android начиная с версии 6 (Marshmallow) платформы, что сделало всю проблему более / менее устаревшей в наши дни. Тем не менее, я считаю, что этот пост все равно может быть прочитан как общий пример анализа проблемы, поэтому я надеюсь, что вы все равно сможете найти его образовательным.
Исключение, которое вы получаете ( SecurityException: Permission denied (missing INTERNET permission?)
), Ясно указывает, что вам не разрешено создавать сети. Это довольно неоспоримый факт. Но как это может произойти? Обычно это либо из-за отсутствия записи
в вашем файле AndroidManifest.xml
либо, поскольку разрешение на доступ к Интернету предоставляется при установке не во время выполнения, по длительной, пропущенной ошибке в платформе Android, которая заставляет ваше приложение быть успешно установлено, но без ожидаемого разрешения.
Мой манифест верен, так как это может произойти?
Теоретически наличие uses-permission
в Manifest прекрасно соответствует требованию, и с точки зрения разработчика это все, что нужно сделать, чтобы иметь возможность создавать сети. Более того, поскольку разрешения разрешены пользователю во время установки, факт, что приложение установлено на устройстве пользователя, означает, что он предоставил то, о чем вы просили (в противном случае установка будет отменена), поэтому предположим, что если ваш код будет выполнен, все запрошенные разрешения будут предоставлено. И как только он предоставлен, пользователь не может отменить разрешение иначе, чем полностью удалить приложение, поскольку стандартная платформа Android (от AOSP) не предлагает такой функции на данный момент.
Но все становится все более сложным, если вы также не против своего приложения, работающего на корневых устройствах. В Google Play доступны инструменты, которые можно установить для управления разрешениями, предоставляемыми установленным приложениям во время выполнения, например: Разрешения Отказано и другие. Это также может быть сделано с CyanogenMod , брендом поставщика (например, LG) или другим пользовательским ROM , с различными типами «менеджеров конфиденциальности» или аналогичных инструментов.
Поэтому, если приложение заблокировано в любом случае, оно в основном заблокировано пользователем, и если это так, это действительно больше проблем пользователя в этом случае (или он / она не понимает, какие определенные опции / инструменты действительно делают и каковы будут последствия) чем ваш, поскольку стандартный 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
, которые считаются «нормальными» разрешениями. Пользователю не нужно явно предоставлять эти разрешения.
Подробнее см. Страницу описания изменений поведения и убедитесь, что ваше приложение будет корректно вести себя и в новых системах. Это особенно важно, когда ваш проект задает targetSdk
как минимум 23
как тогда вы должны поддерживать новую модель разрешений ( подробная документация ). Если вы еще не готовы, убедитесь, что вы сохраняете targetSdk
не более 22
как это гарантирует, что даже новый Android будет использовать старую систему разрешений при установке вашего приложения.
Android Studio 1.3b1 (не уверен в других версиях) автозаполнял мое интернет-разрешение для ANDROID.PERMISSION.INTERNET
. Сменив его на android.permission.INTERNET
исправлена проблема.
Добавьте в файл манифеста строку:
Он исправил это для меня.
Убедитесь, что место, где вы добавляете
верно.
Вы должны написать это так в AndroidManifest.xml:
Не делай моих ошибок 🙂
Я решил эту ошибку, я добавлял разрешения в тег приложения по ошибке. Я выставлял снаружи, и все работает нормально. Надеюсь, это поможет кому-то.
У меня также была эта проблема. было странно, что он работал на моем эмуляторе леденец, но не на моем реальном устройстве kitkat.
Android Studio теперь заставит вас написать верхний регистр разрешения, и в этом проблема.
Добавить
Над вкладкой приложения она будет работать.
Положите это разрешение вне
желательно перед тегом, я попробовал его, и он работает для меня.
Напишите свое разрешение перед тегом приложения, как указано ниже.
если это адрес IPv6, посмотрите на это: https://code.google.com/p/android/issues/detail?id=33046
Похоже, в Android появилась ошибка, которая была исправлена в 4.3 (?).
Как сказал Том. Когда вы начнете с капитала A
автозаполнение завершит его.
ANDROID.PERMISSION.INTERNET
Когда вы начнете вводить текст с a
автозаполнения, оно будет завершено как
android.permission.INTERNET
Второй – правильный.
Ну, это очень запутанная ошибка. Могло быть много причин:
- Вы не упоминаете разрешения в правильном месте. Как прямо над приложением.
- Вы не используете маленькие буквы.
- В некоторых случаях вам также нужно добавить разрешение на использование сети.
- Один из которых был моим случаем, есть несколько пустых строк в манифестных строках. Например, может быть пустая строка между тегом разрешения и строкой приложения. Удалите их, и все готово. Надеюсь, это поможет
удалите это в файле манифеста
xmlns:tools="http://schemas.android.com/tools"