SecurityException:权限被拒绝(缺少INTERNET权限?)


92

这个错误真的很奇怪,我不知道如何重现和解决它,因为我进行了很多搜索,但没有用。

这是堆栈跟踪:

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)。我不知道设备是否已植根或什么(暂时无法看到此信息)


主机名是否可能已更改(由于此错误消息):没有与主机名关联的地址
Opiatefuchs

您是否尝试过使用其他版本的设备?或获取每个版本?
Pankaj Kumar

1
请在<Application>标签之外添加<uses-permission android:name =“ android.permission.INTERNET” /> <uses-permission android:name =“ android.permission.ACCESS_NETWORK_STATE” />请重新构建项目并运行。它的工作对我来说
橙花

顺便说一下,顺序很重要,stackoverflow.com
questions / 25135595 /…

@SteErMi您是否已解决此问题,我正面临相同的情况
Ravind Maurya

Answers:


118

注意:我在2013年6月写了这个答案,所以现在有点过时了。自版本6(棉花糖)起,Android平台发生了许多变化,使得整个问题如今变得过时或过时。但是,我认为这篇文章仍然可以作为一般问题分析方法的例子而值得一读。


收到的异常(SecurityException: Permission denied (missing INTERNET permission?))清楚地表明不允许您进行联网。这是不争的事实。但是怎么会这样呢?通常,这是由于文件中缺少<uses-permission android:name="android.permission.INTERNET" />条目所致,或者是由于AndroidManifest.xml在安装时(而不是在运行时)授予了Internet权限,而这是由于Android框架中长期存在的,遗漏的bug(导致您的应用程序成功安装而未获得预期的许可)导致的。

我的清单是正确的,那怎么会发生呢?

从理论上讲,uses-permissionManifest中的存在可以完全满足要求,并且从开发人员的角度来看,这是完成网络连接所需要做的全部工作。此外,由于权限是在安装过程中显示给用户的,因此您的应用已终止安装在用户设备上的事实表明,他(她)已同意了您所要求的内容(否则安装被取消),因此,假设如果执行了您的代码,则所有请求的权限都是授予有效。而且一旦获得授权,用户就无法撤消许可,只能完全卸载该应用程序,因为标准的Android框架(来自AOSP)目前不提供此类功能。

但是,如果您还不介意应用程序也已在有设备上运行,那么事情将变得更加棘手。Google Play中提供了一些工具,您的用户可以安装这些工具来控制在运行时授予已安装应用的权限,例如:权限被拒绝等。这也可以使用具有各种类型的“隐私管理器”或类似工具的CyanogenMod,供应商品牌(即LG的)或其他自定义ROM来完成。

因此,如果以任何一种方式阻止了应用,则基本上是用户故意阻止了它,如果是这样,那么在这种情况下,这实际上是更多的用户问题(或他/她不了解某些选项/工具的实际作用以及后果)而不是您的标准,因为标准SDK(大多数应用程序都是在考虑该SDK的情况下编写的)根本就不会那样。因此,我强烈怀疑此问题会出现在“标准”,无根设备的ROM(或类似Samsung,HTC,Sony等供应商)的ROM中。

我不想崩溃...

正确实施的权限管理和//组织阻止必须处理以下事实:大多数应用可能未准备好同时授予某些功能但又无法同时访问某些功能的情况,因为这是应用使用明显体现为冲突的一种矛盾。在安装时请求访问权限。正确完成访问控制后,必须使所有事物都像以前一样工作,并且仍然在功能预期行为范围内使用技术限制可用性。例如,当授予某些权限(即GPS,Internet访问)时,可以从应用程序/用户的角度使此功能可用(即,您可以打开GPS或尝试连接),但更改后的实现不能提供真实数据-即GPS始终无法返回坐标,例如当您在室内或没有卫星“固定”位置时。可以像以前一样授予Internet访问权限,但由于没有数据覆盖或路由,因此无法建立成功的连接。在正常使用中也应预料到此类情况,因此应已由应用处理。由于这种情况仅在正常的日常使用中会发生,因此这种情况下的任何崩溃都极有可能与应用程序错误有关。

我们缺少有关此问题发生的环境的太多信息,无法诊断问题,但是作为一种解决方案,您可能会考虑在将来使用setDefaultUncaughtExceptionHandler()来捕获此类意外异常,即仅向用户显示详细信息什么权限您的应用程序需要的不仅仅是崩溃。请注意,使用此功能很可能会与Crittercism,ACRA等工具冲突,因此,如果使用任何一种,请务必小心。

笔记

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


附录(2015-07-16)

请注意,Android 6(又名棉花糖)引入了全新的权限管理机制,称为Runtime Permissions。它使用户可以更好地控制授予的权限(也允许选择性授予),或者让一个撤销已授予的权限而无需删除应用程序:

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

但是,所做的更改不会影响INTERNETACCESS_NETWORK_STATE授予被视为“普通”权限的权限。用户不需要显式授予这些权限。

有关详细信息,请参见行为更改描述页面,并确保您的应用在新系统上也能正确运行。当您的项目targetSdk至少设置为时,这一点尤其重要,23因为您必须支持新的权限模型(详细文档)。如果您还没有准备好,请确保targetSdk最多使用,22因为这可以确保即使新的Android在安装应用程序时也会使用旧的权限系统。


显然,这意味着他不被允许进行联网。它不是在Manifest中请求的,就是不是由平台授予的(可以在有根设备上完成)。
Marcin Orlowski

2
对此答案进行了投票,以撤消其他人的反对。起初我以为您确实没有读完整个问题,只是想做得很快(顺便说一句,您的回答起初确实太短了;-)),但是我认为关于用户的评论(在有根设备上)能够阻止您的许可请求是一个很好的选择。
巴斯克

嗯,如果这是来自正在删除权限的root用户,我有2个问题:1)如何知道我是否没有该权限?2)如何再次询问?(仍然,我不知道我们是否在谈论这种问题)
StErMi 2013年

您不能再次要求它,因为在运行时未授予此权限。参见可能的“解决方案”的已编辑答案
Marcin Orlowski 2013年

1
同样在这里:我将要降级,但是答案的第二部分似乎是值得阅读的部分:)您应该删除答案的第一行,因为StErMi清楚地表明他已经设置了INTERNET许可。
蒂埃里(Thierry)2013年

43

确保您添加的地方

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

不要犯我的错误:)


33

Android Studio 1.3b1(不确定其他版本)自动完成了对的互联网许可ANDROID.PERMISSION.INTERNET。对其进行更改以android.permission.INTERNET解决此问题。


现在应该在Android Studio 1.4 RC 1中修复此问题(当前在Canary频道中)。
汤姆(Tom)

30

在清单文件中添加以下行:

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

它为我解决了。


20

我解决了这个错误,我是在Application标签内错误地添加了权限。我放在外面,它工作正常。希望它对某人有帮助。


16

我也有这个问题。奇怪的是,它只能在我的棒棒糖模拟器上运行,而不能在实际的kitkat设备上运行。

Android Studio现在将强制您将权限写为大写,这就是问题所在。

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

在应用程序标签上方,它将起作用。


这是简单正确的答案。并且应该是最重要的一个!
Kostanos

13

如下所示,在您的应用程序标签前写您的许可。

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

这实际上是帮助我的唯一的事:(根本不直观。
伊万·佩雷斯

4

将这些权限放在<application>标签之外的标签之前,我尝试过,它对我有用。

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


2

就像汤姆提到的那样。当您以大写A字母开头时,自动完成功能将完成它。

ANDROID.PERMISSION.INTERNET

当您开始输入时,a自动完成功能将完成

android.permission.INTERNET

第二个是正确的。


2

我花了数小时来寻找解决此问题的方法,但答案中的任何解决方法均无效。然后我发现我在android.permission.INTERNET和之间的自动完成过程中不小心添加了一个空格"


0

好吧,这是一个非常令人困惑的错误。可能有很多原因:

  1. 您没有在正确的位置提及权限。就像上面的应用程序一样。
  2. 您没有使用小写字母。
  3. 在某些情况下,您还必须添加“网络状态”权限。
  4. 我的情况之一就是清单行中有一些空白行。就像在权限标签和应用程序行之间可能有空白行。删除它们,您就完成了。希望对你有帮助

-7

在清单文件中删除它

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

问题中的清单文件(AndroidManifest.xml)中没有此类代码。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.