安全异常:权限被拒绝(缺少INTERNET权限?)

112

这个错误非常奇怪,我不知道如何复现它,也不知道如何修复它,因为我做了很多搜索,但没有任何有用的信息。

下面是堆栈跟踪:

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权限,因为这个应用已经上市两年了 :P

我还注意到(来自Crittercism)所有的错误都来自Android 4.1.x版本(JB)。 我不知道设备是否已被root,也不能看到这些信息(暂时无法获取)。


主机名是否已更改(由于此错误消息):未与主机名关联的地址。 - Opiatefuchs
你尝试过不同版本的设备了吗?还是每个版本都有这个问题? - Pankaj Kumar
1
请添加以下内容: <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>在<Application>标签之外,请重新构建您的项目并运行。这对我有效。 - Azahar
顺便提一下,顺序很重要。https://dev59.com/oF8e5IYBdhLWcg3w_-r0 - Nabin
@SteErMi,你解决了这个问题吗?我也遇到了同样的情况。 - Ravind Maurya
14个回答

131

注意:本回答是在2013年6月撰写的,因此现在有些过时了。自从版本6(Marshmallow,于2015年末发布)以来,Android平台发生了许多变化,使整个问题更加/不那么过时。然而,我认为这篇文章仍然值得阅读,因为它是一个通用的问题分析方法示例。


您遇到的异常(SecurityException:Permission denied(missing INTERNET permission?))明确表示您不被允许进行网络操作。这是一个非常无可争议的事实。但是,为什么会发生这种情况呢?通常是由于在您的AndroidManifest.xml文件中缺少<uses-permission android:name="android.permission.INTERNET" />条目或者因为在安装时授予了Internet权限。

我的清单文件是正确的,那么这怎么可能发生?

理论上,清单文件中存在uses-permission完全满足要求,并且从开发人员的角度来看,这就是需要完成的所有工作,以便能够进行网络操作。此外,由于权限在安装过程中向用户显示,您的应用程序已经安装在用户设备上,这意味着他/她授予了您所请求的权限(否则将取消安装),因此假设如果您的代码执行,则所有请求的权限都被授予是有效的。一旦授予,用户无法通过标准的Android框架(来自AOSP)撤销权限,除非完全卸载应用程序,因为目前没有提供此功能。

但如果您不介意您的应用程序也在已rooted的设备上运行,那么情况就变得更加棘手。Google Play中有一些工具可供用户安装,以控制已安装应用程序在运行时所授予的权限,例如:Permissions Denied和其他工具。这也可以通过CyanogenMod、厂商品牌(如LG)或其他自定义ROM来完成,这些ROM配备了各种类型的“隐私管理器”或类似工具。
如果应用程序被阻止,那么它基本上是被用户有意地屏蔽了,如果是这样,那么这实际上更多是用户的问题(或者他/她不理解某些选项/工具的真正作用及其后果),而不是你的问题,因为标准SDK(大多数应用程序都是以该SDK为基础编写的)并不会表现出这种行为。因此,我强烈怀疑在“标准”的非root设备上使用原生(或类似三星、HTC、索尼等厂商)ROM时会出现这个问题。 我不想崩溃... 适当实现的权限管理和/或阻止必须处理这样一个事实:大多数应用程序可能没有准备好在访问某些功能被授权但同时不可访问的情况下使用,因为这是一种矛盾的情况,应用程序使用清单在安装时请求访问。正确执行的访问控制应使所有事物像以前一样工作,并仍然使用特定于特定功能预期行为范围内的技术限制可用性。例如,当授予某些权限(例如GPS、Internet访问)时,该功能可以从应用程序/用户角度提供(例如,您可以打开GPS或尝试连接),修改后的实现可以不提供任何真实数据 - 例如,GPS始终可以返回无坐标,就像在室内或没有卫星“修复”时一样。Internet访问可以像以前一样被授予,但由于没有数据覆盖或路由,您无法进行成功连接。在正常使用中也应该预期出现这种情况,因此应用程序已经处理了这个问题。由于这种情况可能在正常的日常使用中发生,因此在这种情况下的任何崩溃很可能与应用程序错误相关。
我们缺乏关于出现问题的环境的太多信息,无法在不猜测的情况下诊断问题,但作为一种解决方案,您可以考虑使用setDefaultUncaughtExceptionHandler()来捕获未预期的异常,并简单地向用户显示应用程序需要哪些权限的详细信息,而不仅仅是崩溃。请注意,使用此功能很可能会与Crittercism、ACRA等工具发生冲突,因此如果您使用其中任何一个,请小心。

请注意,android.permission.INTERNET不是您可能需要在清单中声明的唯一与网络相关的权限,以成功进行网络操作。授予INTERNET权限仅允许应用程序打开网络套接字(这基本上是进行任何网络数据传输的基本要求)。但是,如果您的网络堆栈/库也想获取有关网络的信息,则还需要在清单中声明android.permission.ACCESS_NETWORK_STATE(例如,HttpUrlConnection客户端(查看教程)所需的权限)。

附录(2015-07-16)

请注意,Android 6(又名Marshmallow)引入了全新的权限管理机制,称为运行时权限。它使用户更加控制哪些权限被授予(还允许选择性授权),或者让用户撤销已经授予的权限而无需卸载应用程序:

此[...]引入了一种新的权限模型,其中用户现在可以直接在运行时管理应用程序权限。该模型为用户提供了更好的权限可见性和控制,同时简化了应用程序开发人员的安装和自动更新过程。用户可以单独为已安装的应用程序授予或撤销权限。

但是,这些更改不会影响INTERNETACCESS_NETWORK_STATE权限,这些权限被视为“正常”权限。用户不需要明确授予这些权限。

请参考behavior changes description页面获取详细信息并确保您的应用程序在更新的系统上也能正确运行。当您的项目将targetSdk设置为至少23时,这尤其重要,因为那时你必须支持新的权限模型(detailed documentation)。如果您还没有准备好,请确保将targetSdk保持在最多22,这样即使安装了新版Android,您的应用程序仍将使用旧的权限系统。

2
点赞此答案以撤销他人的踩。起初我认为你确实没有阅读完整个问题,只是想要快速回答(顺便说一句,你的答案起初确实太简短了;-)),但我认为关于用户(在root设备上)能够挫败你的权限请求的评论是一个好建议。 - baske
如果这是来自已获取 root 权限的用户正在移除权限,我有两个问题:1)如何知道我是否没有该权限?2)如何再次请求它?(仍然不确定我们是否在谈论此类问题) - StErMi
您不能再次请求它,因为此权限在运行时未被授予。请参见编辑后的答案以获取可能的“解决方案”。 - Marcin Orlowski
1
我也是:我本来想降级,但答案的第二部分似乎值得一读 :) 你应该删除答案的前几行,因为StErMi明确表明他已经设置了INTERNET权限。 - Thierry
你还需要添加 <uses-permission android:name="android.permission.INTERNET" />。 - real 19

62
请确保您添加的位置

正确无误。
<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"/>

不要重蹈我的覆辙 :)

34

Android Studio 1.3b1(不确定其他版本)将我的互联网权限自动完成为ANDROID.PERMISSION.INTERNET。 将其更改为android.permission.INTERNET解决了问题。


此问题现在已在Android Studio 1.4 RC 1中修复(目前在Canary频道中)。 - Tom
我也遇到了大小写问题。在我的清单文件中,android.permission.INTERNET 应该是 android.permission.internet。 - Meenohara

32
将以下行添加到清单文件中:

Add to manifest file the line:

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

对我来说,它解决了问题。


21

请按照以下方式在申请标签之前书写您的权限。

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

这实际上是唯一帮助我的事情 :( 一点也不直观。 - Ivan Perez

20

我解决了这个错误,我的问题在于错误地将许可权限添加到了应用程序标记内部。我将其放在外面,现在它正常运行。希望对某些人有所帮助。


17

我也遇到了这个问题。在我的棒棒糖模拟器上可以运行,但在我的实际奇巧卡设备上却不行。

Android Studio现在会强制你写权限大写,这就是问题所在。

添加

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

在应用程序选项卡上方,它将起作用。


这是简单而正确的答案。应该放在最上面! - Kostanos

4
把这些权限放在 <application> 标签之外,最好是在该标签前面,我尝试过这样做,对我有效。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

2

2
我花了几个小时来寻找解决这个问题的方法,但是回答中的解决方案都没有奏效。后来我发现,在自动完成时,我不小心在 android.permission.INTERNET" 之间添加了一个空格。"最初的回答"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接