SecurityException: permiso denegado (¿falta el permiso de INTERNET?)

este error es realmente realmente extraño y no sé cómo reproducirlo y cómo solucionarlo porque hice muchas búsquedas pero nada fue útil.

Aquí está la 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.(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) 

Aquí está mi AndroidManifest.xml

           

Por favor, no se moleste en preguntarme si tengo el permiso correcto de INTERNET en mi manifiesto porque esta aplicación está en el mercado desde hace 2 años: P

También noté que (de Crittercism) todos los errores vienen de la versión de Android 4.1.x (JB). No sé si el dispositivo está rooteado o qué (no puedo ver esta información por el momento)

NOTA: escribí esta respuesta en junio de 2013, por lo que ahora está un poco anticuada. Algunas cosas han cambiado en Android desde la versión 6 (Marshmallow) de la plataforma desde entonces, lo que hace que todo el problema sea más o menos obsoleto hoy en día. Sin embargo, creo que todavía vale la pena leer esta publicación como un ejemplo general de análisis de problemas, por lo que espero que todavía pueda encontrarlo educativo.


La excepción que recibe ( SecurityException: Permission denied (missing INTERNET permission?) ), Indica claramente que no puede hacer networking. Es un hecho bastante indiscutible. Pero, ¿cómo puede suceder esto? Por lo general, es debido a la falta de entrada en su archivo AndroidManifest.xml o, como se concede permiso de internet en la instalación no en tiempo de ejecución, por un error de larga duración, error en el marco de Android que hace que su aplicación se instale correctamente, pero sin la autorización esperada.

Mi Manifiesto es correcto, entonces, ¿cómo puede suceder esto?

En teoría, la presencia de uses-permission en Manifest cumple perfectamente el requisito y desde el punto de vista del desarrollador es todo lo que se necesita hacer para poder hacer redes. Además, dado que los permisos se muestran al usuario durante la instalación, el hecho de que tu aplicación finalizó instalada en el dispositivo del usuario significa que otorgó lo que pediste (de lo contrario la instalación se cancela), por lo que se supone que si se ejecuta tu código, todos los permisos solicitados concedido es válido. Y una vez que se concede, el usuario no puede revocar el permiso de otra manera que no sea desinstalar completamente la aplicación, ya que el marco estándar de Android (de AOSP) no ofrece esa función en este momento.

Pero las cosas se vuelven más complicadas si no te importa que tu aplicación también se ejecute en dispositivos rooteados . Hay herramientas disponibles en Google Play que sus usuarios pueden instalar para controlar los permisos otorgados a las aplicaciones instaladas en tiempo de ejecución , por ejemplo: Permisos denegados y otros. Esto también se puede hacer con CyanogenMod , marca de proveedor (es decir, LG) u otra ROM personalizada , que ofrece varios tipos de “administradores de privacidad” o herramientas similares.

Entonces, si la aplicación está bloqueada de cualquier manera, básicamente está bloqueada intencionalmente por el usuario y, si es así, en realidad es más un problema para el usuario (o no entiende qué hacen ciertas opciones / herramientas y cuáles serían las consecuencias) que el tuyo, porque SDK estándar (y la mayoría de las aplicaciones están escritas con ese SDK en mente) simplemente no se comporta de esa manera. Por lo tanto , dudo mucho de que este problema ocurra en un dispositivo “estándar” no rooteado con stock (o un proveedor como Samsung, HTC, Sony, etc.) ROM.

No quiero estrellarme …

La gestión de permisos correctamente implementada y el locking de / org tienen que ver con el hecho de que la mayoría de las aplicaciones pueden no estar preparadas para situaciones en las que el acceso a ciertas características está garantizado y no es accesible al mismo tiempo, ya que esto es una contradicción solicitar acceso en el momento de la instalación. El control de acceso hecho correctamente debe hacer que todo funcione como hasta ahora, y aún limitar la usabilidad usando técnicas en el scope del comportamiento esperado de la característica. Por ejemplo, cuando se concede cierto permiso (es decir, GPS, acceso a Internet) dicha función puede estar disponible desde la perspectiva de la aplicación / usuario (es decir, puede activar el GPS o intentar conectarse), la implementación alterada puede proporcionar datos reales. es decir, el GPS siempre puede devolver coordenadas, como cuando está en el interior o no tiene “arreglo” de satélite. El acceso a Internet puede otorgarse como antes, pero no puede hacer una conexión exitosa ya que no hay cobertura de datos o enrutamiento. Esos escenarios también deberían esperarse en el uso normal, por lo tanto, deberían ser manejados por las aplicaciones. Como esto simplemente puede suceder durante el uso diario normal, cualquier locking en dicha situación debería estar relacionado con errores de la aplicación.

Carecemos de demasiada información sobre el entorno en el que se produce este problema para diagnosticar el problema, pero como tipo de solución, puede considerar el uso de setDefaultUncaughtExceptionHandler () para detectar tales excepciones inesperadas en el futuro y simplemente mostrar información detallada al usuario con qué permiso su aplicación necesita en lugar de simplemente estrellarse. Tenga en cuenta que usar esto probablemente entrará en conflicto con herramientas como Crittercism, ACRA y otras, así que tenga cuidado si usa cualquiera de estas.

Notas

Tenga en cuenta que android.permission.INTERNET no es el único permiso relacionado con la red que puede necesitar declarar en manifiesto para intentar establecer redes de manera exitosa. Tener permiso de INTERNET concedido simplemente permite que las aplicaciones abran conexiones de red (que es básicamente un requisito fundamental para realizar cualquier transferencia de datos de red). Pero en caso de que su stack / biblioteca de red también desee obtener información acerca de las redes, entonces también necesitará android.permission.ACCESS_NETWORK_STATE en su Manifiesto (que es requerido por el cliente HttpUrlConnection ( vea el tutorial ).


Adición (2015-07-16)

Tenga en cuenta que Android 6 (también conocido como Marshmallow) introdujo un mecanismo de administración de permisos completamente nuevo llamado Runtime Permissions . Le da al usuario más control sobre qué permisos se otorgan (también permite subvención selectiva) o permite revocar permisos ya otorgados sin necesidad de eliminar la aplicación:

Esto […] introduce un nuevo modelo de permisos, donde los usuarios ahora pueden administrar directamente los permisos de la aplicación en tiempo de ejecución. Este modelo brinda a los usuarios una mejor visibilidad y control sobre los permisos, a la vez que agiliza la instalación y los procesos de actualización automática para los desarrolladores de aplicaciones. Los usuarios pueden otorgar o revocar permisos de forma individual para las aplicaciones instaladas.

Sin embargo, los cambios no afectan los permisos INTERNET o ACCESS_NETWORK_STATE , que se consideran permisos “Normal”. El usuario no necesita otorgar explícitamente estos permisos.

Consulte la página de descripción de cambios de conducta para obtener más información y asegúrese de que su aplicación también se comporte correctamente en los sistemas más nuevos. Es especialmente importante cuando su proyecto establece targetSdk en al menos 23 ya que debe admitir nuevos modelos de permisos ( documentación detallada ). Si no está listo, asegúrese de mantener targetSdk en un máximo de 22 ya que esto asegura que incluso Android nuevo usará el antiguo sistema de permisos cuando su aplicación esté instalada.

Android Studio 1.3b1 (no estoy seguro acerca de otras versiones) autocompletó mi permiso de internet para ANDROID.PERMISSION.INTERNET . Cambiarlo a android.permission.INTERNET solucionó el problema.

Agregar al archivo de manifiesto la línea:

  

Lo arregló para mí.

Asegúrese de que el lugar donde está agregando

  

es correcto.

Deberías escribirlo así en AndroidManifest.xml:

   

No cometas errores 🙂

Resolví este error, estaba agregando permisos dentro de la etiqueta de la aplicación por error. Salí afuera y funciona bien. Espero que ayude a alguien.

Yo también tuve este problema. era extraño que funcionara en mi emulador de piruletas, pero no en mi dispositivo real de kitkat.

Android Studio ahora te obligará a escribir la mayúscula del permiso, y ese es el problema.

Añadir

   

Por encima de la pestaña de la aplicación y funcionará.

Ponga estos permisos fuera de la etiqueta preferiblemente antes de la etiqueta, lo intenté y me funciona.

   

Escriba su permiso antes de la etiqueta de la aplicación como se indica a continuación.

 < ?xml version="1.0" encoding="utf-8"?>    

si era una dirección IPv6, échele un vistazo a esto: https://code.google.com/p/android/issues/detail?id=33046

Parece que hubo un error en Android que se corrigió en 4.3 (?).

Tal como lo mencionó Tom. Cuando comienzas con la letra A mayúscula, la función de autocompletar lo completará como.

 ANDROID.PERMISSION.INTERNET 

Cuando comiences a escribir con a autocompletar lo completará como

 android.permission.INTERNET 

El segundo es el correcto.

Bueno, es un tipo de error muy confuso. Podría haber muchas razones:

  1. No mencionas los permisos en el lugar correcto. Al igual que la derecha de la aplicación.
  2. No estás usando letras minúsculas.
  3. En algunos casos, también debe agregar el permiso de estado de la red.
  4. Uno que era mi caso, hay algunas líneas en blanco en líneas de manifiesto. Al igual que podría haber una línea en blanco entre la etiqueta de permiso y la línea de la aplicación. Quítelos y listo. Espero que ayude

eliminar esto en su archivo de manifiesto

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