SecurityException:权限被拒绝(缺lessINTERNET权限?)
这个错误真的很奇怪,我不知道如何重现它,以及如何修复它,因为我做了很多search,但没有什么用处。
这里是堆栈跟踪:
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)。 我不知道设备是根植的还是什么(目前我看不到这个信息)
注:我在2013年6月写了这个答案,所以它现在有点过时了。 从那时起,有些事情在Android平台上发生了变化,现在也使得整个问题变得越来越不合时宜。 不过,我认为这篇文章仍然值得一读,作为一般问题分析的例子有用。
你得到的exception( SecurityException: Permission denied (missing INTERNET permission?)
),清楚地表明你不被允许进行networking连接。 这是相当不争的事实。 但是,这怎么发生呢? 通常这是由于在AndroidManifest.xml
文件中缺less<uses-permission android:name="android.permission.INTERNET" />
条目,或者由于安装时没有在运行时授予Internet权限,在Android框架,导致您的应用程序成功安装,但没有预期的权限授予。
我的清单是正确的,那么这怎么发生呢?
理论上,在Manifest中uses-permission
存在完全符合要求,从开发者的angular度来看,所有这些都需要做到能够进行联网。 而且,由于在安装过程中向用户显示权限,因此您的应用程序结束安装在用户设备上的事实意味着他/她授予了您所要求的内容(否则安装将被取消),因此假设如果您的代码被执行,则所有请求的权限授予有效。 一旦被授予,用户不能完全卸载应用程序的权限,因为标准的Android框架(从AOSP)目前没有提供这样的function。
但是,如果您也不介意在根设备上运行应用程序,情况就会变得更加棘手。 Google Play中提供了可供用户安装的工具,用于控制在运行时授予已安装应用程序的权限 – 例如: 权限被拒绝等。 CyanogenMod ,供应商品牌(如LG的)或其他自定义ROM ,也可以使用各种types的“隐私pipe理器”或类似的工具。
因此,如果应用程序被阻塞,基本上被用户阻止,如果是这样的话,在这种情况下,用户问题确实更多(或者他/她不明白某些选项/工具真正做了什么,结果会是什么)比你的,因为标准的SDK(和大多数应用程序都是用这个SDK来编写的)根本就不会这么做。 所以我强烈怀疑这个问题发生在“标准”,与股票(或三星,macros达电,索尼等厂商像ROM)没有根源的设备。
我不想崩溃…
正确实施权限pipe理和/或阻止必须处理这样一个事实,即大多数应用程序可能无法准备好访问某些function的情况,因为这是应用程序在安装时使用清单来请求访问的一种矛盾。 进行正确的访问控制应该使所有的事情都像以前一样工作,但是将function的可用性限制在正常活动的范围之内 。 例如,当某些function被授予(即GPS,互联网接入)时,它可以从应用/用户的angular度来提供,但不提供真实的数据 – 即GPS可以始终不返回任何协调,如当你在室内或没有“修复”。 互联网访问像以前一样被授予,但由于没有数据覆盖,您可能无法成功连接。 这种情况应该是可以预料到的,并且已经被应用程序处理了,因为这在正常的每天使用过程中可能会发生,因此在这种情况下的任何崩溃应该被认为是应用程序错误。
我们缺乏太多关于发生这个问题的环境的信息来诊断没有猜测的问题,但作为一种解决scheme,你可能会考虑使用setDefaultUncaughtExceptionHandler()来捕获将来的这种意外的exception,也就是简单地显示用户的详细信息你的应用程序需要而不是只是崩溃。 请注意,使用这种方法很可能会与像Crittercism,ACRA和其他工具相冲突,所以如果使用这些工具,请小心。
笔记
请注意, android.permission.INTERNET
不是唯一的networking相关权限,您可能需要在清单中声明,以尝试成功进行联网。 获得INTERNET
许可只允许应用程序打开networking套接字(这是进行任何networking数据传输的基本要求)。 但是,如果您的networking堆栈/库也希望获取关于networking的信息,那么您的Manifest中也需要android.permission.ACCESS_NETWORK_STATE
(这是HttpUrlConnection客户端所要求的)( 请参阅教程 )。
附录(2015-07-16)
请注意,Android 6(aka Marshmallow)引入了全新的权限pipe理机制,称为运行时权限 。 它使用户可以更好地控制授予的权限(也允许select性授予),也可以让一个已经授予权限而无需删除应用程序的权限:
这引入了一个新的权限模型,用户现在可以在运行时直接pipe理应用程序权限。 该模型为用户提供了改进的可视性和对权限的控制,同时简化了应用程序开发人员的安装和自动更新stream程。 用户可以为已安装的应用单独授予或撤销权限。
有关详细信息,请参阅行为更改说明页面,并确保您的应用在新系统上也能正常运行。 当您的项目设置targetSdk
至less为23
时,这一点尤为重要,因为您必须支持新的权限模型( 详细文档 )。 如果您还没有准备好,请确保您将targetSdk
保持在最多22
因为这可以确保即使您的应用安装后,新的Android也会使用旧的权限系统。
Android Studio 1.3b1(不知道其他版本)自动完成我的互联网许可给ANDROID.PERMISSION.INTERNET
。 将其更改为android.permission.INTERNET
修复了这个问题。
添加到清单文件的行:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
它为我修好了。
我解决了这个错误,我错误地在Application标签里添加了权限。 我放在外面,它工作正常。 希望它有助于某人。
确保你添加的地方
<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"/>
不要让我的错误:)
我也有这个问题。 奇怪的是它在我的棒棒糖模拟器上工作,而不是在我的实际kitkat设备上。
Android Studio现在将强制你写权限的大写,这就是问题所在。
加
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
在应用程序选项卡上方,它将起作用。
把这些权限放在标签之前的<application>
标签之外,我试了一下,它对我很有用。
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
如果是IPv6地址,请查看: https : //code.google.com/p/android/issues/detail?id = 33046
看起来有一个在4.3(?)固定的Android错误。
就像汤姆提到的一样。 当你用大写字母A
开头的时候,自动完成将会完成它。
ANDROID.PERMISSION.INTERNET
当你开始用自动完成input时,将完成它
android.permission.INTERNET
第二个是正确的。
在应用标签之前写下您的许可,如下所示。
<?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">
那么这是一个非常混乱的错误。 可能有很多原因:
- 你没有提到正确的地方的权限。 就像上面的应用程序。
- 你没有使用小写字母。
- 在某些情况下,您还必须添加networking状态权限。
- 一个是我的情况,在清单行中有一些空行。 就像权限标签和应用程序行之间可能有空行一样。 删除它们,你就完成了。 希望它会有所帮助
在清单文件中删除这个
xmlns:tools="http://schemas.android.com/tools"